upload-labs通关小记 Pass11-16
"upload-labs通关小记"系列相关:
01:upload-labs通关小记 Pass1-10;
02:upload-labs通关小记 Pass11-16 含代码审计(当前文章);
03:upload-labs通关小记 Pass17-20 含代码审计
文章目录
第十一关——%00
绕过(GET)
审计代码:
我们上传有合法名称的文件,并GET提交方式中修改"save_path"的值。
在其后添加"webshell.php%00",php在解析到%00时会认为是结束标识,从而将停止对$img_path
的后续字符拼接,那么save_path的值即是$img_path
的最终值,所以我们的文件被服务端保存为"…/upload/webshell.php"。
不过此时若要使用蚁剑连接webshell,注意要找对webshell.php的正确路径。
第十二关——0x00
绕过(POST)
审计代码:
原理同第十一关,我们需要在POST提交方式中修改"save_path"的值。
但由于GET和POST对于00截断的处理有所不同:POST不会对%00进行解码,我们只能用0x00绕过。
具体操作:
webshell上传成功
第十三关——文件内容检查
审计代码:
服务端对文件前两个字节的数据进行了读取,并验证是否对应各类型图片的文件头。
更多关于php中pack()和unpack(),请阅读:PHP中pack、unpack的详细用法;PHP:pack - Manual。
Ⅰ.上传图片马
两种上传图片马的方法可行:
(更多图片马的制作方式:图片木马制作大法)
①用copy命令制作一个图片木马并上传。
先准备一个内含"一句话木马"的.php文件和一个trojan.png图片文件:
在cmd中,找到对应目录,并使用copy命令制作图片马(pic_trojan.png):
此时上传pic_trojan.png即可。
②将webshell.php更改为图片后缀名,并为其添加对应的文件幻数
常见的图片文件格式 | 对应的文件幻数 |
---|---|
JPG | FF D8 FF E0 00 01 4A 46 49 46 |
GIF | 47 49 46 38 39 61 |
PNG | 89 50 4E 47 0D 0A 1A 0A |
先直接上传webshell.png。
然后在Burp Suite中修改其文件内容,在文件前面添加89 50两个字节。
然后便可成功上传。
Ⅱ.利用本pass中的文件包含漏洞来运行图片马中的恶意代码
分析如下:
在本页面以GET方式提交file=上传至服务端的图片马路径。
蚁剑也可以成功连接
第十四关——文件内容检查
审计代码:
更多关于getimagesize(),请阅读:PHP: getimagesize - Manual。
制作图片马:
添加GIF文件头(HEX)构造了webshell.gif
PNG文件头(HEX)构造了webshell.png
但不知为何,此pass中,有jpg文件头的webshell.jpg不能成功上传,另选择用copy命令直接将恶意代码写入一张.jpg图片的文件尾,可以成功上传jpg_webshell.jpg。
添加了jpg文件头却无法成功上传的webshell.jpg
本Pass的文件包含漏洞的利用方式同Pass-13。
第十五关——文件内容检查
审计代码:
exif_imagetype()如果发现了文件中恰当的签名则返回一个对应的常量,否则返回false,返回值和getimagesize()返回的数组中的索引 2 的值是一样的;更多关于exif_imagetype(),请阅读:PHP: exif-imagetype - Manual。
此Pass需要打开php的exif扩展,否则无法正常交互,关于详细内容,请阅读:PHP exif扩展方法开启详解。
- 先在phpstudy中勾选php_exif选项
- 然后在php.ini中删除extension=php_exif.dll之前的分号’‘;’’
随后便可成功上传图片马。
而在Pass-14不能上传的webshell.jpg(手动添加jpg文件头构造的那一个图片马)在此pass却可以成功上传。
个人猜测可能是Pass-14的getimagesize()和Pass-15的exif_imagetype()对文件类型的检测机制不同所导致。
本Pass的文件包含漏洞的利用方式同Pass-13。
第十六关——二次渲染
先上传一张gif图片马。
上传成功后,保存服务器经过二次渲染后返回的新图片,记为gif_trojan_return.gif。
通过WinHex打开两张图片。
点击"“查看(V)”=>“同步和比较(&)”,随后WinHex会比较两文件,相同处是白底,不同处是黑底。
我们用一句话木马覆盖一块儿未被服务端替换的区域(这里不应该是文件开头,如下图中偏移量未96和112的两行),然后保存修改记录。
再次上传图片马(我们重新添加过一句话木马后的gif_trojan_return.gif)
保存服务器第二次返回各我们的图片文件,记为gif_trojan_return_2.gif,
并使用文件内容查看工具WinHex检查一下,我们之前写的一句话木马是否仍然存在。
如上图,一句话木马在gif_trojan_return_2.gif中仍然存在,那么说明我们的一句话木马绕过了服务端的二次渲染。
接下来就可以像Pass-13一样,利用文件包含漏洞打开webshell了。