Upload-Labs通关手册:Pass-01~20

大家在看Upload-Labs通关手册前,必看文件上传漏洞平台:Upload-Labs(环境搭建)此文章!否则,你中途可能会出现很多小BUG,或者说突破不了,效果达不到,不够理想。

 

通关任务

上传一个webshell到服务器。

上传图片马到服务器。

 

Pass-01:JS验证绕过

本pass在客户端使用js对不合法图片进行检查!

 

示例:

这种直接禁用JS,或者 Burpsuit改包等等都可以。我这直接就用了火狐的“NoScript插件”了。

具体请参考:文件上传漏洞“JS本地验证”绕过

 

Pass-02:MIME验证绕过

本pass在服务端对数据包的MIME进行检查!

 

示例:

我这直接用Burpsuit抓包改为:Content-Type: image/jpeg

具体请参考:文件上传漏洞“MIME验证”绕过

Content-Type: image/jpeg

 

Pass-03:黑名单绕过

本pass禁止上传.asp|.aspx|.php|.jsp后缀文件!

 

示例:

此关做了黑名单验证,不允许上传.asp、.aspx、.php、.jsp后缀文件,但是,可以上传其它任意后缀文件。我们可以通过上传 .php、.phtml、.phps、.php5、.pht等类似的格式来绕过。

 

我这里是用Burpsuit抓包修改 filename="phpinfo.php5"filename="phpinfo.php"

 

 

注意:

这样虽然我们上传成功了,但是 phpinfo.php5 却不能解析,要正常解析还需要满足以下条件任意一种:

1、Apache的 httpd.conf 中有如下配置代码:

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

2、上传 .htaccess 伪静态文件,内容如下:

用伪静态需要保证:①mod_rewrite模块开启;②目录设置是AllowOverride All;

<FilesMatch "phpinfo.php5">
  SetHandler application/x-httpd-php
</FilesMatch>

 

Pass-04:.htaccess绕过

本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf后缀文件!

 

示例:

虽然说禁止上传了很多的后缀文件,但是:没有过滤 .htaccess 等类似的文件,直接用 Pass-03上面的方法即可。

 

1、先上传一个 .htaccess 文件,内容如下:

SetHandler application/x-httpd-php

此伪静态规则的意思就是:所有文件都会解析为php;

 

2、再上传一个PHP木马文件,并改包,我直接改为 filename="phpinfo.php999",这就直接绕过。当然,也可以上传一个图马文件,都一样。

 

Pass-05:大小写绕过

本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后缀文件!

 

示例:

跟上面差不多,也是黑名单,加上了禁止上传 .htaccess文件,但是,没有将后缀进行大小写统一,于是可以通过大小写绕过。

我直接改为 filename="phpinfo.PhP"

注意:在Linux没有特殊配置的情况下,这种情况只有windows可以,因为windows会忽略大小写。

 filename="phpinfo.PhP

 

Pass-06:空格绕过

本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf后缀文件!

 

示例:

Win下xx.jpg[空格]xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点。此处会删除末尾的点,但是没有去掉末尾的空格,因此上传一个.php空格文件即可。

我只需要修改为:filename="phpinfo.php "

filename="phpinfo.php "

 

Pass-07:点绕过

本pass禁止上传所有可以解析的后缀!

 

示例:

还是黑名单,但是没有对后缀名进行去”.”的处理,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过。

我只需要修改为:filename="phpinfo.php."

filename="phpinfo.php."

 

Pass-08:::$DATA绕过

本pass禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess后缀文件!

 

NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。

 

示例:

还是黑名单,但是没有对后缀名进行去”::$DATA”处理,利用windows特性,可在后缀名中加” ::$DATA”绕过。

我只需要修改为: filename="phpinfo.php::$DATA"

filename="phpinfo.php::$DATA"

 

Pass-09:.空格.绕过

本pass只允许上传.jpg|.png|.gif后缀的文件!

 

示例:

move_upload_file的文件名直接为用户上传的文件名,我们可控。且会删除文件名末尾的点,因此我们可以结合Pass-7用 .php.空格. 绕过。

windows会忽略文件末尾的.和空格。我可以直接修改为: filename="phpinfo.php. ."

 filename="phpinfo.php. ."

 

Pass-10:双写绕过

本pass会从文件名中去除.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.pHp|.pHp5|.pHp4|.pHp3|.pHp2|pHp1|.Html|.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.swf|.htaccess字符!

 

示例:

这里是将敏感后缀替换为空,双写.pphphp绕过即可!我直接改为: filename="info.pphphp"

 filename="info.pphphp"

 

Pass-11:00截断 GET

本pass上传路径可控!

 

注意,此关要满足以下两个条件:

1、PHP 版本 < 5.3.4

2、php.ini 中 magic_quotes_gpc=off

 

示例:

看到是白名单判断,但是$img_path直接拼接,因此可以利用%00截断绕过。这次要改两个地方才能绕过,如下图:

可参考:文件上传漏洞“%00截断”绕过

00截断

 

Pass-12:00截断 POST

本pass上传路径可控!

 

示例:

这题跟上一题代码唯一的不同就是save_path 从 GET 变成了 POST,此时不能再直接使用 %00 截断,原因是 %00 截断在 GET 中被 url 解码之后是空字符。但是在 POST 中 %00 不会被 url 解码,所以只能通过 burpsuite 修改 hex 值为 00 进行截断,也就是在post情况下,需要先对%00进行一个url编码。

 

1、BurpSuite 抓包修改如下图:

00截断 GET

 

2、将 %00 做一个 URL decode

%00 做URL decode

 

Pass-13:图片马绕过

本pass检查图标内容开头2个字节!

 

示例:

通过读文件的前2个字节判断文件类型,因此直接上传图片马即可!

 

1、Windows制作图片马方法,直接用cmd命令:

C:\Users\fujie>cd F:\phpStudy\WWW\upload-labs
C:\Users\fujie>f:
F:\phpStudy\WWW\upload-labs>copy fujieace.jpg /b + phpinfo.php /a phpinfowebshell.jpg

Windows制作图片马方法

 

2、上传制作好的图片马;

注意:虽然这样能成功上传图片马,接下来要利用的话,还需要结合文件包含漏洞

 

3、文件包含漏洞利用;

http://192.168.1.104/upload-labs/include.php?file=./upload/4520190821222156.jpg

 

文件包含漏洞利用这里,建议大家切换成PHP高版本,我用的是PHP5.6,否则会报很多Waring。

 

Pass-14:getimagesize()突破

本pass使用getimagesize()检查是否为图片文件!

 

示例:

跟 Pass-13一样,直接上传图片马即可绕过!

 

Pass-15:exif_imagetype()突破

本pass使用exif_imagetype()检查是否为图片文件!

 

示例:

跟 Pass-13一样,直接上传图片马即可绕过!

 

Pass-16:图片二次渲染绕过

本pass重新渲染了图片!

 

示例:

判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染,由于jpg和png很麻烦,gif只需要找到渲染前后没有变化的位置,然后将php代码写进去就可以了。

具体请查看:Upload-Labs第Pass-16通关(二次渲染绕过) 详解

 

Pass-17:条件竟争绕过

需要代码审计!

 

示例:

这里先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可以通过条件竞争的方式在unlink之前,访问webshell。

具体请查看:Upload-Labs第Pass-17通关(条件竟争绕过) 详解

 

 

Pass-18:条件竟争绕过

需要代码审计!

 

本关对文件后缀名做了白名单判断,然后会 一步一步检查文件大小、文件是否存在等等,将文件上传后,对文件重新命名,同样存在条件竞争的漏洞。可以不断利用burp发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功:

 

示例:

通过查看源代码,可以得到这个一个结果:

因为move在rename之前,move操作进行了一次文件保存,然后rename进行了一次更改文件名。因此我们可以通过条件竞争来上传图片马。

具体请看Pass-17吧!都差不多,原理都是一样的。

 

Pass-19:/.绕过 与 00截断绕过

本pass的取文件名通过$_POST来获取。

 

 

示例 一:

本关考察CVE-2015-2348 move_uploaded_file() 00截断,上传webshell,同时自定义保存名称,直接保存为php是不行的。

 

通过查看源代码:发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过。

注意:前面讲过的,POST接收的时候  %00 需要URL编码,千万别忘记了。

我这为了方便给大家展示,因此就没有编码。CVE-2015-2348 move_uploaded_file() 00截断

 

 

示例 二:

move_uploaded_file会忽略掉文件末尾的 /. 。但是Pass9中的文件名是从$_FILES['upload_file']['tmp_name']中获取的,这里是用户可控的。因此构造:

文件上传漏洞 /.绕过

 

Pass-20:数组 + /.绕过

Pass-20来源于CTF,请审计代码!

 

示例:

通过查看源码可以发现:

$file_name经过reset($file) . '.' . $file[count($file) - 1];处理。

如果上传的是数组的话,会跳过$file = explode('.', strtolower($file));

 

并且后缀有白名单过滤:

$ext = end($file);
$allow_suffix = array('jpg','png','gif');

 

而最终的文件名后缀取的是$file[count($file) - 1],因此我们可以让$file为数组。

$file[0]为smi1e.php/,也就是reset($file),然后再令$file[2]为白名单中的jpg。

此时end($file)等于jpg,$file[count($file) - 1]为空。

 

$file_name = reset($file) . '.' . $file[count($file) - 1];,也就是smi1e.php/.,最终move_uploaded_file会忽略掉/.,最终上传smi1e.php

文件上传漏洞 数组 + /.绕过

 

总结:

到此为止,文件上传漏洞通送就算完成了,试想一下:如果没有源码?你能通过几关呢?如果也没有通关手册,你又通通过几关呢?

付杰
  • ¥ 79.0元
  • 市场价:99.0元
  • ¥ 68.0元
  • 市场价:168.0元
  • ¥ 298.0元
  • 市场价:498.0元
  • ¥ 49.0元
  • 市场价:199.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: