文件上传漏洞绕过手法

目录

1.文件上传原理

2.文件上传检测方法

3.后端检测绕过

3.1类型检测绕过

3.2文件头检测绕过

3.3 文件内容检测绕过

3.4黑名单检测绕过

3.4.1 对于.htaccess后缀名没有过滤绕过

3.5 白名单检测绕过

3.5.1截断

3.5.2包含漏洞

3.6 解析漏洞绕过

3.6.1apache解析漏洞

3.6.2 IIS解析漏洞

3.6.3Nginx解析漏洞

3.7条件竞争绕过

3.7waf检测绕过

前言

这是我自己结合靶场,基本上将文件上传所遇到的情况都总结了,其中各种绕过方法我也总结,希望能给各位提供帮助,真的很用心总结的,花了我一下午时间。

1.文件上传原理

有一些网站提供上传服务,比如头像的设置就是上传图片,或者上传文档,上传压缩包等等。一般网站是希望上传图片格式或者文本格式的,当如果检测手段不全面,就会导致攻击者直接上传了恶意的脚本代码,并执行了脚本代码,或者可以配合其他漏洞,上传代码文件,导致服务器被拿下。下面我们来说说文件上传的检测和绕过都有哪些。

2.文件上传检测方法

文件上传检测分为前端检测和后端检测。前端检测的绕过非常好绕过,前端检测就是在网页有一段检测代码,在你点击上传之前就会有一个检测,我们只需要将木马文件先改成正常的图片名字,然后抓包再改回来就可以了。我们需要详细说明是后端检测的绕过

3.后端检测绕过

后端检测有很多方法,有文件类型检测,文件内容检测,白名单检测, 黑名单检测下面我们一个个来看

3.1类型检测绕过

在请求包里面有一个字段叫content-type它会将文件的类型记录发送给服务器,服务器会根据它来判断上传是否是一个图片或者文档。这里我们拿靶场upload_labs第二关拿看看。首先我们上传了我们的代码文件,会提示文件类型不正确,重新上传。这时我们可以在请求包看到Content-Type: application/octet-stream,这就指明了你上传的是一个脚本文件。

 

 如果我们将该字段该为Content-Type: image/jpeg,可以看到上传成功,右击图片复制图片地址可以看到代码成功执行,通过抓包修改字段值很好绕过类型检测。

3.2文件头检测绕过

服务器会对文件头部进行简单的匹配,看你是不是上传需要额文件。我们可以通过在上传的文件前追加合法的文件头进行绕过,比如upload_labs第十三关

3.3 文件内容检测绕过

服务器对于上传文件不再进行简单的文件头匹配检测,而是通过调用比如getimagesize/imagecreatefromgif/imagecreatefrompng等函数检测文件是否为图像,需要文件内容保持相对完整,这时候我们需要制作图片木马来进行绕过就可以啦。

3.4黑名单检测绕过

黑名单检测就是我有一个名单,只要在这个名单的后缀名,就不可以上传。如果对于黑名单的名单不是非常全面或者过滤不严谨就会导致绕过。比如我们可以通过点绕过 ,空格绕过,大小写绕过或者其他后缀名绕过,有的时候代码只做了一次过滤,没有多次过滤,可以通过重叠名绕过。upload_labs第十关就是后缀名重叠民绕过

 

 (upload_labs第三关1.php1其他后缀名绕过 ,upload_labs第五关大小写绕过,upload_labs第六关空格绕过,upload_labs第七关点绕过(类似),upload_labs第八关 在文件后缀名后面加上::$$DATA绕过 不过必须是Windows 必须是php.,upload_labs第九关 a.php. .,大家可以自己去试试)

3.4.1 对于.htaccess后缀名没有过滤绕过

在黑名单检测里面单独说一下这个后缀名。可以看到.htaccess这个后缀名不是危险的脚本文件后缀名为啥需要注意,使用这个方法要注意,针对的是apache,并且mod_rewrite模块开启。AllowOverride All。原因为我们通常利用Apache的rewrite模块对URL进行重写,rewrite规则会写在 .htaccess 文件里。在 AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。当此指令设置为 All 时,所有具有 “.htaccess” 作用域的指令都允许出现在 .htaccess 文件中,大家有兴趣可以自己百度一下。具体案例看看upload_labs第四关

第一步先上传.htaccess文件 文件内容为

AddType application/x-httpd-php .png 

第二步上传1.png文件,文件内容为

<?php
Phpinfo()
?>

 ​​​​第三步访问图片地址,php代码被解析。

 除了上述方法外,还有其他方法,

1.如果当上传.htaccess文件,并且文件内容为

AddHandler php5-script php

上传的木马文件名字为1.php.png 访问图片地址,里面代码也会成功被解析

2.如果当上传.htaccess文件,并且文件内容为

<FilesMatch “ajest”>
SetHandler application/x-httpd-php
<FilesMatch>

上传的木马文件名字为ajest.png 访问图片地址,里面代码也会成功被解析

3.5 白名单检测绕过

3.5.1截断

白名单检测相对于黑名单检测难度更大,因为她就给你允许上传文件名后缀,不符合就不可以上传,这个时候我们需要其他方法来进行绕过。通过00截断来进行绕过。

在upload_labs十一关中当我们上传一个图片时候,图片名会被重命名,并且可以在请求包看到文件上传路径。可以通过通过00截断使得图片上传时候按照我们设置的文件名保持

 ​​​​​​

3.5.2包含漏洞

我们上传脚本文件最终希望能被解析,但是由于文件上传采取了白名单校验,导致我们只能上传图片格式,虽然我们可以制作图片木马上传,但是代码不会被执行只会被当作图片处理,这时候如果存在包含漏洞代码就会被解析

我在自己本地网站目录下新建一个文件int.php,内容如下:

<?php
$path=$_GET['file'];
include $path;

?>#int.php

然后新建一个1.php文件内容如下:为了模拟文件上传将1.php改为1.png,就相当我们上传一个图片木马

<?php phpinfo();?>

访问如下地址:

http://127.0.0.1/haha/int.php?file=1.png

3.6 解析漏洞绕过

解析漏洞比如有apache解析漏、IIs解析漏洞、nginx解析漏洞

3.6.1apache解析漏洞

apache解析漏洞的产生是由于运维人员在配置服务器时,为了使Apache能够解析PHP,而自己添加了一个handler,相当于自己添加一条规则,就是我的后缀名匹配不是正则匹配,是任意位置匹配。

正则匹配是一个文件最后一个后缀名是php/php1...,就把文件交给PHP处理器(php_module)来处理,处理完之后结果返回给Apache,再由Apache发送给浏览器。

任意位置匹配就是,比如:22.php.png.mp3。这个文件在大多数操作系统里面会认为它是一个MP3文件。但在Apache则可能不是这样的,它会从右向左进行识别,如果遇到不认识后缀名,就说啥玩意不认识,继续识别下一个后缀名,当遇到php会执行上面步骤。如果遇到认识后缀名就不会往后识别了。所以upload四关也可以利用1.php.xx.yy.zz 通过

3.6.2 IIS解析漏洞

IIS5.x/6.0解析漏洞

该版本存在两个解析漏洞,分别为目录解析和文件解析,大多为windows server 2003,网站比较古老,开发语句一般为asp;该解析漏洞也只能解析asp文件,而不能解析aspx文件

1.目录解析

如果目录名以".asp.asa.cer.cdx"字符串结尾,那么这个目录下所有的文件都会按照 asp 去解析。例如: “test.asp/1.jpg”就会解析asp代码。

2.文件解析

只要文件名中含有".asp;.asa;.cer;.cdx;会优先按 asp来解析 例如:“1.asp;.jpg

IIS7.0/IIS7.5解析漏洞

对任意文件名只要在URL后面追加上字符串"/任意文件名.php",就会按照 php 的方式去解析
例如,我上传一个图片木马22.png 直接访问url为 www.haha.com/upload/22.png 图片可以查看但是代码解析不出来,这时候我们只要在url后面加上www.haha.com/upload/22.png/33.php就可以执行代码。

3.6.3Nginx解析漏洞

nginx版本0.8.41~1.4.3, 1.5 <= 1.5.7 编号CVE-2013-4547。这一漏洞的原理是非法字符空格截止符(\0)会导致Nginx解析URI时的有限状态机混乱,危害是允许攻击者通过一个非编码空格绕过后缀名限制

上传一个文件名为"test.jpg "最后一个字符是空格,文件内容是

 <?php phpinfo() ?>

这是我们访问该文件会报错,因为浏览器自动将空格编码为%20,服务器中不存在文件“test.jpg%20”。通过抓包在文件名后面加上AAphp ,在hex里面将jpg后面的空格改为20(空格符号的ASCII码) ,第一个A改为00(截止符\0), 第二个A改为2e(“.”的ASCII码),这样做的目的是防止浏览器对于空格和截止符的编码。改完之后我们发送的文件名就是" test.jpg \0.php"让Nginx认为文件后缀名是php,进行解析。

3.7条件竞争绕过

二次渲染,比如一个网站需要你上传图片,上传之后会对图片进行二次操作,可以裁剪大小啊等等。那么这个里面有可能就有一个逻辑漏洞,可以利用条件竞争达到上传木马文件

upload_labs第十七关在文件已经上传到服务器的时候,在服务器对于进行第二次操作前才验证,这样我们可以通过不断发包,不断访问图片二次操作前地址,利用条件竞争,因为在打开中的文件是不可以进行再次重命名或者删除一些操作的。具体操作如下

第一步首先创建一个文件2.php,文件内容如下,当代码执行时候会在改目录下创建一个shell.php文件,文件内容是<?php @eval($_POST["test"])?>。这样等会我们就能很清楚看到2.php这个文件代码是否成功执行。

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["test"])?>');?>

第二步,上传2.php 将其请求包抓到,放到intruder模块对2.php进行不停上传。设置一下user_agent字段后面数字,这样对于请求包内容没有什么影响,还能重复发包

 第三步设置payloads,按照下面设置就可以了。

 第四步  点击开始攻击,可以看到已经开始攻击

 开始不停刷新2.phpde 地址页面,我的网站是本地搭建,刷新一会可以看到shell.php成功生成,之后可以使用蚁剑进行连接。

3.7waf检测绕过

Content_Disposition:一般可以更改

Name:表单数值,不能更改

Filename:文件名,可以更改

Content-Type:视情况更改。

1.数据溢出:使用大量的垃圾数据,这样有可能绕过安全狗

比如可以在filename前面写大量无用数据,

2.符号变异,可以切换单双引号 ,单双引号不成对,分号等等。

3.数据截断 -防匹配(; %00  换行 /)

4.多个Content-Disposition

在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过,Win2k8 + IIS7.0 + PHP

5.文件名处回车

6.删除实体里面的Conten-Type字段
第一种是删除Content整行。第二种删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php。第三种删除Content-Disposition字段里的空格

7.多个filename字段,可能waf对于filename字段只检查了一次。

8.post改为get 有些WAF的规则是:如果数据包为POST类型,则校验数据包内容。
此种情况可以上传一个POST型的数据包,抓包将POST改为GET。

猜你喜欢

转载自blog.csdn.net/dreamthe/article/details/121603278
今日推荐