$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-exploit-chain-audit--- name: php-exploit-chain-audit description: PHP 利用链/POP(回弹)链聚合器。把已产出的各类漏洞报告按“前置条件满足”串成可利用链路叙事(不新增证据点字典)。 ---
| 1 | # PHP 跨漏洞利用链聚合(php-exploit-chain-audit) |
| 2 | |
| 3 | 目标:将 `vuln_audit/*_{timestamp}.md`(以及可能的 `auth_audit/*_{timestamp}.md`)里的已确认/待验证漏洞,基于“可利用前置条件”串联成跨阶段利用链,并输出可观测的利用链叙事。 |
| 4 | |
| 5 | ## 关键约束 |
| 6 | - 不新增 `EVID_*` 证据点字典,也不要求 `php-route-tracer` 直接输出额外契约字段。 |
| 7 | - 不复写每条漏洞的完整修复建议:只在链路层说明“为何下一步前置条件成立/不成立”。 |
| 8 | - 允许输出“链路可利用性”:以构成链的最弱环节(任一环节不可利用/证据缺失)决定链整体状态。 |
| 9 | |
| 10 | ## 输入依赖(建议) |
| 11 | - `vuln_audit/*_{timestamp}.md`:来自各 sink 子 skill 的漏洞报告集合(包含编号、可利用性、触发条件、位置证据与数据流链)。 |
| 12 | - `auth_audit/auth_audit_report_{timestamp}.md`:用于补充链路中“鉴权门槛”是否一致(如漏洞链经过不同路由)。 |
| 13 | - `route_tracer/`:如果需要补充“同一 route 的 sink 执行证据”,可通过漏洞报告中的 trace 证据引用回溯(不强制)。 |
| 14 | |
| 15 | ## 产出目录结构(建议强制) |
| 16 | 输出到: |
| 17 | ``` |
| 18 | {output_path}/exploit_chain/exploit_chains_{timestamp}.md |
| 19 | ``` |
| 20 | |
| 21 | ## 输出模板(强制) |
| 22 | 必须包含以下结构(不得省略): |
| 23 | |
| 24 | ```markdown |
| 25 | # Exploit Chains (PHP) - Aggregation |
| 26 | |
| 27 | 项目路径: {source_path} |
| 28 | 生成时间: {timestamp} |
| 29 | |
| 30 | --- |
| 31 | ## 1) 利用链总览表 |
| 32 | | chain_id | 链路类型 | 起点漏洞(编号) | 中间漏洞(编号) | 终点漏洞(编号) | 链路可利用性 | 关键依赖(路由/前置条件) | |
| 33 | |----------|----------|----------------|-------------------|------------------|----------------|------------------------------| |
| 34 | | | | | | | | | |
| 35 | |
| 36 | --- |
| 37 | ## 2) 最短利用链(强制至少 1 条;若无则输出“未发现可拼接利用链”) |
| 38 | chain_id: {id} |
| 39 | |
| 40 | ### 2.{n}) 链路逐步叙事(按顺序) |
| 41 | Step 1: {漏洞编号}(类型 {SQL/CMD/FILE/WRITE/UPLOAD/DESER/TPL/EXPR/...}) |
| 42 | - 触发路由/入口:{route info from vuln report} |
| 43 | - 可利用性:{✅/⚠️/❌/🔍}(来自漏洞报告“可利用性”字段) |
| 44 | - 前置条件是否满足:{是/否/待验证}(解释依据:鉴权门槛、输入可控性、trace_status) |
| 45 | |
| 46 | Step 2: {漏洞编号} |
| 47 | - ... |
| 48 | |
| 49 | Step Final: {终点漏洞编号} |
| 50 | - 为什么它是终点(导致最关键的敏感操作):{从 vuln report 中提取的结论性描述;不需要再堆证据点细节} |
| 51 | |
| 52 | ### 关键证据引用(链路级) |
| 53 | 按 Step 顺序列出: |
| 54 | - {漏洞报告文件名}:{漏洞编号}(从该漏洞报告中提取“触发条件/可利用性前置条件/PoC 所需路由”) |
| 55 | |
| 56 | --- |
| 57 | ## 3) “未能串联”的原因清单(强制) |
| 58 | 列出至少以下类别: |
| 59 | 1. 缺少关键落点/可访问性证据(例如 WRITE/UPLOAD 后未形成可读/可执行面) |
| 60 | 2. 路由鉴权不一致(链上部分漏洞需要的权限与另一路由不匹配) |
| 61 | 3. trace_status 不满足(PARTIAL/UNRESOLVED 导致无法确认链路可利用) |
| 62 | 4. 需要特定环境依赖(🔍) |
| 63 | |
| 64 | 每条原因必须至少引用 1 个具体漏洞编号(来自 vuln_audit)。 |
| 65 | ``` |
| 66 | |
| 67 | ## 链路类型建议(用于聚合,不强制) |
| 68 | 建议从以下方向优先生成链(存在则写入,不存在就略过): |
| 69 | - 落点写入/覆盖 -> 包含/读取 -> 代码执行(WRITE/UPLOAD/ARCHIVE -> FILE -> CMD/TPL/TPL->EXPR->CMD) |
| 70 | - 落点写入 -> 模板/表达式利用(WRITE -> TPL/EXPR) |
| 71 | - 对象注入(DESER) -> 后续敏感操作(FILE/CMD/WRITE 等,若漏洞报告能证明链式触发) |
| 72 | |
| 73 | ## 链路可利用性计算(强制规则) |
| 74 | chain 可利用性由链路最弱环节决定: |
| 75 | - 若所有 Step 的可利用性均为 `✅ 已确认`,则链路为 `✅ 已确认` |
| 76 | - 若任一 Step 为 `⚠️ 待验证`(且非仅信息性缺失),则链路为 `⚠️ 待验证` |
| 77 | - 若任一 Step 为 `❌ 不可利用`,则链路为 `❌ 不可利用` |
| 78 | - 若任一 Step 为 `🔍 环境依赖`,且无法在其它 Step 中兜底,则链路为 `🔍 环境依赖` |
| 79 | |
| 80 | ## 实操输出要求 |
| 81 | - 必须使用“漏洞报告里的编号”作为链的 Step 纽带(禁止用抽象描述替代编号)。 |
| 82 | - 若只能找到孤立漏洞且无法满足“前置条件承接”(例如 WRITE 后无可包含/可执行面),则不要强行输出链;在“未能串联原因清单”解释为什么。 |