[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}"
本文作者: 一只本本,文章链接: https://www.cnblogs.com/abenben/p/18559401
欢迎志同道合的朋友一起学习,进步