我会在 writeup 中写出我在解决这道题时遇到的问题,以及对问题的思考,而不是直接给出 payload。
进入场景:
?显然是考文件包含,第一反应是用 php://filter 加?convert.base64-encode 文件读取 flag.php:
?提示 "do not hack!" 猜测是黑名单检测敏感字符串。所以,接下来 fuzz 有哪些字符串被禁用,这里可以直接输入单个字符串:
输入 "base64",仍然提示"do not hack!"
输入 “convert”,没有提示 "do not hack!"。通过这两步,可以推测 "base64" 字符串在黑名单里。经过调试,"base64"、"string"、"read" 等都在黑名单里。
到了这一步,我想的是测试能不能用 data://(涉及 php.in 的 allow_url_include 配置)。
?如果成功的话,应该返回 "aaaa"。这里没有,显然没有开启 allow_url_include。
接下来就是考虑 php://filter 有没有其他过滤器可以用。bing 搜索一下"php://filter 过滤":
?在这篇文章中,注意到一个 "convert.iconv" 过滤器:
?convert.iconv 相当于用了 iconv() 函数,这个函数我记得是转换数据的字符集,比如 iconv("ASCII", "UTF-8", $string),也就是说只转换数据的表现形式,我拿到数据之后,再把它的字符集转回来就行了。上图标注的第二个地方还展示了 convert.iconv 的用法,直接拿来试试:
?不行。不过,还有很多字符集可以尝试:
UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*
不知道哪些可以绕过,直接用 burpsuite 爆破吧。burpsuite 的暴力破解 intruder 模块有个“cluster bomb” (集束炸弹)模式,可以把上面所有的 16 个字符集格式做一个笛卡尔积,生成 256(16 *16)个请求。
?设置位置 1 和位置 2 使用的字典,都是同一个:
?开始攻击。在结果里面发现 flag:
|