网络知识 娱乐 [RoarCTF 2019]Easy Calc

[RoarCTF 2019]Easy Calc

原理1:利用PHP的字符串解析特性

参考文章:利用PHP的字符串解析特性Bypass

PHP将查询字符串(在URL或正文中)转换为内部$_GET或关联数组$_POST。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。
例如:
/?foo=bar变成Array([foo]=> “bar”)。
/? foo=bar变成Array([foo]=> “bar”)。 //?号后有一个空格
/?+foo=bar变成Array([foo]=> “bar”)。 //?号后有一个+号

在这里插入图片描述

原理2:利用scandir()列出目录和文件,var_dump()用于输出

scandir()函数返回指定目录中的文件和目录的数组。
scandir(/)相当于ls /
var_dump()相当于echo

原理3:利用file_get_contents()读取并输出文件内容

例如 file_get_contents(/flag.php),读取/flag.php的代码

做题步骤

1、随便测试,看回显
在这里插入图片描述2、看源码,说有 waf 和一个路径
在这里插入图片描述3、访问/calc.php,发现源码。大概意思是:GET传入一个num,并且对num的值进行黑名单过滤,最后eval()执行。但是黑名单过滤的不止源码列出来的,乌鱼子。
在这里插入图片描述4、输入字符,直接禁止了,说明第一个源码说的waf展现力量了。
我的理解是:在/calc.php代码解析之前,先经过waf检测,但是具体waf规则不知道,大概就是只允许num的值为数字。
那我们就让waf检测不到num的存在。
在这里插入图片描述5、那我们只需要绕过waf对num的检测即可。用到原理1:PHP的字符串解析特性。

在这里插入图片描述感谢沐目_01师傅的解释:
在这里插入图片描述6、现在来读取有哪些目录了。用到原理2。
? num=var_dump(scandir(chr(47)))相当于? num=system(ls /)。chr(47)=" / "。
在这里插入图片描述7、找到flag所在文件名,那就来读文件内容吧。用到原理3。
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))==>>file_get_contents(/f1agg)相当于? num=system(cat /f1agg)
在这里插入图片描述