从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文件名覆盖(1).在multipart协议中,一个文件上传快存在多个Content-Disposition,将以最后一个Content-Dispostition的filename值作为文件上传的名字.许多WAF解析到第一个Content-Dispostiton就认为协议解析完毕,从而导致被绕过.

2文件名覆盖(2).在一个Content-Dispostition中,有多个filename,协议解析应该使用最后的filename作为文件名.从而导致被绕过.

eg:Content-Dispostition:form-data;name=”myfile”;filename=”1.txt”;filename=”1.php”

3.遗漏文件名.当WAF遇到name=”myfile”;;的时候,认为没有解析到filename,而后段容器继续解析到文件名,从而导致被绕过.

eg:Content-Disposition: form-data;name=”myfile”;; filename=”t3.jsp”

4.未解析所有文件.multipart协议中,一个POST请求能同时上传多个文件.有些WAF只会检查第一个上传文件,从而导致绕过.

5.文件名解析兼容性.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一般检测连续的”../“

绝对路径的绕过:同上