从防护角度看Thinkphp历史漏洞
字数 1571 2025-08-18 11:39:26
ThinkPHP历史漏洞分析与防护指南
一、漏洞概述
ThinkPHP框架在2019年初公开了两个高危远程代码执行(RCE)漏洞,影响多个版本,导致大量攻击者利用扫描器进行全网扫描攻击。这些漏洞主要存在于ThinkPHP的Request类中,通过特定构造的HTTP请求可实现代码执行。
二、漏洞原理详解
2.1 ThinkPHP 5.0.x版本漏洞
漏洞位置:thinkphp/library/think/Request.php
核心原理:
- ThinkPHP支持配置"表单伪装变量",默认值为
_method - 在
method()方法中,可通过"表单伪装变量"进行变量覆盖,实现对Request类任意函数的调用 $_POST数组作为参数传入被调用的函数- 攻击者可构造请求覆盖Request类的
filter属性(该属性保存全局过滤函数),从而实现代码执行
2.2 ThinkPHP 5.1.x-5.2.x版本漏洞
漏洞位置:同样位于thinkphp/library/think/Request.php
核心原理:
$method变量等同于POST的_method参数值- 可覆盖
$filter属性值(filter属性保存全局过滤函数) - 需要配置
error_reporting(0)忽略异常提示,否则漏洞触发时程序会因警告级别异常而终止
三、攻击流程分析
3.1 全网扫描阶段
攻击者通常采用两步攻击流程:
-
漏洞探测与利用:
- 扫描器发送精心构造的HTTP请求(exp)
- 写入包含特定指纹的一句话Webshell
- 后续访问该文件验证指纹信息,确认是否成功getshell
-
特征分析:
- 目的IP为相同C段或B段
- 端口较为固定(通常为80/443)
- 扫描时间非常密集
3.2 后渗透阶段
成功getshell后,攻击者会:
- 使用中国菜刀等工具连接Webshell
- 执行远程控制操作
- 进行内网探测和横向移动
四、实际案例分析
4.1 郑州服务器案例(122.114.24.216)
- 确认使用ThinkPHP5框架开发
- Webshell仍存在于服务器上
- 扫描器使用"baidu"作为指纹标识
4.2 四川服务器案例(182.151.214.106)
- 服务器仍可连通,使用ThinkPHP框架
- 发现内网包含192.168.9.0和192.168.56.0两个子网
- 攻击者执行了网络查询命令
4.3 美国服务器案例(161.129.41.36)
- Webshell已被清除
- 发现相同Webshell木马(x.php)
- Webshell密码为"xiao",标志位也是"baidu"
五、防护建议
5.1 漏洞修复
- 及时更新ThinkPHP框架到最新安全版本
- 对于无法立即升级的系统:
- 5.0.x版本:修复Request类的安全处理逻辑
- 5.1.x-5.2.x版本:配置
error_reporting(0)并修复Request类
5.2 安全配置
- 配置Web服务器禁止IP直接访问
- 部署WAF/IPS设备,配置相关防护规则
- 限制不必要的HTTP方法(PUT/DELETE等)
- 严格过滤用户输入,特别是
_method等参数
5.3 监控与响应
- 部署安全设备监测扫描行为:
- 密集的C段/B段扫描
- 固定端口的频繁访问
- 包含ThinkPHP漏洞特征的请求
- 建立日志分析机制,及时发现异常访问
- 定期检查服务器文件完整性,特别是可写目录
六、总结
ThinkPHP历史RCE漏洞因其易用性被广泛用于全网扫描攻击。攻击者通过自动化扫描结合手工渗透的方式获取大量服务器控制权。防护关键在于及时修补漏洞、加强输入过滤、部署安全设备和建立有效监控机制。对于使用ThinkPHP框架的系统,应特别关注Request类的安全处理和全局过滤机制。