这题考查的是: 字符串解析特性+目录读取+文件内容读取
字符串解析特性详解:PHP字符串解析特性 ($GET/$POST参数绕过)(含例题 buuctf easycalc)_参数解析 绕过-CSDN博客
ascii码查询表:ASCII 表 | 菜鸟工具 (jyshare.com)
用到的函数有:
print_r() 读取复杂对象,字符串、数组、对象等
chr() 将ascii码值转换为字符
scandir() 读取目录;成功返回文件数组;失败返回false;目录必须用引号包裹
file_get_contents() 将文件内容读取到字符串中;以二进制流读取;图片、字符数据都可用
全是知识盲区啊;又学到了新知识
打开题目发现是一个计算器界面;查看源码发现设置了waf;具体内容不知道什么情况
通过抓包测试发现了calc.php的一段源码信息;里面对输入的一些特殊字符进行了过滤
过滤的字符:空格 ' " \t \r \n ` [ ] $ ^
尝试输入num参数进行测试发现只能输入数字;字母和其他符号都不通过;应该是waf搞的鬼
这里彻底蒙圈了;知识匮乏了;看了大佬的wp发现可以利用字符串解析特性进行绕过
百度了一下php参数的字符串解析特性:1.去掉空白符 2.将某些字符转化为下划线
大佬的文章:PHP字符串解析特性 ($GET/$POST参数绕过)(含例题 buuctf easycalc)_参数解析 绕过-CSDN博客
构造payload:?%20num=phpinfo()
发现成功执行了phpinfo()函数;好了;waf已经绕过了;接下来就是绕过calc.php的过滤操作了
现在不知道flag在哪里;先要读取一下目录文件
由于' " 都被过滤了;所以用chr()进行输入绕过;chr(47)是/
构造payload:print_r(scandir(chr(47))) 读取根目录下的文件信息;然后打印该数组
找到了疑似存放flag的文件名为f1agg
注意:文件名中第二个是数字1;不是l;我在这儿耽搁了好一会儿才发现
构造payload:print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
成功读取到了flag
10