根据题目描述应该是一个文件包含的题目,访问主页面
需要传入filename
的参数,尝试使用php://filter
协议读取check.php
文件的内容
?filename=php://filter/read/=convert.base64-encode/resource=check.php
经过一些测试,得到过滤了php://filter/read
和base64
,这里无法使用php://filter/read
协议了
我又测试了data://
协议和php://input
协议,都没有成功,在网上查找资料
因为php://filter
协议可以使用,在网上查找到了convert.quoted-printable-encode
这个方法也可以读取
尝试后发现quoted
这个单词也被过滤了,但是还有下方还有另一个方法
convert.iconv.*
方法:格式位:convert.iconv.<input-encoding>.<output-encoding>
或者convert.iconv.<input-encoding>/<output-encoding>
其中input-encoding
和output-encoding
有很多编码,详细可以看探索php伪协议以及死亡绕过
因为我们中文常用的方式是utf-8
,所以input-encoding
选择UTF-8*
,然后output-encoding
随便选择一个,浏览器显示正常解析即可
我测试了这几个可以正常解析:UCS-4*
、UCS-4LE*
、UCS-2
、UCS-2LE
、UTF-32*
、UTF-32LE*
、UTF-16*
可以正常解析,还有很多可以自己尝试
传入payload
?filename=php://filter/convert.iconv.UTF-8*.UCS-4LE*/resource=check.php
可以看到check.php
过滤的内容,/base|be|encode|print|zlib|quoted|write|rot13|read|string/i
,不过已经不重要的
该题目没有提示flag
文件的位置,尝试包含常见的flag.php
?filename=php://filter/convert.iconv.UTF-8*.UTF-16*/resource=flag.php
成功得到flag