[RoarCTF 2019]Easy Calc

打开是一个计算器

查看网页源码发现,程序通过调用clac.php文件给num传参再计算,其中encodeURIComponent函数对计算表达式中的符号进行转码。例如表达式为1+1,则返回1%2B1,故url为calc.php?num=1%2B1。另外这里还提示我们他已经部署了waf,waf会过滤一些非法字符

访问calc.php发现直接显示了代码,代码首先判断若没有设置参数num则返回当前文件源码,否则按黑名单过滤字符串,最后再返回结果。我们可以利用 PHP的字符串解析特性Bypass 。
即利用waf和php对变量的解析差异:假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

由于黑名单中包含了一些寻找路径的常用字符,所以我们可以选用scandir函数加chr函数查询路径,再用var_dump将结果以变量数组形式输出,其中chr(47)为/字符,查找当前目录。payload为:/calc.php? num=var_dump(scandir(chr(47))),发现有个可疑路径为f1agg

构建payload读取f1agg的内容var_dump(file_get_contents("/flagg")):

/calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

结果为:string(43) "flag{85176371-f832-4e42-8a69-59af8306bc25}"

posted @ 2024-11-20 21:53  一只本本  阅读(1)  评论(0编辑  收藏  举报