[RoarCTF 2019]Easy Calc

进入题目是一个计算器的功能界面

「RoarCTF 2019」Easy Calc

 

查看源代码,可以发现是有WAF的,且存在一个calc.php文件

「RoarCTF 2019」Easy Calc

 

「RoarCTF 2019」Easy Calc

 

这里接收一个num参数,可以看到这里创建了一个黑名单列表,然后用正则是去匹配,进行非法参数的过滤。

「RoarCTF 2019」Easy Calc

 

那这题就是要绕过这个过滤和过一个WAF了。先传入一个?num=1测试一下。

「RoarCTF 2019」Easy Calc

 

传入字母就会报错,这里应该是被WAF文件给拦截了。

「RoarCTF 2019」Easy Calc

 

要对这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

 

「RoarCTF 2019」Easy Calc

 

现在我们就对WAF进行了绕过,接下来就是一些常规操作了。

http://node4.buuoj.cn:25591/calc.php? num=var_dump(scandir(chr(47)))

scandir():列出 参数目录 中的文件和目录,要不然我们怎么知道flag在哪。

因为过滤了"/"符号,所以我们用chr(47)进行绕过

「RoarCTF 2019」Easy Calc

 

最终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)))

 

「RoarCTF 2019」Easy Calc
posted @ 2021-08-30 11:06  随风kali  阅读(1047)  评论(0编辑  收藏  举报