文件上传漏洞 upload-labs

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等,文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。

一、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

Pass-20  数组 + /.绕过

通过查看源码可以发现: $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

【END】

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

你可能感兴趣的:(文件上传漏洞 upload-labs)