点开界面:
随便输入数字,抓包,发现有个php文件:
我们跳转看看:
看到了eval()
,很容易想代码执行。
试着传入num
参数为字符,发现:
方法一:
官方wp表示考点为php字符串解析绕过WAF(这做题的时候谁知道啊)
这里有一篇文章进行了详细介绍。
文章中对本题最关键的就是:
因此,我们可以试试用空格绕过forbidden。
经过测试之后,我发现只有将+
或%20
放在num
前面时才有用,即?+num=phpinfo()
。此时有回显:
看来确实有代码执行。下一步就是通过函数来读取文件目录了。
我们先看看php禁用了啥函数:
我们常用的读取目录的php函数为scandir()
,还好没被禁掉。
scandir()
函数的作用为返回指定目录中的文件和目录的数组,用法如:
scandir('./');
但是在黑名单中,单引号和双引号被过滤了。
我们一般是用hexdec()
和bin2hex()
将字符串转成16进制再转成10进制,这样就没有包含字符,就能绕过黑名单了。
hexdec()
函数把十六进制转换为十进制。
bin2hex()
函数把 ASCII 字符的字符串转换为十六进制值。
hex2bin()
函数将十六进制转换成ASCII字符的字符串。
dechex()
函数把十进制转换为十六进制。
于是,我们先得到十进制,然后用hex2bin(dechex())
转回来。
/
的十六进制为47。
所以我们写payload:?+num=scandir(hex2bin(dechex(47)))
(尴尬的是,我测试的环境没有写出来,返回的为空的数组,很迷)
然后用file_get_contents()
函数来读取文件,即可得到flag(虽然读取不到文件夹,但我用wp的语句读取到了flag,更迷了)
方法二:
利用http走私过狗,这里有一篇文章介绍了什么是http走私。我再尝试之后,发现CL-CL可用,于是我构造:
可以看到有phpinfo的回显,于是和刚才的流程一样,用scandir()
函数读取文件目录,用readfile
读取文件。即可得到flag。