ThinkPHP6.X反序列化利用链
字数 1195 2025-08-26 22:11:15
ThinkPHP 6.X 反序列化利用链分析
环境搭建
- 使用 Composer 创建 ThinkPHP 6.x 项目:
composer create-project --prefer-dist topthink/think=6.0.x-dev tp6x
cd tp6x
./think run
- 修改控制器代码(
application/index/controller/Index.php):
<?php
namespace app\controller;
class Index
{
public function index()
{
$u = unserialize($_GET['c']);
return 'ThinkPHP V6.x';
}
}
利用条件
满足以下任意一个条件即可利用:
- 存在完全可控的反序列化点:
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 或其他恶意操作
- 通过