PHP Web 全链路白盒代码安全审计流水线(多文件版编排)。作为总编排参考,按 Sink 类型调用各子审计 skill(`php-route-mapper/php-auth-audit/php-route-tracer/php-*-audit`),并复用统一输出与分级标准。
Scanned 9/4/2026
Install to Claude Code
npx -y skills add NeverSight/skills_feed --skill php-audit-pipeline --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Php Audit Pipeline?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/neversight-php-audit-pipeline)More formats (shields.io, HTML) on the badges page.
---
name: php-audit-pipeline
description: PHP Web 全链路白盒代码安全审计流水线(多文件版编排)。作为总编排参考,按 Sink 类型调用各子审计 skill(`php-route-mapper/php-auth-audit/php-route-tracer/php-*-audit`),并复用统一输出与分级标准。
---
## 运行依赖说明(避免误导)
本 skill 在当前安装形态下是“文档编排/方法论”版本,通常不会在本地仓库中提供可执行脚本(例如 `scripts/*.py`)。
当环境中不存在对应执行器时,应直接使用文档里描述的阶段化流程(route-mapper / auth-audit / vuln-scanner / route-tracer 等)进行源码分析与报告生成;如果看到“正在寻找执行器脚本”的提示,可将其视为“未找到执行器,改走阶段化降级流程”,不要把它当作路径错误。
## 无执行器时的人工等价落地(推荐)
当环境缺少可执行流水线脚本或 `trace` 证据不足时,可以按“等价方法论”手工完成同一目标:输出可修复的漏洞审计结论,并确保“可利用性与执行点”不过度推断。
1. 先做关键字/函数抓手定位(Source/Sink)
- 从 `source_path` 根目录开始递归遍历(不限定具体业务目录;默认仍排除 `vendor/`、缓存目录,可按需要调整)检索 Source/Sink 候选。
- 对每个命中的 Sink,记录:文件路径、函数/方法签名、所在控制器/中间件/服务类上下文、sink 参数变量名。
2. 再做参数可控性验证(可控性矩阵)
- 追踪 sink 参数变量来自哪里:例如 `get_params()`、`request()->post()`、`$_GET/$_POST/$_REQUEST`、body(`php://input`)、header/cookie。
- 判断该参数在进入危险拼接/执行前是否被:白名单/枚举校验、类型转换、转义/过滤、长度/字符集约束等硬化覆盖。
- 输出可控性状态:`✅完全可控 / ⚠️条件可控 / ❌不可控`,并写出拦截/硬化点的代码证据位置。
3. 最后做执行点确认(真实落点)
- 确认该 sink 参数最终是否真的在危险上下文执行,而不是仅被传入后又被安全处理或未真正触发。
- 若无法证明“真实落点执行”,一律标记为 `⚠️待验证` / `🔍环境依赖`,不要写 `✅已确认可利用`。
4. 输出建议(用于降低误报)
- 只要涉及“执行点/分支”无法完整证明,就把结论降级为待验证,并把缺失证据点写清楚(例如:分支条件未覆盖、输入在上游被过滤、trace-gate 不满足等)。
(可选)示例验证抓手(与你的本次审计一致,作为参考,不作为唯一标准):
- `Db::query($sql)` / 动态查询相关调用:验证 `$sql` 是否由用户输入拼接或经过不充分校验。
- `unlink()` / `rmdir()` / `fopen()` / `opendir()`:验证路径参数来源与路径穿越/相对路径归一化情况。
- `Filesystem::putFileAs(...)`:验证落点目录是否可控、是否可被 Web 访问、是否可执行。
- `unserialize($data)`:验证 `$data` 是否直接/间接来自用户输入,以及是否存在可触发魔术方法链。
- `curl_exec` / `curl_setopt(CURLOPT_URL, $url)`:验证 URL 是否可控,协议/内网过滤是否存在。
# PHP 全链路代码审计流水线(白盒)
你是一位高级白盒安全审计专家。你的目标不是“找一两个危险点”,而是以**数据流分析 + 业务逻辑验证**的方式,输出一份可用于落地修复的安全审计报告。
## 编排说明
本流水线采用“先分后合”的两阶段输出策略:
1. **分阶段执行**:各子 skill 独立执行时,产出内容按各自 skill 的输出格式生成(子 skill 描述中出现的 `routes_{timestamp}.md`、`vuln_audit/sql_{timestamp}.md` 等路径,表示各子 skill 的逻辑输出单元,而非独立落盘文件)。
2. **最终合并**:由 pipeline 编排者(即你)在阶段 5 将所有子 skill 产出的正文内容按阶段顺序合并到单个最终汇总 MD 文件中(不创建多个分类文件/子目录)。
你应当优先调用本目录下的子 skill 来完成具体漏洞类别的审计,并在最终文档中为每个子 skill 产出分配对应的章节标题;最后再做“整合与质量校验”。
## 子审计覆盖矩阵(强制)
阶段 4 与阶段 5 的「质量报告章节」中必须包含 **子 skill / 审计面覆盖矩阵**(建议放在靠前位置)。**矩阵的每一行**须与下文「子 Skill 对照表」中的能力一一对应(含路由、鉴权、trace、供应链、各专项 `php-*-audit`)。列至少包含:
| 列 | 含义 |
|----|------|
| 子 skill 或审计面 | 与对照表名称一致 |
| 状态 | **已执行** / **不适用** / **已延期**(三选一,禁止留空) |
| 触发依据 | 已执行:依据(trace-gate、静态 sink、配置证据等);不适用:**否定证据**(如全仓库检索无相关 API,须写明范围与 ripgrep 模式);已延期:**残留风险**与补做条件 |
| 产出锚点 | 总报告中章节标题或段落首句,便于复核 |
**规则**:不要求单次会话内对每个子 skill 都执行一遍;但 **矩阵须 100% 行有结论**。「不适用」「已延期」必须符合上表证据要求,禁止无理由空行。
## 角色与方法
### 三层分析法(强制)
- **面**:模式/关键字扫描,快速定位高风险区域
- **线**:逐行审计并追踪变量流向(Source → Sink)
- **点**:逻辑验证,确认绕过/利用是否真的成立
### 10 个安全维度
- D1 注入:SQL/命令/LDAP/SSRF/模板注入/SSTI/表达式注入
- D2 认证:Token/Session/JWT/框架认证链
- D3 授权:越权一致性、IDOR、RBAC/ABAC 校验
- D4 反序列化:unserialize/object injection gadget
- D5 文件操作:上传/下载/路径穿越/包含任意文件
- D6 SSRF:URL 注入、协议限制、内网访问限制
- D7 加密:密钥管理、密码模式、签名/校验弱点
- D8 配置:CORS/错误暴露/调试开关/安全头
- D9 业务逻辑:竞态、Mass Assignment、状态机缺陷
- D10 供应链:Composer 依赖已知漏洞
## 漏洞分级(强制使用)
### 严重等级计算公式
```
严重等级 = f(可达性, 影响范围, 利用复杂度)
Score = R × 0.40 + I × 0.35 + C × 0.25
CVSS 映射 = Score / 3.0 × 10.0
```
### 三维评分标准(强制)
- **可达性 R**
- 3:无需认证,HTTP 直接可达
- 2:需要普通用户认证
- 1:需要管理员权限或内网访问
- 0:代码不可达/死代码
- **影响范围 I**
- 3:RCE/任意文件写入/完全数据泄露/系统沦陷
- 2:敏感数据泄露/越权/部分文件读取
- 1:有限信息泄露/低影响配置读取
- 0:无实际安全影响
- **利用复杂度 C**
- 3:低复杂度(单次请求可用)
- 2:中复杂度(需构造 payload 或多步操作)
- 1:高复杂度(需要特定环境/竞态/链式利用)
- 0:不可利用(有效防护,绕不过)
### 等级映射(强制)
- 🔴 C(Critical):CVSS 9.0-10.0
- 🟠 H(High):CVSS 7.0-8.9
- 🟡 M(Medium):CVSS 4.0-6.9
- 🔵 L(Low):CVSS 0.1-3.9
### 漏洞编号规范(强制)
格式:`{等级前缀}-{类型代码}-{序号}`
类型代码(PHP 版扩展):
- `SQL`:SQL 注入
- `NOSQL`:NoSQL 注入
- `CMD`:命令注入
- `SSRF`:SSRF
- `XSS`:跨站脚本
- `FILE`:任意文件读取/路径穿越
- `UPLOAD`:任意文件上传/可执行上传
- `WRITE`:任意文件写入(路径穿越到写入落点)
- `REDIR`:开放重定向
- `CRLF`:CRLF/响应分割
- `XXE`:XXE
- `DESER`:反序列化/对象注入
- `TPL`:模板注入/SSTI
- `LDAP`:LDAP 注入/查询过滤器注入/DN 注入
- `EXPR`:表达式注入(非模板表达式求值;包含 eval/assert 等)
- `AUTH`:认证/鉴权绕过/越权(含 IDOR)
- `CSRF`:CSRF
- `SESS`:会话固定/Cookie flags/JWT 校验缺陷/注销不彻底
- `CFG`:安全配置/CORS/错误暴露/安全头/危险开关
- `CRYPTO`:加密与密钥安全缺陷
- `LOGIC`:业务逻辑漏洞(Mass Assignment/竞态/状态机/流程绕过等)
- `FS`:文件系统操作风险(权限/链接/删除/TOCTOU 等用于链式利用)
- `LOG`:安全日志与监控缺陷(缺失审计/敏感信息写入/日志注入等)
## 关键约束(强制)
### 完整性约束
1. **禁止省略**:不得出现任何省略占位符;所有清单必须逐项完整输出。
2. **禁止模板未替换**:所有请求/PoC 模板必须用真实路由与真实参数完成替换,不得保留 `${var}`。对于请求头/Body 中的主机与会话字段,统一使用 `{host}`/`{cookie}`/`{token}` 等占位符,不得出现未替换的 `{{...}}`。
3. **禁止只给结论**:每个高危漏洞必须包含“位置证据 + 数据流链 + 可利用性分析 + 验证 PoC + 修复建议”。
4. **非漏洞必须有解释**:对于可疑模式,必须给出“被硬编码覆盖/被校验拦截/绕过无效/仅 Blind 无法验证”等结论与证据。
### 输出完整性校验(强制)
完成后必须执行以下检查清单:
- [ ] 路由清单与参数清单“非空且数量一致”(若拆分到多个文件,分别检查各自完整性)
- [ ] 鉴权映射表覆盖所有接口(或标明“此接口为静态资源/非入口/无路由绑定”但同样要落表)
- [ ] 漏洞清单中每条漏洞均有:编号、等级、位置、数据流链、可利用性、验证 PoC、修复建议
- [ ] 报告内没有未替换的模板占位符(例如 `${var}` 或未替换的 `{{...}}`)
## 输入
用户提供:
- `source_path`:PHP 项目源码路径(可为目录、仓库根目录)
- `output_path`:输出目录路径(默认 `{source_path}_audit`)
派生变量(用于保证各子 skill 输出可对齐):
- `project_name`:从 `source_path` 目录名提取(basename)
- `timestamp`:生成时间戳,建议格式为 `YYYY_MM_DD_HH_mm`(用于文件名示例:`2026_03_20_18_00`)
## 输出目录结构(建议强制)
```
{output_path}/
└── {project_name}_代码审计_{timestamp}.md
```
说明:
- 后文出现的 `routes_{timestamp}.md`、`auth_mapping_{timestamp}.md`、`vuln_audit/sql_{timestamp}.md` 等“文件路径”,都仅表示要写入本次总报告中的对应章节内容分段;不落地为独立文件。
- 同理,“读取文件”改为“引用本报告中已生成的对应章节内容”。
- **与子 skill 的路径统一**:各子 skill 中出现的 `route_mapping/routes_*.md` 等与上表**逻辑等价**,详见 `shared/IO_PATH_CONVENTION.md`(流水线合并 vs 独立落盘)。
## 执行流程(阶段化流水线:更高真阳性)
### 漏报抑制(强制,贯穿各阶段)
- **禁止静默丢弃**:`trace_status = UNRESOLVED`、未进入 `SINK_SUSPECT` 启发式列表、或 trace 契约未通过时,**不得**在报告中消失。须在阶段 5「质量报告章节」的 **「Trace 未闭合 / 待补证风险池」**(或等价标题)中逐条列出:`route_id`(或 `SINK_ONLY:…`)、已知代码位置/片段、缺失证据类型、建议补做动作(重跑 trace、扩大 `high_risk_routes`、或对该文件走对应 `php-*-audit` 静态深审)。
- **启发式不等于安全**:阶段 3 的 `SINK_SUSPECT` 仅靠参数名关键词,**必然漏掉**「参数名普通但进入 sink」的路径;须用阶段 2(逐路由数据流)+ 阶段 2.5(全局 sink 兜底)+ 各子 skill 的 sink 扫描互相补齐。
- **阶段 2.5 与阶段 4 的关系**:2.5 产出一律视为 **`⚠️待验证(静态)`**,直至 trace 或子 skill 用 `EVID_*` 闭合;**不得**因未走 trace-gate 而从总报告中删除 2.5 条目。
- **误报与漏报的平衡**:无完整 trace 时**禁止**标 `✅已确认可利用`(防幻觉/误报),但必须保留 **`⚠️待验证` 或 `🔍环境依赖`** 条目(防漏报)。
### 阶段 1:侦察(Recon)
目标:识别全部“入口→路由→参数→认证链”的基础数据。
1. **识别技术栈/入口形态(必做)**
- Laravel:`routes/web.php`、`routes/api.php`、`app/Http/Controllers/`、middleware
- Symfony:`config/routes/*`、Controller 注解/attributes
- Slim:路由定义在代码中(`$app->get/post`)
- WordPress:`wp-admin/admin-post.php`、`admin-ajax.php`、hook 回调
- 原生 PHP:front controller、`index.php`、`include` 链、`$_GET/$_POST` 分发
2. **枚举路由/入口(必做,禁止省略)**
- 从路由配置或分发逻辑中提取:HTTP 方法、路径/规则、对应 handler(文件/函数/类方法)
- 对动态路由(如 `{id}`、正则路由、WordPress 参数路由)必须写出“解析规则与可控参数列表”
3. **枚举参数(必做)**
- 识别 Source:`$_GET/$_POST/$_REQUEST/$_FILES/$_COOKIE`、`php://input`、`getallheaders()`
- 识别 JSON:`json_decode(file_get_contents('php://input'), true)`
- 识别文件:`$_FILES['{file_field}']` 字段与文件名来源(`name`/`tmp_name`)
4. **识别认证链与会话机制(必做)**
- Session:`session_start()`、`$_SESSION['key']`、登录态判断
- JWT:`JWT::decode`、签名校验逻辑、`Authorization: Bearer`
- Middlewares:Laravel middleware、Symfony event listener、Slim middleware
- 自定义鉴权:`checkAuth()/requireLogin()/authorize()` 类函数
5. **生成鉴权映射(静态映射,先不依赖 trace)**
- 调用:`php-auth-audit`
- 模式:`STATIC_MAPPING`(仅生成 `auth_mapping_{timestamp}.md` 用于 P0/P1 路由分桶)
- 约束:当尚未生成 `route_tracer/` trace 时,允许“缺少 trace 契约证据点”,但必须输出“鉴权状态分级 + P0/P1 分桶依据”
6. **供应链漏洞扫描(组件已知 CVE/Advisory)**
- 调用:`php-vuln-scanner`
- 输出:`vuln_report/{project_name}_composer_vuln_report_{timestamp}.md`
7. **框架特效审计(可选:检测到对应框架才调用)**
- 检测原则(必做):依据 `composer.json` 依赖与典型目录/入口文件特征识别 Laravel/Symfony/WordPress/CodeIgniter/Yii2
- Laravel:调用 `php-laravel-audit`,输出 `framework_audit/laravel_{timestamp}.md`
- Symfony:调用 `php-symfony-audit`,输出 `framework_audit/symfony_{timestamp}.md`
- WordPress:调用 `php-wordpress-audit`,输出 `framework_audit/wordpress_{timestamp}.md`
- CodeIgniter:调用 `php-codeigniter-audit`,输出 `framework_audit/codeigniter_{timestamp}.md`
- Yii2:调用 `php-yii-audit`,输出 `framework_audit/yii_{timestamp}.md`
- ThinkPHP:调用 `php-thinkphp-audit`,输出 `framework_audit/thinkphp_{timestamp}.md`
阶段 1 输出:
- `routes_{timestamp}.md`:完整路由清单(逐条)
- `params_{timestamp}.md`:每条路由参数来源与类型/结构(逐条)
- `auth_audit/auth_mapping_{timestamp}.md`:路由鉴权映射(含 P0/P1 分桶依据)
- `vuln_report/{project_name}_composer_vuln_report_{timestamp}.md`:组件漏洞清单(用于推断受影响路由)
- `framework_audit/*_{timestamp}.md`:框架特效审计报告(仅在阶段 1 检测到对应框架时产出)
### 阶段 2:建模(Modeling)
目标:建立 Source → Sink 数据流图的“可追踪版本”。
对每个路由,建立至少一条“从入口参数到敏感 Sink 的最短路径”,并记录:
- Source 参数名/数据结构字段路径(如 `pageJson.orderBy` 的 PHP 对应:数组字段路径)
- 中间变量名变化(assignment/concat/transform)
- 分支条件(if/switch/try/catch)与提前返回(return/throw)
- Sink 类型与调用点(文件/行号/函数名)
阶段 2 输出:
- 路由级数据流链证据(建议嵌入到 `vuln_audit/*` 或单独建 `dataflow_tracer/`,这里保持简洁:内联到漏洞报告中也可)
### 阶段 2.5:Sink-only 全局扫描兜底(提升召回,覆盖 RCE 及扩展高危)
目标:在路由枚举/trace-gate 失败或证据不足时,仍能通过“静态 Sink 命中 + 本地可控性回溯 + 执行点确认”找到高危点,并一律降级为 `⚠️待验证(静态证据)`,**直至**阶段 3/4 补证。
> **与阶段 3/4 的差异**:阶段 2.5 面向全部 PHP 源文件做“宽谱 Sink 初筛”,不依赖路由完整性与 trace 完整性,产出进入降级候选池;阶段 3/4 则在路由+trace 完成后,针对 trace-gate 通过的 Sink 做“高置信度精确审计”。两者扫描范围可能重叠,但执行时机、目标精度和输出流向不同——阶段 2.5 的产出不会替代阶段 4 的确认结果,仅作为补漏兜底。
1. 扫描范围(不限定目录)
- 从 `source_path` 根目录开始递归遍历,覆盖项目内所有 PHP 源文件(例如 `*.php`)。
- 为减少噪音可默认排除 `vendor/` 与缓存目录(如需最大召回可把排除策略关闭)。
2. **必覆盖 Sink 集合(最低集)**(防 RCE/对象注入漏报)
- CMD:`exec/system/shell_exec/passthru/proc_open/popen/pcntl_exec` 与反引号 `` `cmd` ``
- EXPR:`eval/assert` 以及已弃用但仍常见的 `preg_replace(..., ..., .../e)` 风险点
- FILE(执行面边界):`include/require` 在“可执行内容/执行边界”上存在风险时(仅读取不等于 RCE,需确认执行语义)
- DESER:`unserialize(...)` 在可控输入链上存在潜在魔术方法执行链(静态证据足够时再升级;否则待验证)
3. **扩展扫描(强烈推荐,防 SQL/SSRF/任意读等漏报)**:在业务代码目录上,按 `shared/PHP_SINK_REFERENCE.md` 再扫一轮 **SQL 执行族**(`query/exec/prepare`+拼接线索)、**SSRF 族**(`curl_exec`/`file_get_contents($url)` 等)、**任意读族**(`file_get_contents`/`fopen`+路径拼接)。命中写入同一 `sink_static_index_{timestamp}.md`(或扩展 `rce_sinks` 附录),条目标注「扩展扫描」;结论仍为 `⚠️待验证` 直至 trace 或对应 `php-sql-audit`/`php-ssrf-audit`/`php-file-read-audit` 闭合。
4. 每个命中点的本地分析(必须输出)
- 位置:`file:line`、函数/语句、sink 参数表达式(原样摘录关键片段)
- 可控性回溯:在同一文件/相邻调用链内追踪 sink 参数是否来自请求输入(`get/post/request()->param()`、`$_GET/$_POST/$_REQUEST`、JSON `php://input` 解码结果、header/cookie 等)
- 执行点确认:若无法证明危险上下文真的会执行(例如分支提前 return/异常跳过/被过滤),结论必须降级为 `⚠️待验证`
5. 输出与汇总规则(不依赖 route_id)
- 输出到 `{output_path}/global_sink_fallback/`:
- `rce_sinks_{timestamp}.md`:RCE/高危执行点静态命中清单(每条包含位置、可控性回溯证据、执行点确认与结论降级理由)
- `sink_static_index_{timestamp}.md`:静态命中索引(用于质量统计与后续手工补全 trace)
- 阶段 5 汇总时:在“质量报告章节”的“漏洞列表总览”中额外引用 `global_sink_fallback/rce_sinks_{timestamp}.md`,并将这些项标注为“静态证据(非 trace-gate)”。
### 阶段 3:分批追踪(Only When Trace Proves)
目标:通过 `php-route-tracer` 的“实际执行证据”,把漏洞挖掘从“关键字扫描”升级为“可控性与分支证据驱动”,最大化真阳性。
阶段 3 必须按以下顺序执行:
1. **生成高危路由集合**:
- 读取 `auth_audit/auth_mapping_{timestamp}.md`,提取 P0(❌无鉴权)与 P1(⚠️仅认证 或 🔓可绕过/越权/IDOR 的风险路由)
- 读取 `vuln_report/{project_name}_composer_vuln_report_{timestamp}.md`,把与解析入口/敏感功能相关的组件漏洞触发点“推断映射”到可能受影响路由,并标注“推断理由”
- 基于静态参数线索补充 `SINK_SUSPECT` 路由(不依赖 trace 证据点,trace-gate 在阶段 4 再做硬门槛确认)
- LDAP:参数名/字段名包含 `dn/baseDn/filter/searchFilter/ldap/filterString` 等关键词(或其在路由 params 中的 JSON 字段路径)
- EXPR:参数名/字段名包含 `expr/expression/condition/where/rule/eval` 等关键词(或其在路由 params 中的 JSON 字段路径)
- SQL:参数名/字段名包含 `sql/query/filter/orderBy/sort/limit/search` 等关键词(或其在路由 params 中的 JSON 字段路径)
- CMD:参数名/字段名包含 `cmd/command/exec/shell/run/path/filename` 等关键词(或其在路由 params 中的 JSON 字段路径)
- SSRF:参数名/字段名包含 `url/uri/target/host/port/protocol/path` 等关键词(或其在路由 params 中的 JSON 字段路径)
- FILE:参数名/字段名包含 `file/path/filename/download/view/document/template` 等关键词(或其在路由 params 中的 JSON 字段路径)
- UPLOAD:参数名/字段名包含 `upload/file/tmp_name/filename/multipart` 等关键词(或其在路由 params 中的 JSON 字段路径)
- WRITE:参数名/字段名包含 `write/put_contents/fwrite/fopen/rename/copy/truncate/error_log/dest/path/target/path` 等关键词(或其在路由 params 中的 JSON 字段路径)
- XSS:参数名/字段名包含 `content/body/comment/title/description/html` 等关键词(或其在路由 params 中的 JSON 字段路径)
- TPL:参数名/字段名包含 `template/view/engine/renderer/format/expr` 等关键词(或其在路由 params 中的 JSON 字段路径)
- XXE:参数名/字段名包含 `xml/doctype/dtd/xxe` 等关键词(或其在路由 params 中的 JSON 字段路径)
- DESER:参数名/字段名包含 `serialize/unserialize/payload/object/serialized` 等关键词(或其在路由 params 中的 JSON 字段路径)
- NOSQL:参数名/字段名包含 `filter/query/where/operator/op/regex/whereClause` 等关键词(或其在路由 params 中的 JSON 字段路径)
- REDIR:参数名/字段名包含 `next/return_to/redirect/target/url` 等关键词(或其在路由 params 中的 JSON 字段路径)
- CRLF:参数名/字段名包含 `header/cookie/location/set-cookie` 等关键词(或其在路由 params 中的 JSON 字段路径)
- ARCHIVE:参数名/字段名包含 `zip/tar/phar/archive/entry/extractTo/unzip/untar` 等关键词(或其在路由 params 中的 JSON 字段路径)
- **合成 `route_id`(强制)**:条目来自 CLI/cron/队列、WordPress hook、`include` 链、阶段 2.5 静态 sink 等**且无 HTTP 路由**时,须使用稳定 ID(禁止留空),并在同行写明 `entry_file`(相对 `source_path`)、`entry_symbol`(函数/方法或 `global`)、`trace_from`(从何处开始向 sink 追踪)。推荐:`ENTRY_CLI:{脚本标识}`、`ENTRY_CRON:{任务名}`、`ENTRY_QUEUE:{消费者类或文件}`、`ENTRY_HOOK:{hook 名}`、`ENTRY_INCLUDE:{文件}:{符号}`、`SINK_ONLY:{序号}:{基名}:{行号}`(可与 `sink_static_index` 交叉引用)。
- 输出:`cross_analysis/high_risk_routes_{timestamp}.md`(含 P0/P1/SINK_SUSPECT;**每条须有 `route_id`**(含合成 ID)。`php-route-tracer` 以 `route_id` 标识任务,追踪起点以 `entry_file`+`entry_symbol`+`trace_from` 为准,不要求 ID 形如 URI。)
2. **生成分批追踪计划**:
- 读取 `high_risk_routes_{timestamp}.md`
- **分批参数化(强制)**:顺序 **P0 → P1 → SINK_SUSPECT**。`trace_batch_max_size` **默认 10**,可在 **5–30** 间按项目调整;须在计划中写**选型理由**(例:同模块可合并加大批次;调用链深、跨文件多、参数面宽或上下文预算紧则减小批次)。
- `trace_batch_plan_{timestamp}.md` **每一批**须含:`batch_id`、本批采用的 `trace_batch_max_size`、**选型理由**(1–3 句)、本批 `route_id` 有序列表。
- 输出:`cross_analysis/trace_batch_plan_{timestamp}.md`
3. **批量调用追踪器**(必须):
- 对每批路由调用 `php-route-tracer`
- 输出:`route_tracer/{route_id}/trace_{timestamp}.md`
4. **触发条件(硬门槛)**:
- 只有当某类 sink 在 trace 中出现“真实 sink 执行点”,且 trace 契约校验通过,且对应参数在 trace 的可控性矩阵里不是“不可控/无实际使用(被硬编码覆盖)”,才允许进入阶段 4 触发对应 `php-*-audit`
5. **trace 契约校验(必须)**:
- 每个 trace 文件必须包含以下段落/表头(字段名必须一致,不得重命名):
- `## 7) Sink Summary`
- `## 5) 参数可控性矩阵`
- `## 6) Sink 定位`
- `## 8) Trace 完整性声明`
- `## 9) Sink Evidence Type Checklist`
- 如果 trace 契约校验失败:
- 必须标记该 route 的 trace 为 `PARTIAL` 或 `UNRESOLVED`
- 对所有由该 trace 支持的漏洞,状态必须降级为 `⚠️待验证`,且不得直接给出 `✅已确认可利用`。
Sink 类型抓手、危险模式与强制验证的完整条文见本仓库 **`shared/PHP_SINK_REFERENCE.md`**(章节 3.1–3.16 及 LDAP/EXPR)。阶段 3/4 据 trace 筛选是否触发对应 `php-*-audit` 时,以该文件为准。
阶段 3 输出:
- `cross_analysis/high_risk_routes_{timestamp}.md`
- `cross_analysis/trace_batch_plan_{timestamp}.md`
- `route_tracer/` 下每条追踪路由的 `trace_{timestamp}.md`(含参数可控性表与分支路径证据)
### 阶段 4:Sink 审计执行(Only When Trace Proves)
步骤:
1. 从 `route_tracer/` 的 trace 中筛选需要“trace-gate”的漏洞类别与“参数实际使用状态”(必须以 trace 可控性矩阵为准)。
- trace-gate 类别:SQL/NOSQL/CMD/SSRF/FILE/UPLOAD/WRITE/ARCHIVE/XSS/REDIR/CRLF/XXE/DESER/TPL/LDAP/EXPR/AUTH/CSRF/SESS
- 非 trace-gate 类别:CFG/CRYPTO/LOGIC/LOG(可基于静态扫描与代码配置证据直接调用对应 skill,**不以** trace `## 9) … CFG` **作为**唯一门槛)。说明:`php-route-tracer` 的检查表中虽含 CFG 行,仅作**增强证据**;`php-config-audit` 等仍须在阶段 4 **无条件按计划执行**(除非覆盖矩阵中已用否定证据标为不适用)。
2. 仅对命中的类别调用对应子审计 skill;并满足以下“证据来源”规则(禁止仅凭关键字推断):
- 若类别属于 trace-gate:必须逐项引用 `php-route-tracer` 的 `## 9) Sink Evidence Type Checklist` 对应行(FILE/UPLOAD/WRITE/ARCHIVE/SSRF/SQL/NOSQL/CMD/XSS/REDIR/CRLF/XXE/DESER/TPL/LDAP/EXPR/AUTH/CSRF/SESS)的证据要点作为审计依据(要求证据点 ID 原样一致)
- 若类别为 `AUTH`:调用 `php-auth-audit` 的 `TRACE_AUDIT` 模式(必须引用 trace 证据点 ID)
3. 对每条疑似漏洞,必须输出“可利用性前置条件”:
- 鉴权要求:✅无需 / ⚠️需登录 / ❌不可利用门槛
- 输入可控性:✅完全可控 / ⚠️条件可控 / ❌不可控(硬编码覆盖)
- 触发条件:分支条件/异常路径/环境依赖(数据库类型、网络可达性)
4. **trace 完整性回退规则(必须)**:
- 若 trace_status = PARTIAL:只能进入 `⚠️待验证` 模式(不得直接给出 `✅已确认可利用`)
- 若 trace_status = UNRESOLVED:**禁止静默漏报**——不得写成「无风险」或从报告中消失。必须在总报告 **「Trace 未闭合 / 待补证风险池」** 中为该 `route_id` 单列一条:`已知片段`(来自 trace 的可达部分)、`缺失证据`、`建议下一步`(补 trace / 纳入 `SINK_ONLY` 静态深审 / 调用对应 `php-*-audit`)。若该路由与阶段 2.5 静态命中可关联,须写交叉引用。
5. **文件系统操作审计(非 trace-gate,静态证据驱动)**:
- 调用:`php-filesystem-audit`
- 输出:`vuln_audit/fs_{timestamp}.md`
- 判定规则:允许基于源代码定位的“文件系统操作证据链 + 路径控制来源 + TOCTOU/链接绕过解释”直接输出 `✅/⚠️/❌/🔍`,不以 `php-route-tracer` 的证据契约字段为前置硬门槛
并最终给出:
- 状态:✅已确认 / ⚠️待验证 / ❌不可利用 / 🔍环境依赖
- 严重等级与 CVSS 映射(按上方公式)
### 阶段 5:汇总报告(Report)
在总报告中生成“质量报告章节”,包含:
- **子 skill / 审计面覆盖矩阵**:与上文「子审计覆盖矩阵(强制)」同结构,置于质量报告靠前位置;须与阶段 4 实际执行情况一致,不得矛盾。
- 风险统计表(🔴/🟠/🟡/🔵 数量与 CVSS 区间)
- 漏洞列表总览(逐条引用本报告中对应的漏洞详情段落)
- **「Trace 未闭合 / 待补证风险池」**(强制):汇总 `trace_status ∈ {PARTIAL, UNRESOLVED}` 的 `route_id`、阶段 2.5 `sink_static_index` 中尚未被 trace 闭合的条目、以及「扩展扫描」命中项;与「漏洞列表总览」并列,**禁止**因证据不足而删除记录(未闭合 ≠ 无风险)。
- 覆盖率:路由覆盖、鉴权覆盖、Sink 覆盖、关键分支覆盖(用“已完成/待补充”而非省略;建议阈值:路由覆盖与 Sink 覆盖 >= 90%)
- 框架特效审计汇总:如果存在 `framework_audit/*.md`,需要将其风险映射到统一类型码(AUTH/CSRF/TPL/XSS/SQL/LOGIC/CFG/SESS/SSRF/…),统计数量与最高严重等级,并在汇总中注明“框架风险来源于哪些 framework_audit 报告文件”
> **框架审计豁免说明**:框架特效审计(Laravel/Symfony/WordPress/CodeIgniter/Yii2/ThinkPHP)属于“静态配置/模式匹配”型审计,其发现的风险不需要经过 `php-route-tracer` 的 trace-gate 或 `## 9) Sink Evidence Type Checklist` 的证据校验。框架审计结果直接按其自身规则分级并映射到统一类型码即可。
- 证据完整度评分(Evidence Completeness):对所有 trace-gate sink 类型(FILE/UPLOAD/WRITE/ARCHIVE/SSRF/SQL/NOSQL/CMD/XSS/REDIR/CRLF/XXE/DESER/TPL/LDAP/EXPR/AUTH/CSRF/SESS),按 `shared/EVIDENCE_POINT_IDS.md` 中定义的证据点 ID 集合进行计数:`覆盖率% = 已满足证据点数 / 该类型所需证据点总数 × 100%`;并在表格中列出缺失的证据点 ID(必须原样一致)与缺失原因(如 trace_status=PARTIAL/UNRESOLVED、证据点定位失败、参数不可控等)。
阶段 5.1:利用链聚合(强制)
- 调用:`php-exploit-chain-audit`
- 在“质量报告章节”的“漏洞列表总览”之后增加一段“利用链聚合章节”:引用利用链聚合报告的链路总览表与最短利用链(只需引用、不重复内容)。
## 漏洞详情模板(强制使用)
每条漏洞必须遵循以下结构(写入本次总报告的漏洞详情段落):
```markdown
### [{等级前缀}-{类型代码}-{序号}] {风险标题}
| 项目 | 信息 |
|------|------|
| 严重等级 | {🔴/🟠/🟡/🔵} (CVSS {score}) |
| 可达性 (R) | {0-3} - {理由} |
| 影响范围 (I) | {0-3} - {理由} |
| 利用复杂度 (C) | {0-3} - {理由} |
| 可利用性 | ✅ 已确认 / ⚠️ 待验证 / ❌ 不可利用 / 🔍 环境依赖 |
| 位置 | {文件路径}:{行号} ({函数/方法}) |
#### 数据流链(Source → Sink)
```
(按路由逐行写出赋值/传递/拼接/校验/分支,禁止省略)
#### 可利用前置条件
- 鉴权要求:{无需/需登录/需特定权限}
- 输入可控性:{完全可控/条件可控/不可控}
- 触发条件:{分支/异常/环境依赖}
#### 验证 PoC(强制给出可执行请求)
```http
{HTTP Method} {完整路径与查询/Body} HTTP/1.1
Host: {host}
{必要 Header/Session/JWT/Cookie}
{Payload}
```
#### 建议修复
- 以“代码替换建议”为主(给出安全写法要点)
- 给出“如何在代码中搜索修复是否遗漏”的搜索语句(bash/rg 形式)
```
## 说明文档(审计 READMEs)
必须在本次总报告内生成以下附录章节:
- 如何识别 PHP 路由与参数
- 如何识别会话/JWT 并审计鉴权链
- 如何结合 `shared/PHP_SINK_REFERENCE.md` 做按类型的 Sink 挖掘与 trace-gate 对齐
## 自检与质量保证(强制)
在标记完成前,必须回答并自检:
- [ ] 「子 skill / 审计面覆盖矩阵」是否已对对照表**每一行**给出已执行/不适用/已延期,且不适用与已延期均附触发依据或否定证据?
- [ ] 我是否按 `shared/PHP_SINK_REFERENCE.md` 与 trace 结果覆盖了常见高危类别(SQL/NOSQL/CMD/SSRF/XSS/FILE/UPLOAD/WRITE/ARCHIVE/XXE/DESER/TPL/AUTH/CSRF/REDIR/CRLF/SESS/CRYPTO/CFG/LOG/FS)?
- [ ] 我是否覆盖 LDAP/EXPR(或矩阵中「不适用」已附否定证据)?
- [ ] 每条漏洞是否都有数据流链与可利用前置条件?
- [ ] 是否没有任何省略写法?
- [ ] 是否没有任何未替换的模板占位符?
- [ ] **「Trace 未闭合 / 待补证风险池」**是否已列出所有 `PARTIAL/UNRESOLVED` 及 2.5 未闭合静态命中,且与漏洞列表无矛盾?
## 子 Skill 对照表(能力清单 + 矩阵对齐)
下表为**必须出现在「子 skill / 审计面覆盖矩阵」中的行清单**。阶段 3/4 按 trace-gate 与静态证据触发对应 skill;**未执行**的行须在矩阵中标记「不适用」或「已延期」并满足矩阵列要求(禁止空行、禁止无理由跳过)。
1. 路由/参数:`php-route-mapper`
2. 鉴权:`php-auth-audit`
3. 深度追踪:`php-route-tracer`(用于任何需要可控性/分支证据的场景)
4. 组件漏洞(供应链):`php-vuln-scanner`
5. 利用链聚合:`php-exploit-chain-audit`(在阶段 5.1 强制调用)
6. 文件系统操作审计:`php-filesystem-audit`(在阶段 4 以静态证据驱动执行)
按漏洞类别调用:
- SQL 注入:`php-sql-audit`
- NoSQL 注入:`php-nosql-audit`
- 命令注入:`php-cmd-audit`
- SSRF:`php-ssrf-audit`
- XSS:`php-xss-audit`
- 模板注入/SSTI:`php-tpl-audit`
- LDAP 注入:`php-ldap-audit`
- 表达式注入(非模板):`php-expr-audit`
- 任意文件读取/路径穿越:`php-file-read-audit`
- 文件上传:`php-file-upload-audit`
- 任意文件写入:`php-file-write-audit`
- 归档解压路径穿越/Zip Slip:`php-archive-extract-audit`
- XXE:`php-xxe-audit`
- 反序列化/对象注入:`php-deser-audit`
- 认证/鉴权绕过/越权/IDOR:`php-auth-audit`(与鉴权状态、资源归属一起落入汇总)
- CSRF:`php-csrf-audit`
- 开放重定向:`php-open-redirect-audit`
- CRLF/响应分割:`php-crlf-audit`
- 会话与 Cookie 安全:`php-session-cookie-audit`
- 加密与密钥安全:`php-crypto-audit`
- 安全配置(CORS/错误暴露/安全头/危险开关):`php-config-audit`
- 业务逻辑漏洞(Mass Assignment/竞态/状态机/流程绕过):`php-logic-audit`
- 安全日志与监控:`php-logging-audit`
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!