ThinkPHP 6.0.8反序列化漏洞审计核心是聚焦“可控入口+魔术方法链+危险终点”,通过定位unserialize调用点、验证Model.php等关键类存在性、用PHPGGC快速生成并测试Payload(如ThinkPHP/RCE1)、检查修复痕迹四步完成最小路径验证。

快速审计ThinkPHP 6.0.8反序列化漏洞,核心不是逐行通读全部源码,而是聚焦“可控入口 + 魔术方法链 + 危险终点”三要素,用最小路径验证是否存在可利用POP链。6.0.8属于6.0.x早期稳定版本,已知存在多条成熟利用链,审计目标明确:确认环境中是否存在未修复的反序列化点,并判断是否能被现有链触发。
第一步:定位反序列化入口点
直接搜索项目中所有 unserialize( 调用,重点关注用户可控输入位置:
- 控制器方法中接收 $_GET、$_POST、$_COOKIE 或 file_get_contents('php://input') 后直接反序列化的代码,例如:
unserialize($_POST['data'])、unserialize(base64_decode($_GET['payload'])) - 缓存、日志、会话等组件中可能隐式调用反序列化的逻辑(如自定义Cache驱动、Session处理器),检查
think/cache/driver/或think/session/下相关类 - 特别注意
app\controller\目录下的测试路由或调试接口,CTF和真实系统中常见于index/test、api/debug等非生产路径
第二步:确认框架版本与关键类是否存在
6.0.8对应 think-orm 版本通常为 2.0.1x 左右,需验证关键脆弱类是否在代码中:
- 检查
vendor/topthink/think-orm/src/Model.php是否存在 __destruct() 方法,且内部含if ($this->lazySave) { $this->save(); }逻辑 - 检查
vendor/topthink/think-orm/src/model/concern/Conversion.php是否存在 __toString() 方法,且调用了toJson()→toArray() - 运行
composer show topthink/think-orm确认实际安装版本,避免依赖推测;若版本不符,该链大概率不可用
第三步:用PHPGGC快速验证链可用性
不手写EXP,用工具直击结果:
立即学习“PHP免费学习笔记(深入)”;
- 安装PHPGGC后执行:
php phpggc -l ThinkPHP,查看6.0.x支持的链(如ThinkPHP/RCE1、ThinkPHP/Command) - 选一条链生成基础Payload:
php phpggc ThinkPHP/RCE1 system "echo test" - 将输出的序列化字符串URL编码后,通过curl发送到疑似入口点,观察响应或服务端行为:
curl -X POST http://target.com/index/test --data-urlencode "a=O%3A..." - 若返回
test或触发DNSLog外带,说明链有效;若报错如Class not found或Call to undefined method,则对应类缺失或版本不匹配
第四步:检查修复痕迹与绕过可能性
即使发现链,也要确认是否已被补丁拦截:
- 查看
Model.php中__destruct()是否被注释、删除,或增加了$this->lazySave = false;强制重置 - 检查全局是否禁用了
unserialize,或替换为igbinary_unserialize、json_decode等更安全替代方案 - 留意是否有WAF规则拦截含
O:、:s:等典型序列化特征的请求体——这不代表漏洞不存在,只说明利用被阻断



















