先打开题目发现是一个计算器,先输入1+1,输出2
先判断是否是SQL注入,发现并没有任何变换
Ctrl+u查看源代码,发现提示信息,有waf,发现参数是传到calc.php,num值的加密,在执行eval();题目应是命令执行
先看看calc.php页面,发现过滤挺多的
揭发
原理1:利用PHP的字符串解析特性 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的代
先经过waf检测,大概就是只允许num的值为数字。那我们就让waf检测不到num的存在。
利用原理1
这样waf就找不到num这个变量了,因为现在的变量叫“ num",而不是"num"。 但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
测试一下,果然是这样的
然后利用原理2
构造payload: ?num=var_dump(scandir(chr(47))),因为/被过滤了,用chr数值表达式可以绕过,chr表在文章末尾
发现f1agg,利用原理3,使用file_get_contents获取f1agg里的数据,构造payload:num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)),即可得到flag
chr表:
标签:RoarCTF,foo,bar,get,chr,num,2019,Calc,php From: https://www.cnblogs.com/mu-yi2/p/16875355.html