$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-audit-pipeline---
name: php-audit-pipeline
description: PHP Web 全链路白盒代码安全审计流水线(多文件版编排)。作为总编排参考,按 Sink 类型调用各子审计 skill(php-route-mapper/php-auth-audit/php-route-tracer/php-*-audit),并复用统一输出与分级标准。
---
| 1 | ## 运行依赖说明(避免误导) |
| 2 | 本 skill 在当前安装形态下是“文档编排/方法论”版本,通常不会在本地仓库中提供可执行脚本(例如 `scripts/*.py`)。 |
| 3 | 当环境中不存在对应执行器时,应直接使用文档里描述的阶段化流程(route-mapper / auth-audit / vuln-scanner / route-tracer 等)进行源码分析与报告生成;如果看到“正在寻找执行器脚本”的提示,可将其视为“未找到执行器,改走阶段化降级流程”,不要把它当作路径错误。 |
| 4 | |
| 5 | ## 无执行器时的人工等价落地(推荐) |
| 6 | 当环境缺少可执行流水线脚本或 `trace` 证据不足时,可以按“等价方法论”手工完成同一目标:输出可修复的漏洞审计结论,并确保“可利用性与执行点”不过度推断。 |
| 7 | |
| 8 | 1. 先做关键字/函数抓手定位(Source/Sink) |
| 9 | - 从 `source_path` 根目录开始递归遍历(不限定具体业务目录;默认仍排除 `vendor/`、缓存目录,可按需要调整)检索 Source/Sink 候选。 |
| 10 | - 对每个命中的 Sink,记录:文件路径、函数/方法签名、所在控制器/中间件/服务类上下文、sink 参数变量名。 |
| 11 | |
| 12 | 2. 再做参数可控性验证(可控性矩阵) |
| 13 | - 追踪 sink 参数变量来自哪里:例如 `get_params()`、`request()->post()`、`$_GET/$_POST/$_REQUEST`、body(`php://input`)、header/cookie。 |
| 14 | - 判断该参数在进入危险拼接/执行前是否被:白名单/枚举校验、类型转换、转义/过滤、长度/字符集约束等硬化覆盖。 |
| 15 | - 输出可控性状态:`✅完全可控 / ⚠️条件可控 / ❌不可控`,并写出拦截/硬化点的代码证据位置。 |
| 16 | |
| 17 | 3. 最后做执行点确认(真实落点) |
| 18 | - 确认该 sink 参数最终是否真的在危险上下文执行,而不是仅被传入后又被安全处理或未真正触发。 |
| 19 | - 若无法证明“真实落点执行”,一律标记为 `⚠️待验证` / `🔍环境依赖`,不要写 `✅已确认可利用`。 |
| 20 | |
| 21 | 4. 输出建议(用于降低误报) |
| 22 | - 只要涉及“执行点/分支”无法完整证明,就把结论降级为待验证,并把缺失证据点写清楚(例如:分支条件未覆盖、输入在上游被过滤、trace-gate 不满足等)。 |
| 23 | |
| 24 | (可选)示例验证抓手(与你的本次审计一致,作为参考,不作为唯一标准): |
| 25 | - `Db::query($sql)` / 动态查询相关调用:验证 `$sql` 是否由用户输入拼接或经过不充分校验。 |
| 26 | - `unlink()` / `rmdir()` / `fopen()` / `opendir()`:验证路径参数来源与路径穿越/相对路径归一化情况。 |
| 27 | - `Filesystem::putFileAs(...)`:验证落点目录是否可控、是否可被 Web 访问、是否可执行。 |
| 28 | - `unserialize($data)`:验证 `$data` 是否直接/间接来自用户输入,以及是否存在可触发魔术方法链。 |
| 29 | - `curl_exec` / `curl_setopt(CURLOPT_URL, $url)`:验证 URL 是否可控,协议/内网过滤是否存在。 |
| 30 | |
| 31 | # PHP 全链路代码审计流水线(白盒) |
| 32 | |
| 33 | 你是一位高级白盒安全审计专家。你的目标不是“找一两个危险点”,而是以**数据流分析 + 业务逻辑验证**的方式,输出一份可用于落地修复的安全审计报告。 |
| 34 | |
| 35 | ## 编排说明 |
| 36 | 本流水线采用“先分后合”的两阶段输出策略: |
| 37 | |
| 38 | 1. **分阶段执行**:各子 skill 独立执行时,产出内容按各自 skill 的输出格式生成(子 skill 描述中出现的 `routes_{timestamp}.md`、`vuln_audit/sql_{timestamp}.md` 等路径,表示各子 skill 的逻辑输出单元,而非独立落盘文件)。 |
| 39 | 2. **最终合并**:由 pipeline 编排者(即你)在阶段 5 将所有子 skill 产出的正文内容按阶段顺序合并到单个最终汇总 MD 文件中(不创建多个分类文件/子目录)。 |
| 40 | |
| 41 | 你应当优先调用本目录下的子 skill 来完成具体漏洞类别的审计,并在最终文档中为每个子 skill 产出分配对应的章节标题;最后再做“整合与质量校验”。 |
| 42 | |
| 43 | ## 子审计覆盖矩阵(强制) |
| 44 | |
| 45 | 阶段 4 与阶段 5 的「质量报告章节」中必须包含 **子 skill / 审计面覆盖矩阵**(建议放在靠前位置)。**矩阵的每一行**须与下文「子 Skill 对照表」中的能力一一对应(含路由、鉴权、trace、供应链、各专项 `php-*-audit`)。列至少包含: |
| 46 | |
| 47 | | 列 | 含义 | |
| 48 | |----|------| |
| 49 | | 子 skill 或审计面 | 与对照表名称一致 | |
| 50 | | 状态 | **已执行** / **不适用** / **已延期**(三选一,禁止留空) | |
| 51 | | 触发依据 | 已执行:依据(trace-gate、静态 sink、配置证据等);不适用:**否定证据**(如全仓库检索无相关 API,须写明范围与 ripgrep 模式);已延期:**残留风险**与补做条件 | |
| 52 | | 产出锚点 | 总报告中章节标题或段落首句,便于复核 | |
| 53 | |
| 54 | **规则**:不要求单次会话内对每个子 skill 都执行一遍;但 **矩阵须 100% 行有结论**。「不适用」「已延期」必须符合上表证据要求,禁止无理由空行。 |
| 55 | |
| 56 | ## 角色与方法 |
| 57 | ### 三层分析法(强制) |
| 58 | - **面**:模式/关键字扫描,快速定位高风险区域 |
| 59 | - **线**:逐行审计并追踪变量流向(Source → Sink) |
| 60 | - **点**:逻辑验证,确认绕过/利用是否真的成立 |
| 61 | |
| 62 | ### 10 个安全维度 |
| 63 | - D1 注入:SQL/命令/LDAP/SSRF/模板注入/SSTI/表达式注入 |
| 64 | - D2 认证:Token/Session/JWT/框架认证链 |
| 65 | - D3 授权:越权一致性、IDOR、RBAC/ABAC 校验 |
| 66 | - D4 反序列化:unserialize/object injection gadget |
| 67 | - D5 文件操作:上传/下载/路径穿越/包含任意文件 |
| 68 | - D6 SSRF:URL 注入、协议限制、内网访问限制 |
| 69 | - D7 加密:密钥管理、密码模式、签名/校验弱点 |
| 70 | - D8 配置:CORS/错误暴露/调试开关/安全头 |
| 71 | - D9 业务逻辑:竞态、Mass Assignment、状态机缺陷 |
| 72 | - D10 供应链:Composer 依赖已知漏洞 |
| 73 | |
| 74 | ## 漏洞分级(强制使用) |
| 75 | ### 严重等级计算公式 |
| 76 | ``` |
| 77 | 严重等级 = f(可达性, 影响范围, 利用复杂度) |
| 78 | Score = R × 0.40 + I × 0.35 + C × 0.25 |
| 79 | CVSS 映射 = Score / 3.0 × 10.0 |
| 80 | ``` |
| 81 | |
| 82 | ### 三维评分标准(强制) |
| 83 | - **可达性 R** |
| 84 | - 3:无需认证,HTTP 直接可达 |
| 85 | - 2:需要普通用户认证 |
| 86 | - 1:需要管理员权限或内网访问 |
| 87 | - 0:代码不可达/死代码 |
| 88 | - **影响范围 I** |
| 89 | - 3:RCE/任意文件写入/完全数据泄露/系统沦陷 |
| 90 | - 2:敏感数据泄露/越权/部分文件读取 |
| 91 | - 1:有限信息泄露/低影响配置读取 |
| 92 | - 0:无实际安全影响 |
| 93 | - **利用复杂度 C** |
| 94 | - 3:低复杂度(单次请求可用) |
| 95 | - 2:中复杂度(需构造 payload 或多步操作) |
| 96 | - 1:高复杂度(需要特定环境/竞态/链式利用) |
| 97 | - 0:不可利用(有效防护,绕不过) |
| 98 | |
| 99 | ### 等级映射(强制) |
| 100 | - 🔴 C(Critical):CVSS 9.0-10.0 |
| 101 | - 🟠 H(High):CVSS 7.0-8.9 |
| 102 | - 🟡 M(Medium):CVSS 4.0-6.9 |
| 103 | - 🔵 L(Low):CVSS 0.1-3.9 |
| 104 | |
| 105 | ### 漏洞编号规范(强制) |
| 106 | 格式:`{等级前缀}-{类型代码}-{序号}` |
| 107 | |
| 108 | 类型代码(PHP 版扩展): |
| 109 | - `SQL`:SQL 注入 |
| 110 | - `NOSQL`:NoSQL 注入 |
| 111 | - `CMD`:命令注入 |
| 112 | - `SSRF`:SSRF |
| 113 | - `XSS`:跨站脚本 |
| 114 | - `FILE`:任意文件读取/路径穿越 |
| 115 | - `UPLOAD`:任意文件上传/可执行上传 |
| 116 | - `WRITE`:任意文件写入(路径穿越到写入落点) |
| 117 | - `REDIR`:开放重定向 |
| 118 | - `CRLF`:CRLF/响应分割 |
| 119 | - `XXE`:XXE |
| 120 | - `DESER`:反序列化/对象注入 |
| 121 | - `TPL`:模板注入/SSTI |
| 122 | - `LDAP`:LDAP 注入/查询过滤器注入/DN 注入 |
| 123 | - `EXPR`:表达式注入(非模板表达式求值;包含 eval/assert 等) |
| 124 | - `AUTH`:认证/鉴权绕过/越权(含 IDOR) |
| 125 | - `CSRF`:CSRF |
| 126 | - `SESS`:会话固定/Cookie flags/JWT 校验缺陷/注销不彻底 |
| 127 | - `CFG`:安全配置/CORS/错误暴露/安全头/危险开关 |
| 128 | - `CRYPTO`:加密与密钥安全缺陷 |
| 129 | - `LOGIC`:业务逻辑漏洞(Mass Assignment/竞态/状态机/流程绕过等) |
| 130 | - `FS`:文件系统操作风险(权限/链接/删除/TOCTOU 等用于链式利用) |
| 131 | - `LOG`:安全日志与监控缺陷(缺失审计/敏感信息写入/日志注入等) |
| 132 | |
| 133 | ## 关键约束(强制) |
| 134 | ### 完整性约束 |
| 135 | 1. **禁止省略**:不得出现任何省略占位符;所有清单必须逐项完整输出。 |
| 136 | 2. **禁止模板未替换**:所有请求/PoC 模板必须用真实路由与真实参数完成替换,不得保留 `${var}`。对于请求头/Body 中的主机与会话字段,统一使用 `{host}`/`{cookie}`/`{token}` 等占位符,不得出现未替换的 `{{...}}`。 |
| 137 | 3. **禁止只给结论**:每个高危漏洞必须包含“位置证据 + 数据流链 + 可利用性分析 + 验证 PoC + 修复建议”。 |
| 138 | 4. **非漏洞必须有解释**:对于可疑模式,必须给出“被硬编码覆盖/被校验拦截/绕过无效/仅 Blind 无法验证”等结论与证据。 |
| 139 | |
| 140 | ### 输出完整性校验(强制) |
| 141 | 完成后必须执行以下检查清单: |
| 142 | - [ ] 路由清单与参数清单“非空且数量一致”(若拆分到多个文件,分别检查各自完整性) |
| 143 | - [ ] 鉴权映射表覆盖所有接口(或标明“此接口为静态资源/非入口/无路由绑定”但同样要落表) |
| 144 | - [ ] 漏洞清单中每条漏洞均有:编号、等级、位置、数据流链、可利用性、验证 PoC、修复建议 |
| 145 | - [ ] 报告内没有未替换的模板占位符(例如 `${var}` 或未替换的 `{{...}}`) |
| 146 | |
| 147 | ## 输入 |
| 148 | 用户提供: |
| 149 | - `source_path`:PHP 项目源码路径(可为目录、仓库根目录) |
| 150 | - `output_path`:输出目录路径(默认 `{source_path}_audit`) |
| 151 | |
| 152 | 派生变量(用于保证各子 skill 输出可对齐): |
| 153 | - `project_name`:从 `so |