# PHP Exploit Chain

> PHP 审计漏洞链组装方法论。当已完成各分类漏洞审计、需要评估多个漏洞组合利用的可行性时触发。 覆盖: 文件写入→文件包含→RCE 链、反序列化→敏感操作链、SQL 注入→文件写入链、 SSRF→内部服务链、信息泄露→权限提升链。同时包含 Composer 依赖 CVE 扫描方法。

- Skill: `wgpsec/php-exploit-chain` (Agent Skill)
- Install (CLI): `npx skillmds@latest add wgpsec/php-exploit-chain`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wgpsec/php-exploit-chain/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: wgpsec (https://skillmd.com/u/wgpsec)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/wgpsec/php-exploit-chain

---


# PHP 审计漏洞链组装方法论
本 skill 是审计流水线 Phase 5 的核心环节。各分类审计 skill 产出独立漏洞清单后，在此评估多个漏洞组合利用的可行性，将单点漏洞串联为完整攻击路径。

## 链组装前提

- 各子审计（P4 阶段）已完成，漏洞清单已产出
- 每个"已确认"漏洞均附有完整的 EVID_* 证据（Source→Sink 路径、可控参数、过滤状态）
- 缺少 EVID 证据的漏洞不参与链组装，只能标注为"潜在链节点"

---

## 常见利用链模式

| # | 入口漏洞 | 中间跳板 | 最终效果 | 严重度 |
|---|----------|----------|----------|--------|
| 1 | 文件写入（任意内容） | `include`/`require` 路径可控 | RCE | Critical |
| 2 | SQL 注入 | `INTO OUTFILE` / `DUMPFILE` | Webshell 落地 | Critical |
| 3 | 反序列化入口 | POP Gadget 链 | 任意操作（文件写/命令执行） | Critical |
| 4 | SSRF | 内部未认证服务（Redis/FastCGI） | RCE / 数据泄露 | High-Critical |
| 5 | 信息泄露（密钥/盐值） | 伪造签名 / 解密 Token | 认证绕过 | High |
| 6 | XSS（存储型） | CSRF Token 窃取 | 管理员操作劫持 | High |

## 链组装流程

1. **收集已确认漏洞** — 汇总所有子审计产出，仅纳入 EVID 证据完整的条目。按漏洞类型标注其"输出能力"（可写文件、可发请求、可泄露数据、可执行代码）
2. **构建漏洞关系图** — 判断每个漏洞的输出是否可作为另一漏洞的输入（文件写入路径→文件包含路径、信息泄露内容→认证伪造密钥、SSRF 可达范围→内部服务地址）
3. **寻找 Source→Sink 链对** — 沿关系图搜索从低权限入口到高影响 Sink 的最短路径，优先关注无需认证的入口点
4. **验证链条前置条件** — 逐步确认: 认证要求（权限断层）、网络可达（目标网段）、时序依赖（文件清理/Session 过期）、环境约束（`open_basedir`/`disable_functions`/`secure_file_priv`）
5. **计算链严重度** — `Score = R * 0.40 + I * 0.35 + C * 0.25`（与 pipeline 一致），链条取最弱环节的 R/I/C 值，任何一步不可达则整条链不成立

## 各链模式详细条件

**文件写入 + include → RCE**: 写入路径必须在 `include_path` 或 Web 根目录下；写入内容必须包含可控的 PHP 代码片段；`include`/`require` 的路径参数必须可控或可预测（如固定日志路径）。

**SQL 注入 + INTO OUTFILE → Webshell**: 数据库用户需具备 `FILE` 权限；`secure_file_priv` 必须为空或包含 Web 目录；写入路径必须 Web 可直接访问；目标文件不能已存在（`OUTFILE` 不覆盖）。

**反序列化 + POP 链 → 任意操作**: 用户可控数据到达 `unserialize`/`phar://` 触发点；项目或 Composer 依赖中存在可用的 Gadget 类；`__destruct`/`__wakeup` → 危险 Sink 的调用链完整可达。

**SSRF + 内部服务 → RCE/数据泄露**: `gopher://` 或 `http://` 协议可用（未被 `CURLOPT_PROTOCOLS` 限制）；目标内部服务无认证（Redis 无密码、FastCGI 无访问控制）；响应可回显或支持盲利用（DNS/延时）。

**信息泄露 + 伪造签名 → 认证绕过**: 泄露的密钥为实际签名密钥（非测试值）；签名算法已知且可本地复现；伪造的 Token/Cookie 在有效期内且未被吊销机制拦截。

**XSS + CSRF → 管理员操作劫持**: XSS 为存储型或可持久触发；目标管理页面无独立 CSRF Token 或 Token 可通过 XSS 读取；关键操作（添加管理员/修改配置）无二次确认。

## Composer 依赖审计

- 解析 `composer.lock` 获取所有直接 + 间接依赖的精确版本号
- 比对 [Packagist Security Advisories](https://packagist.org/advisories) 和 CVE 数据库（NVD/GitHub Advisory）
- 重点关注间接依赖（`require` 的包所依赖的包）中的已知漏洞 — 开发者往往忽略
- 工具辅助: `composer audit`（Composer 2.4+）、`local-php-security-checker`
- 发现的依赖 CVE 同样纳入利用链关系图，评估是否可与业务漏洞串联

## 链不可行时的报告要求

当链条无法成立时，必须明确说明断裂点:
- 具体哪一步的前置条件不满足（如 `secure_file_priv` 限制了写入路径）
- 该条件是否可能在其他环境/配置下成立（标注为"环境依赖"）
- 是否存在替代路径绕过该断裂点

## 检测清单

- [ ] 所有已确认漏洞已汇总，EVID 证据完整性已复核
- [ ] 漏洞关系图已构建，输出→输入对应关系已标注
- [ ] 每条可行链的前置条件已逐步验证
- [ ] 环境约束（`open_basedir`/`disable_functions`/`secure_file_priv`）已确认
- [ ] 链严重度已按最弱环节计算，评分与 pipeline 一致
- [ ] 不可行链条已标明断裂点和原因
- [ ] Composer 依赖 CVE 已扫描并纳入链评估
- [ ] 链条利用路径已在源码层面完整验证

