一、upload-labs
upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传突破的靶场。逐步帮助大家对上传入侵有一个全面的了解。目前一共20关,每个关都包含着不同上传方式。 GitHub地址:https://github.com/c0ny1/upload-labs二、开始通关
Pass-01 JS检查
1.先新建一个PHP文件写入一句话木马,命名为test.php,直接上传
2.提示无法上传该文件类型,查看一下前端源码,可以看到是JS限制
我们可以通过修改前端源码、禁用浏览器JS、使用burpsuite改包这三种方式来绕过拦截,这里以burpsuite抓包为例
3.先将test.php改成test.php.jpg,通过burpsuite抓包之后放到重放模块,然后改包test.php.jpg改成test.php,然后放行,通过右边看到页面显示正常
4.文件上传成功,使用菜刀连接一句话木马,连接成功
Pass-02 只验证Content-typ
1.尝试使用第一关方法,直接上传test.php.jpg进行抓包改包,嘿...一样可以
2.题目说是文件类型拦截,直接上传php文件可以得到提示,那么我们删除test02.php重新操作一下
3.通过burpsuite抓包,修改Content-Type为image/jpeg(简单来说就是修改为它可放行的文件类型),然后放行数据包,同样上传成功
Pass-03 黑名单绕过
1.直接上传test03.php,黑名单不允许上传.asp,.aspx,.php,.jsp
后缀的文件
但可以上传.phtml .phps .php5 .pht
前提是apache的httpd.conf中有如下配置代码
AddType application/x-httpd-php .php .phtml .phps .php5 .pht
2.通过burpsuite抓包,将test03.php改为test03.php5,放行数据包,返回包中可以看到文件上传解析的路径
菜刀连接成功
Pass-04 .htaccess绕过
1.直接上传test04.php5,发现有黑名单限制,并且根据提示黑名单列表庞大
拒绝了几乎所有有问题的后缀名,除了.htaccess,所以我们可以编写.htaccess文件,作用:将待会上传的04.jpg解析为04.php(这次写一个phpinfo文件命名为04.jpg)
上传成功
2.访问http://127.0.0.1/upload-labs/upload/test04.jpg,解析成功
Pass-05 后缀大小写绕过
1.这一关主要是没有对后缀名的大小写进行过滤,所以我们尝试抓包命名为test05.phP进行绕过
2.访问http://127.0.0.1/upload-labs/upload/202104011727386865.phP
访问正常
Pass-06 空格绕过
尝试上传,发现大小写绕过失败,说明程序对后缀进行了大小写处理,改包将test06.php改成test06.php空格
上传成功
Pass-07 点绕过
原理与Pass-06相同,在文件名后面加一个点
上传成功
Pass-08 ::$DATA文件流特性绕
1.这关将所有可解析的后缀名进行了过滤
2.Windows文件流特性绕过,文件名改成test08.php::$DATA,上传成功后保存的文件名其实是test08.php
上传成功
Pass-09 点+空格+点绕过
原理同Pass-06,上传文件名后加上点+空格+点,改为test09.php. .
上传成功
Pass-10 双写绕过
黑名单过滤,将黑名单里的后缀名替换为空且只替换一次,因此可以用双写绕过
Pass-11 文件路径%00截断
1.$img_path是直接拼接,因此可以利用%00截断绕过,截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态
2.先上传test11.jpg,然后修改路径进行截断,注意一定要符合上面条件
php的magic_quotes_gpc为OFF状态
上传成功
Pass-12 00截断
1.本关卡与Pass-11原理相同,但不同的是ave_path参数通过POST方式传递,还是利用00截断,因为POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改
在test12.php后面改成00进行截断
上传成功
Pass-13 上传图片马
1.我们需要一张图片13.jpg和一句话木马(这里我的是info文件)写好的php文件test13.php,在电脑本地将13.jpg和test13.php放到同一目录下
然后在该目录下用cmd执行命令:copy 13.jpg/b + test13.php/a test13.jpg
新生成的test13.jpg就是我们制作好的图片马
直接上传图片马
2.直接访问图片并不能把图片当做PHP解析,因此还需要利用文件包含漏洞,根据页面提示include.php脚本在127.0.0.1/upload-labs/目录下,构造链接
127.0.0.1/upload-labs/include.php?file=upload/5020210402141517.jpg
访问成功
3.png格式图片上传方法与jpg相同
4.GIF格式可以通过添加GIF图片的文件头GIF89a,绕过GIF图片检查
Pass-14 上传图片马 getimagesize()检查
本关操作与上一关Pass-13完全相同
Pass-15 上传图片马 exif_imagetype()检查
本关操作与上一关Pass-13完全相同
Pass-16 二次渲染绕过
原理:将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。
制作方法参考链接:
https://blog.csdn.net/weixin_45519736/article/details/105775721
Pass-17 条件竞争
通过源码可以看到文件先经过保存,然后判断后缀名是否在白名单中,如果不在则删除,此时可以利用条件竞争在保存文件后删除文件前来执行php文件,可以利用burpsuite的intruder模块不断上传,然后我们不断的访问刷新该地址即可
1.先准备后门文件test17.php,用Python写一个脚本来请求文件test17.php,打开burpsuite用来重放文件test17.php
2.运行py脚本,同时开始burpsuite上传
上传成功
可以访问
Pass-18 条件竞争
本关也存在条件竞争的问题,不过这题对文件后缀名做了白名单判断,利用上传重命名竞争+Apache解析漏洞进行绕过,test18.php.7z的文件内容与上一关相同(生成一个新的文件shell2.php)
2.运行py脚本同时开始上传test18.php.7z
可能是作者大佬忘了给上传的路径加"/",所以导致上传的文件改名后都是uploadxxxxx.7z,只需在myupload.php文件中对应地方添加斜杠就行
3.等到python出现OK,停止上传,并访问shell2.php文件
访问成功
Pass-19 文件名0x00截断
move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过,方法同pass-12
通过查看源码可以发现: $file_name经过reset($file) . '.' . $file[count($file) - 1];处理 如果上传的是数组的话,会跳过$file = explode('.', strtolower($file)); 并且后缀有白名单过滤:Pass-20 数组 + /.绕过
而最终的文件名后缀取的是$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$ext = end($file);
$allow_suffix = array('jpg','png','gif');
【END】
到此为止,文件上传漏洞通关就算完成了,试想一下:如果没有源码?又能通几关?