Content-Disposition:一般可更改
name:表单参数值,不能更改
filename:文件名,可以更改
Content-Type:文件 MIME,视情况更改
数据溢出-防止WAF匹配(xxx...)'
符号变异-防止WAF匹配(' " ;)
数据截断-防止WAF匹配(%00 ; 换行)
重复数据-防止WAF匹配(参数多次)
我以靶场upload-labs第二关进行演示。
我们开启安全狗的上传防护:

第2关上传一个php文件,被安全狗检测到且被拦截:
php加上空格"ph p",可上传,但无法解析。
filename的内容进行溢出。
filename的内容进行溢出虽然可以绕过WAF但是我无法将php文件上传至服务器。
name与filename之间进行溢出
也可绕过WAF但是无法上传php文件。
大量垃圾数据后加“;”
Content-Disposition与name之间的垃圾数据加上分号可绕过安全狗。
可成功上传php文件
经测试,name与filename之间的垃圾数据也可绕过。
可用payload:
filename的内容用单引号括起来(被拦截)
显然被拦截
filename去掉最后一个双引号(被拦截)
被拦截
filename去掉最后一个双引号,再加上分号(后缀不能被解析)
可绕过,可上传,但是无法被解析
filename去掉最后一个双引号,在文件名后缀前任意位置加空格(可行)
可绕过WAF,可上传。
单引号与双引号一致。
只在末尾加双引号(被拦截)
文件名前加双引号或单引号(无法解析)
文件名前加双引号或单引号可绕过waf,也可上传,但是无法解析。
文件名中加入图片后缀提前用分号截断
可用payload:
文件名中加入图片后缀提前用分号截断(可行)
原因是防护软件只检测前面的部分,一旦正确就放行,不再检测后面的
同理结合符号变形可有:
文件名中用%00url编码截断(可行)
直接在数据包中进行换行操作(可行)
重复filename
前面的filename为可接受的文件格式,最后一个为php文件格式,前面的重复多次,可绕过。
filename中配合其他参数
配合Content-Type: image/jpeg:
payload:
字典地址:
手工测试的话有点麻烦,我们可以借助写好的字典配合BP进行批量测试,先在本地测试好了,再在真实环境进行测试,以防会封IP。
我借助fuzzDicts的php字典进行测试。
首先将拦截的数据包发送至Intruder
清除所有变量
将filename的值设置为变量
payload加载字典:
开始攻击:
能否成功取决于字典的好坏。
后端验证:采用服务端验证模式
后缀检测:基于黑名单,白名单过滤
MIME 检测:基于上传自带类型检测
内容检测:文件头,完整性检测
自带函数过滤:参考 uploadlabs关卡的函数
自定义函数过滤:function check_file(){}等
WAF 防护产品:宝塔,云盾,安全公司产品等