蓝易云CDN:ThinkPHP5.1.31怎么查找反序列化风险点
蓝易云CDN:ThinkPHP 5.1.31怎么查找反序列化风险点?
ThinkPHP 5.1.31 是较早的 PHP Web 框架版本,其反序列化安全问题需要结合实际业务代码、框架内部类、第三方依赖及数据来源综合分析。排查重点并不是简单搜索 unserialize(),而是确定外部可控数据能否进入反序列化流程,以及是否存在可触发危险操作的对象调用链。
一、明确反序列化风险形成的条件
PHP 反序列化用于将序列化数据恢复为原始变量或对象。当应用将不可信数据传入 unserialize() 时,可能触发对象中的魔术方法,形成 PHP 对象注入风险。
通常需要重点分析三个条件:
- 数据入口可控:HTTP 参数、Cookie、缓存内容等能否被外部用户影响。
- 反序列化过程可达:可控数据是否实际进入
unserialize()或其他反序列化处理流程。 - 危险调用链存在:对象属性是否能够影响文件操作、动态函数调用等敏感行为。
需要注意,框架存在潜在 POP 调用链,并不代表网站一定存在可被远程利用的漏洞。

二、🔍 全局搜索反序列化入口
进入 ThinkPHP 项目根目录,执行:
grep -RInE --include='*.php' \
'unserialize[[:space:]]*\(|session_decode[[:space:]]*\(' \
application extend thinkphp vendor 2>/dev/null
该命令用于定位业务代码、框架核心和第三方组件中的相关调用。
重点追踪 $_GET、$_POST、$_COOKIE、input()、request()->param() 等数据来源。
同时检查经过 base64_decode()、解压缩或其他转换后再进行反序列化的代码,避免遗漏间接入口。
三、检查 ThinkPHP 5.1.31 的关键类
在该版本官方源码中,以下位置值得重点审计。
1. Windows 类的析构方法
源码位置:
thinkphp/library/think/process/pipes/Windows.php
该类的 __destruct() 会执行 removeFiles(),后者包含 file_exists() 和 unlink() 文件操作。
如果不可信数据能够控制反序列化对象中的文件列表,就需要评估是否存在非预期文件删除风险。
2. Conversion 特征方法
源码位置:
thinkphp/library/think/model/concern/Conversion.php
其中 __toString() 会调用 toJson(),进一步进入 toArray() 处理模型属性。
审计时应关注 $append、$data 等属性如何参与数据转换,以及后续是否调用其他对象方法。
3. Request 类的动态方法调用
源码位置:
thinkphp/library/think/Request.php
该版本的 __call() 支持通过 $hook 调用注册的回调函数,内部使用 call_user_func_array()。
需要检查回调和参数的可控性,而不能仅凭存在该函数就认定能够执行任意命令。
上述位置属于重点审计对象,最终是否形成完整利用链,还取决于类加载、属性状态及实际调用条件。
四、检查缓存和第三方扩展
ThinkPHP 5.1.31 的文件缓存驱动支持 PHP 序列化,缓存读取过程可能调用反序列化方法。
因此,还应检查 Redis、文件缓存、Session 自定义处理器和消息队列中的数据是否可信。
尤其需要确认缓存存储是否存在越权写入、外部直接修改或跨业务共享权限不当等问题。
正常缓存用户提交的普通字符串,并不等于攻击者可以直接注入任意序列化对象,必须结合实际数据处理过程判断。
五、🛡️ 修复与防护建议
发现风险后,建议按以下顺序处理:
- 优先修复入口:禁止将不可信数据直接交给
unserialize(),普通结构化数据尽量使用 JSON。 - 限制对象恢复:确需处理可信历史数据时,评估
allowed_classes限制,并增加完整性校验,但不能将其视为处理不可信数据的充分保障。 - 加强权限隔离:限制缓存目录写入权限,避免敏感目录暴露,降低文件操作风险。
- 升级框架版本:规划迁移至仍获得安全维护的版本,先完成依赖兼容性和业务回归测试。
- 部署前置 WAF:通过蓝易云高防 CDN 监测异常序列化数据、可疑请求和高频探测行为,并根据实际命中特征逐步启用拦截。
对于经过编码、加密或业务内部生成的序列化内容,WAF 不一定能够识别。前置防护不能替代代码修复。
六、如何确认漏洞是否真正存在?
建议在隔离测试环境中使用无害样本,验证数据是否能够进入反序列化流程、是否恢复对象、是否触发魔术方法,以及敏感操作是否可达。
不要仅根据扫描器提示或者框架版本号直接判定远程代码执行成立。
总结: ThinkPHP 5.1.31 反序列化审计的核心是沿着“数据来源→反序列化入口→对象属性→魔术方法→敏感操作”逐步追踪。只有验证完整路径,才能准确评估风险并采取针对性防护措施。