进入题目是一个计算器的功能界面
![[RoarCTF 2019]Easy Calc_数组](https://s2.51cto.com/images/blog/202109/07/c8456e7d811bff90822f07c9f637b906.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
查看源代码,可以发现是有WAF的,且存在一个calc.php文件
![[RoarCTF 2019]Easy Calc_下划线_02](https://s2.51cto.com/images/blog/202109/07/5a8c317e1b4f99d16ae531c04ff71ee7.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
![[RoarCTF 2019]Easy Calc_字符串_03](https://s2.51cto.com/images/blog/202109/07/9b3c8e611032f2522d3646323fbd216a.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
这里接收一个num参数,可以看到这里创建了一个黑名单列表,然后用正则是去匹配,进行非法参数的过滤。
![[RoarCTF 2019]Easy Calc_数组_04](https://s2.51cto.com/images/blog/202109/07/ad66f4b5c968a96f375b98f1a9abf12e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
那这题就是要绕过这个过滤和过一个WAF了。先传入一个?num=1测试一下。
![[RoarCTF 2019]Easy Calc_php_05](https://s2.51cto.com/images/blog/202109/07/5aee78c9f9252cb60eff3b4b39f2fda0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
传入字母就会报错,这里应该是被WAF文件给拦截了。
![[RoarCTF 2019]Easy Calc_CTF_06](https://s2.51cto.com/images/blog/202109/07/f9a4dd7664286e895671768705350eff.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
要对这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://:25591/calc.php?num=a #被拦截
http://:25591/calc.php? num=a #绕过WAF
![[RoarCTF 2019]Easy Calc_数组_07](https://s2.51cto.com/images/blog/202109/07/a5309194a8155948c25867bd60c920bd.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
现在我们就对WAF进行了绕过,接下来就是一些常规操作了。
http://:25591/calc.php? num=var_dump(scandir(chr(47)))
scandir():列出 参数目录 中的文件和目录,要不然我们怎么知道flag在哪。
因为过滤了"/"符号,所以我们用chr(47)进行绕过
![[RoarCTF 2019]Easy Calc_CTF_08](https://s2.51cto.com/images/blog/202109/07/306f3a203402f9d50f06b5dcc88279f5.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
最终Payload
http://: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_CTF_09](https://s2.51cto.com/images/blog/202109/07/ac49bec6ee925d747ced07f795d8f3e2.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
__EOF__
![[RoarCTF 2019]Easy Calc_数组_10](https://s2.51cto.com/images/blog/202109/07/114f1cfe286e4d7e8dc8d1057fa92039.jpeg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
















