thinkphp 6.0.8存在反序列化漏洞,风险源于redis缓存驱动、pivot及model类的魔术方法构成pop链,配合可控入口可导致rce;需从入口拦截(禁用unserialize、改用json)、链路阻断(禁用redis自动反序列化、覆写__destruct)、运行时防护(php回调白名单、phar禁用)三层面系统加固。

ThinkPHP 6.0.8 存在可被利用的反序列化漏洞,核心风险点在于 thinkcachedriverRedis、thinkmodelPivot 及 thinkormModel 等类中魔术方法(如 __destruct、__wakeup)构成的 POP 链,配合用户可控的反序列化入口(如 unserialize($_POST['data']) 或缓存反序列化逻辑),可能触发任意文件写入、SSRF,甚至远程代码执行。
加固不是“打补丁就完事”,而是从入口拦截、链路阻断、运行时防护三个层面系统性收紧。以下是可直接落地的实操步骤:
明确并封禁所有反序列化入口点
ThinkPHP 6.0.8 默认不主动调用 unserialize(),但开发者常在以下位置手动引入风险:
- 自定义控制器中直接使用
unserialize($_GET/$_POST/$_COOKIE['xxx']) - 缓存驱动(如 Redis、File)在反序列化缓存值时未校验来源
- 第三方插件或旧版兼容代码残留(如
thinkhelperStr::unserialize())
✅ 操作建议:
- 全项目 grep 搜索:
unserialize(、->unserialize(、Str::unserialize、serialize(定位写入点) - 删除或重构所有显式
unserialize()调用,改用 JSON 格式传输结构化数据(json_decode($str, true)) - 若必须保留(如兼容老协议),强制添加白名单校验:
$allowed_classes = ['App\Model\User', 'App\Dto\Order']; $data = @unserialize($input, ['allowed_classes' => $allowed_classes]); if ($data === false) { throw new Exception('Invalid serialized data'); }
替换高危缓存驱动并禁用自动反序列化
6.0.8 中 thinkcachedriverRedis 的 get() 方法在 unpack() 时若开启 serialize 选项,会无条件反序列化 Redis 返回的值——这是真实攻击链常用入口。
✅ 操作建议:
- 修改
config/cache.php,将 Redis 驱动的serialize设为false:'redis' => [ 'type' => 'redis', 'host' => '127.0.0.1', 'port' => 6379, 'serialize' => false, // 关键:禁用自动反序列化 'prefix' => 'tp6:', ], - 所有缓存值统一用
json_encode()存储,读取时用json_decode($val, true)解析 - 如需存储对象,先
serialize()→base64_encode()→ 存缓存;读取时base64_decode()→ 再白名单校验后unserialize()
修补或绕过已知 POP 链关键节点
已公开链(如 CacheStore + Model::__destruct → save() → updateData() → autoRelationUpdate())依赖 lazySave、withEvent、relationWrite 等属性可控。
✅ 操作建议:
- 在模型基类(如
appBaseModel)中覆写危险魔术方法,增加校验逻辑:public function __destruct() { // 仅当明确标记为可信实例时才执行 save() if (!isset($this->trusted_for_destruct) || !$this->trusted_for_destruct) { return; } if ($this->lazySave && $this->isAvailableForSave()) { $this->save(); } } - 对
thinkormModel类打热补丁(放在runtime或extend/patch/下),重写save()前插入if (!$this->isTrusted()) return; - 升级至 ThinkPHP 6.3+(官方已移除部分高危链,且默认禁用非安全反序列化)
启用 PHP 层面基础防护
框架加固之外,运行环境需兜底:
✅ 操作建议:
- PHP 配置中设置
unserialize_callback_func(PHP 7.4+):unserialize_callback_func = "my_unserialize_callback"
并在入口文件定义回调函数,对所有未声明类名直接拒绝:
function my_unserialize_callback($class) { $whitelist = ['DateTime', 'stdClass', 'App\Model\SafeData']; if (!in_array($class, $whitelist)) { throw new Exception("Unserialization of class {$class} is forbidden"); } } - 禁用
phar://协议(防 Phar 反序列化扩展攻击):phar.readonly = On
- Web 服务器层(Nginx/Apache)对含
O:、a:、s:等序列化特征的 POST/GET 参数做简单 WAF 规则拦截(辅助手段,不可替代代码层加固)
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











