实战篇——文件上传漏洞upload-labs-master靶场实战一
实战篇——文件上传漏洞upload-labs-master靶场实战(1)
前端验证绕过
(1) 篡改js代码
直接上传一句话木马失败:
查看页面源代码:
可见前端通过checkFile函数对上传文件的后缀名进行了验证。
使用Tampermonkey自定义js脚本,用于删除form表单的onsubmit属性:
启用脚本,刷新页面,前端验证功能已被删除:
复制图像地址,新建标签页打开,成功连接木马:
(2) 抓包修改后缀
先将一句话木马后缀改为.jpg,抓包:
再将后缀重新改回.php,发送,同样可以绕过:
后端黑名单绕过
(1) MIME绕过
代码审计:
可见后端对MIME进行验证。
抓包:
将MIME改为image/jpeg,发送:
成功连接木马:
(2) .phtml绕过
代码审计:
可见黑名单不包括.phtml,当php为老版本且在httpd.conf中AddType application/x-httpd-php .php .phtml开启(默认关闭)时,可将后缀改为.phtml实现绕过。
将后缀改为.phtml,上传,成功连接木马:
(3) .htaccess绕过
代码审计:
可见黑名单中增加了.phtml,但不包括.htaccess,当php为老版本且在httpd.conf中AllowOverride开启(如下)(默认开启)时,可以先上传.htaccess配置文件指定当前目录下可被php解析的后缀,再将一句话木马的后缀改为.htaccess配置文件指定的后缀之一并上传,实现绕过。
编辑.htaccess配置文件,指定后缀为.jpg:
上传.htaccess配置文件:
将一句话木马后缀改为.jpg,上传,成功连接木马:
(4) .user.ini绕过:
代码审计:
可见黑名单中增加了.htaccess,但减少了.ini,当php为新版本且上传路径下存在.php文件时,可以先上传.user.ini配置文件指定插入当前目录下所有.php文件首部或尾部的文件,然后将一句话木马的后缀改为黑名单之外的后缀并上传,最后上传路径下的所有.php文件都会被插入一句话木马,连接其中任一文件即可。
编辑.user.ini配置文件,指定插入文件为webshell.jpg:
上传.user.ini配置文件:
将一句话木马后缀改为.jpg,上传,访问readme.php(通过目录扫描获得),成功连接木马:
(5) 大小写绕过
代码审计:
可见没有将后缀转换为小写,且黑名单过滤不充分,当php为老版本时,可以将后缀改为.PhP等实现绕过。
将一句话木马后缀改为.PhP,上传,成功连接木马:
(6) [1]+$绕过
代码审计:
此处只对'.'和' '进行了有限次的过滤,可以将后缀改为'.php. .'等形式实现绕过。
抓包,将一句话木马的后缀改为.php. .,发送:
成功连接木马:
(7) 双写绕过
代码审计:
此处将文件名中所有黑名单内的字符串进行了过滤,由于只进行了有限次过滤,可以通过将后缀改为.pphphp实现绕过。(.phphpp不行)
将一句话木马后缀改为.pphphp,上传,成功连接木马:
后端白名单绕过
(1) 00截断[GET型]
代码审计:
此处通过GET请求获得文件保存路径,因此路径可控,当php版本小于5.3.4且在php.ini中magic_quotes_gpc关闭时可以将路径跟上'/webshell.php%00'等形式实现绕过。
使用Tempermonkey自定义js脚本,修改form的action属性,实现00截断:
启用脚本,刷新页面,文件保存路径已被修改:
将一句话木马后缀改为.jpg,上传,成功连接木马:
(2) 00截断[POST型]
代码审计:
唯一的区别就是将GET改为了POST,一样的配方。
成功连接木马:
(3) 条件竞争
代码审计:
此处执行逻辑为:先将文件保存,若文件后缀在白名单内,则重命名;若文件后缀不在白名单内,则删除。
如果在木马保存和删除的时隙内访问木马,那么木马是可以被执行的,只不过很快就会被删除。但如果上传的木马能够释放一个一句话木马,那么虽然上传的木马会被删除,一句话木马是不会被删除的,由于正在执行的脚本无法删除,因此这种方法是可行的。
编辑载体:
上传载体,抓包,发送至Intruder模块,配置Continue indefinitely:
访问载体,抓包,发送至Intruder模块,配置Continue indefinitely:
同时开始爆破,只要成功访问载体一次即可植入一句话木马:
成功连接木马:
. ↩︎