ThinkPHP5.2.x反序列化利用链
字数 1215 2025-08-26 22:11:15
ThinkPHP5.2.x反序列化利用链深入分析
环境搭建
- 使用Composer创建项目:
composer create-project topthink/think=5.2.x-dev tp52x
cd tp52x
./think run
- 修改控制器代码(application/index/controller/Index.php):
<?php
namespace app\controller;
class Index
{
public function index()
{
$u = unserialize($_GET['c']);
return 'ThinkPHP V5.2';
}
}
利用条件
-
必要条件:
- 存在完全可控的反序列化点(如
unserialize(可控变量))
- 存在完全可控的反序列化点(如
-
可选条件(满足任意一个):
- 存在文件上传功能且文件名完全可控
- 使用了文件操作函数(如
file_exists('phar://恶意文件'))
POP链1分析
攻击链流程
-
起点:
think\process\pipes\Windows类的__destruct方法- 包含文件删除功能
$filename变量可控- 当
file_exists($filename)时,如果$filename是对象,会触发其__toString方法
-
触发toString:
think\model\concern\Conversion的__toString方法- 原5.1.x中的
$relation->visible($name)被移到appendAttrToArray方法 - 关注
getAttr方法,$key来自可控的$data
- 原5.1.x中的
-
关键调用:
getAttr方法- 通过
getData获取$value(可控) - 调用
getValue方法,参数可控
- 通过
-
动态调用:
getValue方法- 使用动态调用:
$closure($value, $this->data) - 当
$closure='system'且$value='命令'时,可执行系统命令
- 使用动态调用:
-
利用类:
Pivot类- 使用了
Attribute和Conversion这两个trait - 可作为构造EXP的载体
- 使用了
EXP构造示例
// 示例:执行curl 127.0.0.1:8888
// 注意:实际EXP代码已省略,请勿用于非法用途
POP链2分析
攻击链流程
-
前半部分:与ThinkPHP5.1.x的POP链相同
- 但在执行到关键调用时,5.2.x移除了
Request类的__call方法
- 但在执行到关键调用时,5.2.x移除了
-
替代方案:使用
Db类的__call方法- 可以实例化任意类
- 结合
Url类的__construct方法进行文件包含
-
利用条件:
- 需要能上传
route.php文件 - 需要知道文件存储路径
- 需要能上传
EXP构造示例
// 示例:包含/tmp/route.php文件
// 注意:实际EXP代码已省略,请勿用于非法用途
防御建议
- 避免使用不可信的反序列化数据
- 严格过滤用户输入
- 限制文件上传功能
- 及时更新框架版本
- 使用安全的反序列化方法(如JSON)
参考资源
- N1CTF2019 sql_manage出题笔记
- thinkphp v5.2.x 反序列化利用链挖掘
- ThinkPHP5.1.x反序列化POP链分析
总结
ThinkPHP5.2.x的反序列化漏洞主要通过两条利用链实现攻击:
- 通过文件操作触发
__toString进而执行任意命令 - 通过文件包含实现远程代码执行
理解这些利用链有助于开发者更好地防御此类漏洞,同时也为安全研究人员提供了分析思路。