thinkphp 5.1.31存在cve-2018-20062等rce漏洞,风险点在于控制器名过滤不严导致任意类实例化与反序列化入口(如unserialize($_post['test']))结合pop链(如windows::__destruct→removefiles→__tostring触发conversion)可实现远程代码执行。

ThinkPHP 5.1.31 属于已知存在反序列化漏洞的高危版本(CVE-2018-20062 等影响范围明确包含该版本),查找风险点不能只靠“扫描”,而要聚焦代码中是否暴露了可控的 unserialize() 入口,以及是否引入了可被利用的魔术方法调用链。以下是实操性强的排查路径:
一、全局搜索显式反序列化调用
在项目根目录执行以下命令,快速定位所有可能入口:
- grep -r "unserialize(" ./app/ ./common/ ./extend/ --include="*.php" —— 重点检查控制器、中间件、命令行指令类
-
grep -r "base64_decode.*unserialize\|unserialize.*base64_decode" . --include="*.php" —— 常见混淆写法,如
unserialize(base64_decode($_GET['data'])) - 特别关注接收用户输入的函数:如
input('data')、$_POST['xxx']、$request->param('payload')后紧跟unserialize()的组合
二、检查第三方扩展与缓存驱动
很多风险来自非框架原生代码:
- 查看
composer.json中是否引入了旧版缓存组件(如topthink/think-cachev1.x)、日志驱动或自定义 session 处理器,它们可能隐式调用unserialize()读取存储数据 - 检查
config/cache.php中'type' => 'file'或'type' => 'redis'配置下,是否启用了 PHP 原生序列化('serialize' => true)—— 这会使缓存内容成为潜在反序列化入口 - 搜索
vendor/目录下是否有自定义类继承了think\Cache并重写了get()方法,且未对返回值做类型校验就直接反序列化
三、定位关键利用链涉及的类与方法
5.1.31 已知可触发 RCE 的核心链始于 think\process\pipes\Windows,需人工确认是否存在被实例化的可能:
- 在项目中全局搜索
new Windows(、Windows::、use Windows,尤其检查异步任务、进程管理、文件清理等业务逻辑 - 检查模型类是否被不当继承:如自定义 Model 类继承
think\Model,又未禁用__toString()行为,可能被用于构造Conversion链路 - 搜索
Request::或$this->request后调用input()、param()、isAjax()等方法的位置,确认其参数是否由用户控制并流入__call()触发点
四、验证调试模式与错误信息泄露
即使没有直接反序列化点,开启调试也会极大降低攻击门槛:
- 检查
config/app.php中'app_debug' => true是否仍启用 —— 开启状态下,报错会暴露类名、路径和调用栈,帮助攻击者精准拼接 POP 链 - 访问任意非法路由(如
/index.php?s=/test/abc),观察是否返回 ThinkPHP 默认调试页;若返回,说明app_debug=true且未被生产环境覆盖 - 检查
runtime/log/下日志文件是否记录了反序列化异常(如Notice: unserialize(): Error at offset),这类日志可能暗示存在未捕获的尝试性利用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











