ThinkPHP6.X反序列化利用链
字数 1195 2025-08-26 22:11:15

ThinkPHP 6.X 反序列化利用链分析

环境搭建

  1. 使用 Composer 创建 ThinkPHP 6.x 项目:
composer create-project --prefer-dist topthink/think=6.0.x-dev tp6x
cd tp6x
./think run
  1. 修改控制器代码(application/index/controller/Index.php):
<?php
namespace app\controller;

class Index
{
    public function index()
    {
        $u = unserialize($_GET['c']);
        return 'ThinkPHP V6.x';
    }
}

利用条件

满足以下任意一个条件即可利用:

  1. 存在完全可控的反序列化点:unserialize(可控变量)
  2. 存在文件上传且文件名完全可控,并使用了文件操作函数:file_exists('phar://恶意文件')

漏洞链分析

背景

ThinkPHP 5.x 的反序列化链通常以 think\process\pipes\Windows 类作为入口,通过触发任意类的 __toString 方法。但在 ThinkPHP 6.x 中,Windows 类已被移除,而 __toString 后的 Gadget 仍然存在。

新的入口点

在 ThinkPHP 6.x 中,我们发现 Model 类可以作为新的入口点:

  1. Model 类的 __destruct 方法会调用 save 方法
  2. save 方法会调用 updateData 方法
  3. updateData 方法中调用了 checkAllowFields 方法

关键点在 checkAllowFields 方法中存在字符串拼接操作(vendor/topthink/think-orm/src/Model.php 第584行),可以通过设置 $this->table$this->suffix 为类对象,在拼接时触发其 __toString 方法。

具体实现

由于 Model 是抽象类,我们使用其继承类 Pivot 来构造利用链。

攻击流程图

(此处应插入攻击流程图,描述从 __destruct 到最终利用的完整调用链)

防御建议

  1. 避免使用不可信的反序列化数据
  2. 及时更新 ThinkPHP 到最新版本
  3. 对文件操作进行严格过滤
  4. 禁用不必要的 PHP 魔术方法

参考

  • thinkphp v6.0.x 反序列化利用链挖掘

注意事项

  1. 实际利用时需要构造特定的序列化字符串
  2. 不同版本的 ThinkPHP 6.x 可能存在差异
  3. 利用链可能依赖于特定的环境配置

技术细节补充

  1. Model 类的关键方法调用链:

    • __destruct()save()updateData()checkAllowFields()
  2. 字符串拼接触发点:

    • checkAllowFields 方法中,通过控制 $this->table$this->suffix 属性可以触发 __toString
  3. 后续利用:

    • 通过 __toString 可以触发其他类的魔术方法,构建完整的利用链
    • 可能结合文件操作函数实现 RCE 或其他恶意操作
ThinkPHP 6.X 反序列化利用链分析 环境搭建 使用 Composer 创建 ThinkPHP 6.x 项目: 修改控制器代码( application/index/controller/Index.php ): 利用条件 满足以下任意一个条件即可利用: 存在完全可控的反序列化点: unserialize(可控变量) 存在文件上传且文件名完全可控,并使用了文件操作函数: file_exists('phar://恶意文件') 漏洞链分析 背景 ThinkPHP 5.x 的反序列化链通常以 think\process\pipes\Windows 类作为入口,通过触发任意类的 __toString 方法。但在 ThinkPHP 6.x 中, Windows 类已被移除,而 __toString 后的 Gadget 仍然存在。 新的入口点 在 ThinkPHP 6.x 中,我们发现 Model 类可以作为新的入口点: Model 类的 __destruct 方法会调用 save 方法 save 方法会调用 updateData 方法 updateData 方法中调用了 checkAllowFields 方法 关键点在 checkAllowFields 方法中存在字符串拼接操作( vendor/topthink/think-orm/src/Model.php 第584行),可以通过设置 $this->table 或 $this->suffix 为类对象,在拼接时触发其 __toString 方法。 具体实现 由于 Model 是抽象类,我们使用其继承类 Pivot 来构造利用链。 攻击流程图 (此处应插入攻击流程图,描述从 __destruct 到最终利用的完整调用链) 防御建议 避免使用不可信的反序列化数据 及时更新 ThinkPHP 到最新版本 对文件操作进行严格过滤 禁用不必要的 PHP 魔术方法 参考 thinkphp v6.0.x 反序列化利用链挖掘 注意事项 实际利用时需要构造特定的序列化字符串 不同版本的 ThinkPHP 6.x 可能存在差异 利用链可能依赖于特定的环境配置 技术细节补充 Model 类的关键方法调用链: __destruct() → save() → updateData() → checkAllowFields() 字符串拼接触发点: 在 checkAllowFields 方法中,通过控制 $this->table 或 $this->suffix 属性可以触发 __toString 后续利用: 通过 __toString 可以触发其他类的魔术方法,构建完整的利用链 可能结合文件操作函数实现 RCE 或其他恶意操作