第十六关
这一关对后缀名和文件类型啥的都进行了很严格的控制,而且在后面还对图片进行了二次编译。
原理:将一个正常显示的图片,上传到服务器。寻找图片被渲染后与原始图片部分对比仍然相同的数据块部分,将Webshell代码插在该部分,然后上传。具体实现需要自己编写Python程序,人工尝试基本是不可能构造出能绕过渲染函数的图片webshell的。
那么,怎么找到相同的部分呢?需要一个HxD的软件,下载地址为
https://en.softonic.com/download/hxd/windows/post-download
打开渲染后的图片和原始图片
蓝色部分为相同不变的部分,可在这块添加恶意代码
再次上传带有恶意代码的gif图
测试
至于png jpg格式的图片,涉及到一些构造的问题,可以查看大佬的博客。
第十七关
查看源码
可以看到没有对文件名的后缀做任何校验,但是上传到服务器后,然后通过rename修改名称,再通过unlink删除文件,需要用到并发漏洞(网上都喜欢叫条件竞争)。
1、可以正常上传php文件,抓包后放入intruder模块中选择发送多次,然后在浏览器中访问就好了,在就算程序会对文件名改名也没关系的,直接访问原文件名就好了。
加载一个大一点的字典,让他一直上传,形成竞争条件
同时,一直访问原文件,直至出现
2、相同的思路用网上的脚本跑一下,同时,一直刷新浏览器
第十八关
和前一关类似,只不过是采用白名单的形式
初始文件命名规则$this->cls_upload_dir . this->cls_upload_dir . $this->cls_file_rename_to,当大量文件需要被重命名时就会出现条件竞争.
move在rename之前,move操作进行了一次文件保存, 然后rename进行了一次更改文件名。
利用burp不间断地发送上传图片马的数据包,由于条件竞争,程序会出现来不及rename的问题,从而上传成功。
白名单中存在.7z这个后缀名,apache不能解析,因此可以利用apache的解析漏洞,命名文件为1.php.7z,这样,apche从右往左解析时,遇到.7z不认识,就把这个文件当作.php来解析
剩余步骤和17关一样
第十九关
保存名自动变为upload-19.jpg,那么,可不可以00截断一下呢,改为upload-19.php(0x00).jpg,抓个包看一下
测试
第二十关
查看源码
数组条件,可以抓包构造数组
filename构成的过程中由于 file) - 1]的作用,导致$file[1] = NULL,所以构造文件名后相当于直接就是xx.php/.,可以直接在move_uploaded_file函数的作用下可以将/.忽略,因此可以上传成功。
因此save_name变量的两个值分别是xx.php/,另外一个值是jpg。
测试