-
[RoarCTF 2019]Easy Calc
- 1

- ajax 是进行前后端交互的 但是我们发现一个waf 就是他提示的
- "calc.php?num="+encodeURIComponent($("#content").val()) ?num 的值必须是数字
- 审计一下

- foreach

- 发现了num的限制
- 但是eval是rce的标志所以我们首选的就是使用命令执行

- 被禁止了 system() 使用其他的passtru()等也鸡鸡了
- 所以就不是命令执行了 而是代码执行
- scandir() 函数可以进行目录的扫描 我们扫一下根目录
- 但是 / 被过滤了 可以使用chr(ascii码) 进行转换 / 的ascii 可以使用py脚本看一下

- ord 和chr 一个是进行ascii码的查找一个是进行字符串的匹配
- 所以构造payload ?num=scandir(chr(47))
- 但是这个前端的验证必须要我们的num是数字

- "calc.php?num="1;scandir(chr(47)) #+encodeURIComponent($("#content").val())
- 黄的就是构造的pay
- 试一下

- 报废了
- 还涉及一个知识点

- php bypass
- 我们了解一下php的接收参数的逻辑 : 他会对 num 传的数据进行去空格个/等的处理
- 但是如果我们在 num之前加一个 空格或者加号 就会让前端的这个机制无法识别num的具体位置
- 但是后端是没有影响的 后端会剥去这些

- 加一个空格 :"calc.php ?num="+encodeURIComponent($("#content").val())
- 对方就不认识了 这个前端的waf就绕过了直接传到后端
- 实现绕过 这样num就可以是任何数了
- node5.buuoj.cn:26836/calc.php? num=1;var_dump(scandir(chr(47)))
- 为什么使用var_dump => 这个是处理数组的 而 scandir 返回的就是数组
- 找到flag

- 这个是文件 可以使用函数 file_get_contents()进行读取文件

- 别忘了路径前面要有一个 /
- ?%20num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

- flag{fbdd82de-9005-4f6d-a16b-424fca06a347}