一般情况下,代码文件里会有一个列表存放着允许上传的文件后缀,如果上传的文件后缀名不符合白名单,就不允许上传。
-
一.如何判断是否为白名单检测
上传一张图片与上传一个自己构造的后缀,如果只能上传图片不能上传其它后缀文件,说明是白名单检测。
二.绕过技巧
-
利用00截断进行绕过
- %00截断
- 0x00截断
-
如果网站存在文件包含漏洞,还可以文件包含+图片马进行绕过
1.00截断
前提条件
-
php:php < 5.3.29且magic_quotes_gpc=off
-
java:jdk < JDK1.7.0_40
%00截断
靶场:http://127.0.0.1/upload-labs-master/Pass-12/index.php
-
介绍:%00是一个url编码,url发送到服务器后就被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
-
截断演示:
-
为什么需要修改path才可以?
因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。那么,攻击者修改了path以后的拼接结果为:uploads/shell.php%00/20190818.jpg
移动文件的时候会将文件保存为:uploads/shell.php从而达到Getshell效果
-
PS:除了修改path外,还需要将原文件名修改为合法的文件名,比如"post.php"修改为"post.jpg"
-
0x00截断
靶场:http://192.168.13.132/upload-labs-master/Pass-13/index.php
-
介绍:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。
-
截断演示:
-
打开bp抓取上传文件的数据包
-
修改path内容以及上传的文件名
-
在Hex界面将加号修改为00
-
修改完放包即可上传成功。
-