检查源码,发现有一个url:calc.php。然后尝试去访问一下,还真的可以看到:
可以看到,get型获得num变量的值,然后设置了一个黑名单,进行过滤,这里就需要之前提到的,[极客大挑战 2019]Knife1-CSDN博客里面用到的 var_dump() + scandir() 来进行手动的查找:
这里还需要注意的就是,我们不能单纯的传num,而是空格加num,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还可以进行上传非法字符。
再者就是这里的黑名单我们可以使用chr()
函数用于返回 ASCII 值对应的字符。当我们调用 chr("47")
时,就是在请求 ASCII 表中第 47 个字符,其对应的字符就是正斜杠 /。这样我们就绕过了黑名单:
构造的payload如下:/calc.php?%20num=1;var_dump(scandir(chr(47)))
我们可以看到是有f1agg存在的,因此我们继续使用,file_get_contents()函数来读取这里的内容:
构造的payload如下:
/calc.php? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103));