从php与服务器协议分析
四个层次绕过WAF:
1.架构层
2.资源限制角度
3.协议层面
4.规则缺陷
协议层面:
协议覆盖不全
协议解析不正确
协议解析与后WEB容器的协议解析不一致
- 协议覆盖不全
POST请求常用的两种参数提交方式:
Content-Type:application/x-www-form-urlencode;
Content-Type:multipart/form-data;
WAF未覆盖Content-Type:multipart/form-data,或者只认为它是文件上传请求,从而只检测文件上传,导致被绕过.
- 协议解析不一致
WAF将文件名解析为test3.jpg,而php解析为shell.php.这个是由一个php dos(cve-2015-4024)的漏洞衍生出来的用法.
- 协议解析问题
- 文件名覆盖(1)
在multipart协议中,一个文件上传快存在多个Content-Disposition,将以最后一个Content-Dispostition的filename值作为文件上传的名字.许多WAF解析到第一个Content-Dispostiton就认为协议解析完毕,从而导致被绕过.
- 文件名覆盖(2)
在一个Content-Dispostition中,有多个filename,协议解析应该使用最后的filename作为文件名.从而导致被绕过.
eg:Content-Dispostition:form-data;name="myfile";filename="1.txt";filename="1.php"
- 遗漏文件名
当WAF遇到name=“myfile”;;的时候,认为没有解析到filename,而后段容器继续解析到文件名,从而导致被绕过.
eg:Content-Disposition: form-data;name="myfile";; filename="t3.jsp"
- 未解析所有文件
multipart协议中,一个POST请求能同时上传多个文件.有些WAF只会检查第一个上传文件,从而导致绕过.
- 文件名解析兼容性
multipart协议中,文件名的形式为“filename=“abc.php””,但是Tomcat、PHP等容器解析协议时会做一些兼容,能正确解析 ”filename=“abc.php”、”filename=abc.php”、 ”filename=‘abc.php’”,而WAF只会按照协议去解析,无法解析文件名,从而导致被绕过.
eg:
Content-Disposition: form-data; name="file"; filename=abc.php
Content-Disposition: form-data; name="file"; filename="abc.php
Content-Disposition: form-data; name="file"; filename='abc.php’
规则层面的绕过
针对SQL的一些绕过:
空白符: 浮点数词法
.select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0 可以导致WAF检测不出来union
文件包含:
相对路径的绕过:"//” “/./” 都为当前路径 WAF一般检测连续的"../"
绝对路径的绕过:同上