$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-open-redirect-auditPHP Web 源码开放重定向审计工具。识别用户可控重定向目的地进入 header Location/跳转函数,分析校验与 allowlist,输出分级、PoC 与修复建议(禁止省略)。
| 1 | # PHP 开放重定向审计(php-open-redirect-audit) |
| 2 | |
| 3 | 分析 PHP 项目源码中,所有“跳转/重定向”行为是否可能被用户控制目的地址,导致钓鱼或 OAuth 等流程被劫持。 |
| 4 | |
| 5 | ## 分级与编号 |
| 6 | - 详见:`shared/SEVERITY_RATING.md` |
| 7 | - 漏洞编号:`{C/H/M/L}-REDIR-{序号}` |
| 8 | |
| 9 | ## 必检 Sink(强制) |
| 10 | 识别以下跳转输出点: |
| 11 | - `header("Location: {value}")` |
| 12 | - `<meta http-equiv="refresh" content="{value}">` |
| 13 | - `redirect()` / `to()` / `return redirect({value})` |
| 14 | - 自定义跳转函数(内部最终调用 Location 输出) |
| 15 | |
| 16 | ## 可控性追踪(必做) |
| 17 | 必须追踪以下两类变量: |
| 18 | 1. 目的地来源:通常来自 `$_GET['next']`/`$_POST['url']`/`Referer`/`return_to` |
| 19 | 2. 目的地校验:是否只允许相对路径、是否 allowlist、是否拒绝 scheme(`http://`/`//`)、是否校验域名 |
| 20 | |
| 21 | ## 绕过条件(必做) |
| 22 | 必须识别并输出潜在绕过: |
| 23 | - scheme 绕过:`//evil.com`、`http:%2f%2fevil.com` |
| 24 | - 编码绕过:双重编码、URL 编码的冒号/斜杠 |
| 25 | - 尾部/空白字符绕过(旧实现常见) |
| 26 | |
| 27 | ## 报告输出 |
| 28 | ``` |
| 29 | {output_path}/vuln_audit/redir_{timestamp}.md |
| 30 | ``` |
| 31 | |
| 32 | ## 条目模板(强制) |
| 33 | 每条漏洞必须包含: |
| 34 | - 位置证据:跳转函数位置 + 路由 |
| 35 | - 数据流链:用户输入 -> 校验 -> header/redirect |
| 36 | - 可利用前置条件:通常需登录(若在登录后跳转)与攻击者能否控制参数 |
| 37 | - 验证 PoC(必须真实路由;把目的地参数替换为真实字段名) |
| 38 | - 修复建议:只允许相对路径 + 服务器端 allowlist + 对编码/scheme 做归一化后校验 |
| 39 | |
| 40 | ## 证据引用(强制:来自 php-route-tracer) |
| 41 | 每条开放重定向疑似漏洞必须逐项引用 trace 输出中 `## 9) Sink Evidence Type Checklist` 的 **REDIR 行**对应证据要点(允许状态为待验证,但证据引用必须存在): |
| 42 | 1. `EVID_REDIR_OUTPUT_POINT`:跳转输出点位置证据(header/redirect 的最终输出位置) |
| 43 | 2. `EVID_REDIR_DEST_SOURCE_MAPPING`:目的地来源变量映射证据(从路由参数到目的地变量) |
| 44 | 3. `EVID_REDIR_DEST_VALIDATION_NORMALIZATION`:目的地校验/归一化/allowlist/refuse scheme 的分支证据(含编码绕过处理分支) |
| 45 | |
| 46 | ## tracer 证据缺失处理(强制) |
| 47 | - 若无法定位上述 1~3 任一关键证据要点:该漏洞状态只能标记为 `⚠️待验证`,不得直接给出 `✅已确认可利用`。 |