$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-cmd-auditPHP Web 源码命令注入审计工具。识别命令执行 Sink(exec/system/shell_exec 等),追踪用户输入进入命令拼接,输出可利用性分级、PoC 与修复建议(禁止省略)。
| 1 | # PHP 命令注入审计(php-cmd-audit) |
| 2 | |
| 3 | 分析 PHP 项目源码,识别系统命令执行相关代码,并追踪用户输入到命令构造点,验证是否存在命令注入风险。 |
| 4 | |
| 5 | ## CRITICAL |
| 6 | - 必须使用数据流链证据判定可利用性 |
| 7 | - 禁止省略:不得出现任何省略占位符;每条条目必须包含完整的证据链与可观测验证框架 |
| 8 | - 每条高危/中危条目必须含:位置证据 + Source→Sink 数据流链 + 可利用前置条件 + 可执行 PoC + 修复建议 |
| 9 | |
| 10 | ## 分级与编号 |
| 11 | - 详见 `shared/SEVERITY_RATING.md` |
| 12 | - 漏洞编号:`{C/H/M/L}-CMD-{序号}` |
| 13 | |
| 14 | ## 命令执行 Sink(必做) |
| 15 | 识别以下函数/语法: |
| 16 | - `exec/system/shell_exec/passthru` |
| 17 | - `proc_open/popen/pcntl_exec` |
| 18 | - 反引号语法:`` `cmd` `` |
| 19 | 危险模式: |
| 20 | - 命令字符串通过拼接包含用户输入(GET/POST/Body/参数字段) |
| 21 | - 未做白名单/未做 shell 转义,尤其包含 `;|&`、`$()`、反引号、换行等 |
| 22 | |
| 23 | ## 追踪与验证(必做) |
| 24 | 触发 `php-route-tracer` 的条件: |
| 25 | - 命令字符串由多个变量组成 |
| 26 | - 存在参数经过 JSON 解码/多层传递 |
| 27 | - 命令构造被 if/try 分支影响 |
| 28 | |
| 29 | ## 报告输出 |
| 30 | 输出到: |
| 31 | ``` |
| 32 | {output_path}/vuln_audit/cmd_{timestamp}.md |
| 33 | ``` |
| 34 | |
| 35 | ## 漏洞条目模板(强制) |
| 36 | ```markdown |
| 37 | ### [{等级前缀}-CMD-{序号}] {风险标题} |
| 38 | |
| 39 | | 项目 | 信息 | |
| 40 | |------|------| |
| 41 | | 严重等级 | {🔴/🟠/🟡/🔵} (CVSS {score}) | |
| 42 | | 可达性 (R) | {0-3} - {理由} | |
| 43 | | 影响范围 (I) | {0-3} - {理由} | |
| 44 | | 利用复杂度 (C) | {0-3} - {理由} | |
| 45 | | 可利用性 | ✅ 已确认 / ⚠️ 待验证 / ❌ 不可利用 / 🔍 环境依赖 | |
| 46 | | 位置 | {file}:{line} ({Function/Class}) | |
| 47 | |
| 48 | #### 数据流链(Source → Sink) |
| 49 | (逐行写出:请求参数读取 -> 拼接/拼装 -> 命令执行函数/语句) |
| 50 | |
| 51 | #### 可利用前置条件 |
| 52 | - 鉴权要求:{无需/需登录/需特定权限} |
| 53 | - 输入可控性:{完全可控/条件可控/不可控} |
| 54 | - 触发条件:{分支/异常/环境依赖} |
| 55 | |
| 56 | #### 证据引用(强制:来自 php-route-tracer) |
| 57 | 每条命令注入疑似漏洞必须逐项引用 trace 输出中 `## 9) Sink Evidence Type Checklist` 的 **CMD 行**对应证据要点(允许状态为待验证,但证据引用必须存在): |
| 58 | 1. `EVID_CMD_EXEC_POINT`:命令执行函数/语句位置(对应 trace 的 CMD 执行点证据) |
| 59 | 2. `EVID_CMD_COMMAND_STRING_CONSTRUCTION`:命令字符串/关键参数构造位置(拼接/模板化证据) |
| 60 | 3. `EVID_CMD_USER_PARAM_TO_CMD_FRAGMENT`:用户可控参数到命令关键片段的映射证据 |
| 61 | |
| 62 | #### tracer 证据缺失处理(强制) |
| 63 | - 若无法定位上述 1~3 任一关键证据要点:该漏洞状态只能标记为 `⚠️待验证`,不得直接给出 `✅已确认可利用`。 |
| 64 | |
| 65 | #### 验证 PoC(强制) |
| 66 | ```http |
| 67 | POST {完整路径} HTTP/1.1 |
| 68 | Host: {host} |
| 69 | {必要 Cookie/Auth} |
| 70 | |
| 71 | {Payload} |
| 72 | ``` |
| 73 | |
| 74 | #### 建议修复 |
| 75 | - 强制使用命令参数白名单 + 安全参数拼接策略(避免 shell=true 的情况) |
| 76 | - 推荐替代实现(如使用不经 shell 的进程调用方式,或完全避免拼接) |
| 77 | - 给出代码搜索语句(`rg`)定位同类拼接点 |
| 78 | ``` |