CTF Web安全

[RoarCTF 2019]Easy Calc(PHP字符串特性+HTTP走私)

Posted on 2020-01-16,2 min read

通过查看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。

下一篇: HTTP请求走私→