通过查看JS。发现数据处理的PHP文件
题目说。上了WAF。而源码中。又只过滤了一些危险字符。
我们试试p字符串。
返回403?一般都是PHP过滤的。这里403.应该就是题目说的WAF了
那么整个处理流程应该是。前端服务器WAF过滤。->后端PHP黑名单过滤
上一篇HTTP走私文章讲了。如果存在两个Content-Length头。那么服务器会报400错误。
如果给两个CL头。使其400错误。然后再转发给后端的服务器。那么就执行成功了
首先。我们设置了两个CL头。前端服务器爆400错误。
然后又转发给了后端服务器。后端服务器再去判断。是否有危险字符。
这里我们又遇到个坑。就是。后端服务器还过滤了./这些
如图。a-z0-9都是可以输出的。当我测试./时。就不行了
那就通过chr来构造字符。
后面我想。直接用chr构造个/,flagg直接明文拼接
然而又不行。不知道为什么。
第二种解法:
利用PHP的字符串解析特性Bypass
PHP在处理请求时。会将所有参数转换为有效的变量名。在解析字符串时。会先删除空白符。再将某些特殊字符转换为下划线(包括空格)
INPUT Decode variable name
%20foo_bar%00 foo_bar foo_bar
foo%20bar%00 foo bar foo_bar
foo[bar foo[bar foo_bar
{chr}foo_bar -> 20 ( )
{chr}foo_bar -> 26 (&)
{chr}foo_bar -> 2b (+)
foo{chr}bar -> 20 ( )
foo{chr}bar -> 2b (+)
foo{chr}bar -> 2e (.)
foo{chr}bar -> 5b ([)
foo{chr}bar -> 5f (_)
foo_bar{chr} -> 00 ()
foo_bar{chr} -> 26 (&)
foo_bar{chr} -> 3d (=)
空格&+.|[都会被转义为
那么我们在num参数前面加个空格。WAF匹配num参数。而我们传参的却是空格num
也就绕过了WAF。