如何确认是否是白名单检测
上传一张图片与上传一个自己构造的后缀,如果只能上传图片不能上传其它后缀文件,说明是白名单检测。
绕过技巧
可以利用
00
截断的方式进行绕过,包括
%00
截断与
0x00
截断。除此之外如果网站存在文件包含漏洞,还可以文件包含+
图片马进行绕过
前提
php
:
php < 5.3.29
且
magic_quotes_gpc=off
java:
:
jdk < JDK1.7.0_40
%00截断
pass-12
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
查看源代码这一句的意思是,截取文件扩展名。
strrpos函数是计算指定字符串在目标字符串中最后一次出现的位置,这里是指定“.”最后出现的位置
然后+1,也就是接去了文件扩展名。
%00
是一个
url
编码,
url
发送到服务器后就被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00
字符,而是%00
解码后的内容,即解码成了
0x00
。在
url
中
%00
表示
ascll
码中的0
,而
ascii
中
0
作为特殊字符保留,表示字符串结束,所以当
url
中出现%00
时就会认为读取已结束。
开启抓包
更改上传文件后缀
然后放包上传成功,复制图片链接进行访问
将%00及以后删掉然后进行访问就可以进入到服务器
为什么修改
path
才可以?
因为程序中检测的是文件的后缀名,如果后缀合法则拼接路径和文件名。那么,攻击者修改了path
以后的拼接结果为:uploads/1.php%00/20190818.jpg移动文件的时候会将文件保存为:uploads/1.php
从而达到Getshell效果。
00截断
pass-13
系统在对文件名进行读取时,如果遇到
0x00
,就会认为读取已经结 束。但要注意是文件的十六进制内容里的00
,而不是文件名中的00。
开启抓包,将上传的文件更改后缀,构造save_path,然后点开hex也就是16进制格式找到我们构造的地方
定位到构造的save_path后将这一位改为00,然后放包就上传成功了