上传参数名解析:明确哪些内容可以修改
Content-Disposition:一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件MIME,视情况更改
常见绕过方法:
数据溢出-防匹配(xxx...)
大量垃圾数据缓冲溢出等
符号变异-防匹配(' " ;)
在php中,如果上传的文件名缺少后面的引号,就会被误认为是语言中自带的(变量名),不会报错。而安全狗只匹配成对的引号,所以上传"test.php
或'test.php
都可以绕过安全狗。但是如果只有一个引号在文件名后面,就会被拦截,猜想是安全狗匹配引号后,把引号前的值拿出来做判断,符不符合规则,如果触发规则,那么就被拦截。
"x"x.php
""x.php
"x".p hp
数据截断-防匹配(%00 ; 换行)
"a.jpg;.php"
"a.php%00.jpg"
为什么加上;
可以绕过?
因为安全狗匹配到;
就以为文件名到此结束了,对分号前面的文件名进行匹配,发现文件名格式合法,然后就放行,但是数据包把引号内的内容当成一个完整的文件名,上传到服务器,所以绕过了。
filename="
a
.
p
h
p
"
换行在程序代码中表示该行内容结束,安全狗匹配\n
发现并没有数据(没有触发规则),而数据包却能识别这种写法,因此可以实现绕过。
重复数据-防匹配(参数多次)
filename="a.jpg"
Content-Type: iamge/jpeg
那么就可以多写几个参数进去
filename="a.jpg";filename="a.jpg";filename="a.jpg";filename="a.jpg";......
filename="a.php";
或者这样
filename="Content-Disposition: form-data; name="upload_file"x.php"
Content-Type: iamge/jpeg
上述绕过是采用了白名单绕过,借助原有的数据包自带的正常内容作为干扰条件,来实现绕过,也是重复数据的一种应用 。
其他绕过:
filename="Content-Type: iamge/jpeg; name="upload_file"x.php"
filename="/jpeg;/x.php"
FUZZ WEB字典
防护
采用后端验证,如果采用前端验证,可以通过禁用前端脚本来进行绕过。
后缀检测:基于黑名单和白名单进行过滤
MIME检测:基于上传自带类型检测
内容检测:文件头、完整性检测
自带函数过滤:参考uploadlabs
自定义函数过滤
WAF防护产品