ThinkPHP 命令执行漏洞-01
字数 1401 2025-08-18 11:38:49

ThinkPHP 5.x 远程代码执行漏洞分析及防御指南

漏洞概述

ThinkPHP官方于2018年12月9日发布重要安全更新,修复了一个严重的远程代码执行漏洞。该漏洞源于框架对控制器名检测不严格,在未开启强制路由的情况下可能导致攻击者执行任意代码(getshell)。

受影响版本

  • ThinkPHP 5.x < 5.1.31
  • ThinkPHP 5.x <= 5.0.23

漏洞原理分析

漏洞触发点

漏洞利用的核心在于ThinkPHP框架对控制器名的处理机制存在缺陷,攻击者可以通过特殊构造的URL调用任意类的方法。

漏洞利用流程

  1. 请求处理流程

    • 请求通过index.php入口文件加载ThinkPHP框架
    • 执行think\App::run()方法
    • 进入路由检测方法routeCheck()
  2. 路径信息获取

    • 框架从GET参数's'中获取pathinfo信息(默认配置'var_pathinfo'为's')
    • 示例恶意payload:index/think\App/invokefunction
  3. 路由解析

    • Route::parseUrl()调用parseUrlPath()方法
    • 仅通过'/'分割路径,未进行充分过滤
  4. 控制器实例化

    • Loader::controller方法解析控制器名为"think\app"
    • 通过App::invokeClass($class)实例化指定类
  5. 方法调用

    • 最终通过invokeMethod调用call_user_func_array
    • 执行攻击者指定的系统命令

POC示例

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

漏洞补丁分析

5.0.x版本补丁

补丁地址:https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f

主要修复内容:

  • 加强了对控制器名的合法性检查
  • 增加了对特殊字符的过滤

5.1.x版本补丁

补丁地址:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815

主要修复内容:

  • 改进了路由解析机制
  • 增加了更严格的安全检查

防御措施

  1. 立即升级

    • 升级到ThinkPHP 5.1.31或更高版本
    • 或升级到ThinkPHP 5.0.23以上版本
  2. 配置加固

    • 开启强制路由配置('url_route_must' => true)
    • 限制可访问的控制器范围
  3. 其他安全建议

    • 部署WAF防护
    • 定期进行安全审计
    • 遵循最小权限原则运行Web服务

技术细节深入

漏洞利用关键点

  1. 命名空间利用

    • 通过反斜杠\实现命名空间跳转
    • 绕过默认的控制器限制
  2. 动态方法调用

    • 利用invokefunction调用任意类方法
    • 通过call_user_func_array实现命令执行
  3. 参数传递机制

    • 通过vars数组传递执行参数
    • 实现任意命令的参数传递

漏洞利用限制条件

  1. 必须未开启强制路由
  2. 需要知道或猜测框架安装路径
  3. 需要Web服务器有执行系统命令的权限

总结

该漏洞是ThinkPHP框架中一个典型的安全问题,源于对用户输入验证不足导致的远程代码执行。开发人员应及时升级到安全版本,并遵循安全开发最佳实践,避免类似漏洞的发生。

ThinkPHP 5.x 远程代码执行漏洞分析及防御指南 漏洞概述 ThinkPHP官方于2018年12月9日发布重要安全更新,修复了一个严重的远程代码执行漏洞。该漏洞源于框架对控制器名检测不严格,在未开启强制路由的情况下可能导致攻击者执行任意代码(getshell)。 受影响版本 ThinkPHP 5.x < 5.1.31 ThinkPHP 5.x <= 5.0.23 漏洞原理分析 漏洞触发点 漏洞利用的核心在于ThinkPHP框架对控制器名的处理机制存在缺陷,攻击者可以通过特殊构造的URL调用任意类的方法。 漏洞利用流程 请求处理流程 : 请求通过 index.php 入口文件加载ThinkPHP框架 执行 think\App::run() 方法 进入路由检测方法 routeCheck() 路径信息获取 : 框架从GET参数's'中获取pathinfo信息(默认配置'var_ pathinfo'为's') 示例恶意payload: index/think\App/invokefunction 路由解析 : Route::parseUrl() 调用 parseUrlPath() 方法 仅通过'/'分割路径,未进行充分过滤 控制器实例化 : Loader::controller 方法解析控制器名为"think\app" 通过 App::invokeClass($class) 实例化指定类 方法调用 : 最终通过 invokeMethod 调用 call_user_func_array 执行攻击者指定的系统命令 POC示例 漏洞补丁分析 5.0.x版本补丁 补丁地址:https://github.com/top-think/framework/commit/b797d72352e6b4eb0e11b6bc2a2ef25907b7756f 主要修复内容: 加强了对控制器名的合法性检查 增加了对特殊字符的过滤 5.1.x版本补丁 补丁地址:https://github.com/top-think/framework/commit/802f284bec821a608e7543d91126abc5901b2815 主要修复内容: 改进了路由解析机制 增加了更严格的安全检查 防御措施 立即升级 : 升级到ThinkPHP 5.1.31或更高版本 或升级到ThinkPHP 5.0.23以上版本 配置加固 : 开启强制路由配置('url_ route_ must' => true) 限制可访问的控制器范围 其他安全建议 : 部署WAF防护 定期进行安全审计 遵循最小权限原则运行Web服务 技术细节深入 漏洞利用关键点 命名空间利用 : 通过反斜杠 \ 实现命名空间跳转 绕过默认的控制器限制 动态方法调用 : 利用 invokefunction 调用任意类方法 通过 call_user_func_array 实现命令执行 参数传递机制 : 通过vars数组传递执行参数 实现任意命令的参数传递 漏洞利用限制条件 必须未开启强制路由 需要知道或猜测框架安装路径 需要Web服务器有执行系统命令的权限 总结 该漏洞是ThinkPHP框架中一个典型的安全问题,源于对用户输入验证不足导致的远程代码执行。开发人员应及时升级到安全版本,并遵循安全开发最佳实践,避免类似漏洞的发生。