题目要求如下~
依旧是参考大佬的WP有所补充,内容对小白友好~
按照老规矩分析源码~
解题思路如下:
根据第3行 include("./check.php");
check.php这个文件大概就是检查输入的内容有没有敏感字符,通过绕过提高难度~所以先查询check.php的内容,看看里面到底有什么东西~
工具:无
参考:钟冕的WP显示网页源码
1 初步访问
我们先通过最古老传统的方式访问一下./check.php——
/?filename=php://filter/read=convert.base64-encode/resource=./check.php
1)"filename=php://filter/read=convert.base64-encode/resource="是以Base64的格式读取文件内容的最常用格式;
2)源码第3行 ./check.php 直接粘贴在后面就好,是读取的文件名称及路径~
嗯,果然毫无悬念地报错了...这显然不是我们想要的结果...
2 绕过POC
我们重新分析一下这段很长的经典代码,看看有没有可以绕过的点——
filename=php://filter/read=convert.base64-encode/resource=./check.php
1)filename= 这个是源码第5行的文件名,暂时没有绕过的点;
2)php://filter/read 这个是对于文件读取的操作,除了读以外,还可以替换为php://filter/write <对于文件写的操作>、php://filter<对于文件读或写的操作>~(截图摘自:PHP: php:// - Manual)
我们优先考虑第三种格式php://filter,代码字数越少被拦截的可能性越低。
3)=convert.base64-encode 这个是对于编码格式的操作,将读取到的内容以Base64的格式加密,可以替换为convert.quoted-printable-encode、convert.iconv.
对于转换过滤器convert感兴趣可参考链接~PHP: 转换过滤器 - Manual
除了convert转换过滤器以外,php还有String字符串过滤器、Zlib压缩过滤器,可以近似执行相关的功能,相互替换~PHP: 可用过滤器列表 - Manual
我们优先考虑第三种格式convert.iconv.
↑图片内容出自:PHP: Supported Character Encodings - Manual,这次解题先用最常见的UTF-8、UTF-16试一试~
4)/resource=./check.php resource是读取文件必选项,./check.php是题目源代码第3行的地址,暂时没有绕过的点~
所以综上,我们暂时替换成这样的格式读取./check.php
filename=php://filter/convert.iconv.utf8.utf16/resource=./check.php
http://61.147.171.105:58114/?filename=php://filter/convert.iconv.utf8.utf16/resource=./check.php
贴到url后面,执行结果如下~
我们分析一下check.php代码,大概是这个意思~
证明现在的格式能用以后,下一步是获取flag的文件路径,假设这个路径是最常见的flag.php,代码如下~
http://61.147.171.105:58114/?filename=php://filter/convert.iconv.utf8.utf16/resource=flag.php
执行结果如下图所示~
$flag='cyberpeace{712054cb876bb5785f3b2e558168afc9}';
博文写得模糊或者有误之处,欢迎留言讨论与批评~
码字不易,若有所帮助,可以点赞支持一下博主嘛?感谢~(●'◡'●)