ThinkPHP反序列化漏洞修复核心是禁用或替换所有不受控unserialize()调用,强制启用allowed_classes白名单,禁用Phar协议,升级至6.3.x LTS或8.0.5+版本并收严目录权限。

ThinkPHP反序列化漏洞修复的核心是切断“不可信数据→unserialize()→危险类实例化→魔术方法执行”这条攻击链。最直接有效的做法不是加固链路,而是从源头禁用或替换所有不受控的 unserialize() 调用。
移除或替换所有危险的 unserialize() 调用点
全项目搜索 unserialize(、->unserialize(、Str::unserialize 等关键词,重点检查以下位置:
- 自定义控制器中类似
unserialize($_GET['data'])的调试或兼容代码——必须删除,改用json_decode($input, true) - 缓存驱动(如
think\cache\driver\File、Redis)的read()方法——确认是否对缓存内容直接反序列化;若使用 Redis,需在config/cache.php中设'serialize' => false,改用json_encode()/json_decode()存取 - Session 驱动(如 Memcache、Redis)读取逻辑——若 session 数据被污染,反序列化即触发漏洞,建议统一转为 JSON 格式存储
- 日志回放、错误处理、测试路由等临时功能中残留的反序列化入口——全部清理
强制启用 allowed_classes 白名单机制
PHP 7.4+ 支持 unserialize() 的第二个参数 allowed_classes,这是轻量且强效的兜底防护:
- 将所有
unserialize($data)替换为unserialize($data, ['allowed_classes' => ['App\Model\User', 'DateTime']]) - 业务不依赖反序列化对象时,可设为
false(仅允许数组/标量),但需确认无功能异常 -
严禁将
think\Model、think\Cache、think\Request等框架内置类加入白名单——它们是 POP 链主力输出类 - 空数组
[]或['__PHP_Incomplete_Class']等同于未设限,毫无防护作用
禁用 Phar 协议与危险流封装器
Phar 反序列化是高频利用路径,尤其通过 phar://xxx.jpg/exploit.phar 触发:
- 在
php.ini中确保phar.readonly = On(默认开启,检查是否被手动关闭) - 设置
allow_url_include = Off - 在
disable_functions中加入unserialize, file_put_contents, system, exec, shell_exec, passthru - Nginx 层添加拦截规则:
if ($request_uri ~* "phar://") { return 403; } - 避免在
file_exists()、include()、echo $obj等上下文中直接使用用户控制的对象
升级框架并精简运行环境
旧版本存在已知且无法彻底修补的 POP 链,升级是必要动作:
- ThinkPHP 5.x 全系已停止维护,必须升级至 6.3.x LTS(如 6.3.8)或 8.0.5+
- CVE-2024-44902 影响范围为 v6.1.3–v8.0.4,修复版本为 v8.0.5+ 及 v6.1.4+
- 升级后验证关键文件,如
vendor/topthink/framework/src/think/route/ResourceRegister.php中__destruct是否已移除或加校验 - 收紧目录权限:runtime/ 和 config/ 不可被 Web 访问,public/ 仅可读
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











