$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-ssrf-auditPHP Web 源码 SSRF 审计工具。识别用户可控 URL/地址进入网络请求 Sink,追踪内网/协议/端口限制与回显,输出可利用性分级、PoC 与修复建议(禁止省略)。
| 1 | # PHP SSRF 审计(php-ssrf-audit) |
| 2 | |
| 3 | 分析 PHP 项目源码,识别 SSRF 风险:用户可控 URL/主机/路径进入网络请求或读取类函数,且缺少协议 allowlist、DNS/IP 内网拒绝、端口限制等控制。 |
| 4 | |
| 5 | ## 分级与编号 |
| 6 | - 详见:`shared/SEVERITY_RATING.md` |
| 7 | - 漏洞编号:`{C/H/M/L}-SSRF-{序号}` |
| 8 | |
| 9 | ## SSRF Sink(必做) |
| 10 | 识别至少以下网络/地址访问点: |
| 11 | - `curl_setopt(CURLOPT_URL, $url)` / `curl_exec` |
| 12 | - `file_get_contents($url)` / `readfile($url)` / `fopen($url, {value})` |
| 13 | - `stream_get_contents($stream)` / `fsockopen` / `pfsockopen` |
| 14 | - `get_headers($url)` / `dns_get_record`(配合地址解析时) |
| 15 | 危险模式: |
| 16 | - URL/Host/Port/Path 来自用户输入且可控 |
| 17 | - 协议未限制(允许 `file://`、`gopher://`、`php://` 等) |
| 18 | |
| 19 | ## 必做的安全检查点 |
| 20 | - 协议白名单:仅允许 `http/https`(如有必要) |
| 21 | - DNS/IP 解析后内网网段拦截:拒绝 `127.0.0.1/::1/10.0.0.0/8/172.16.0.0/12/192.168.0.0/16` 等 |
| 22 | - 端口限制:拒绝内网高危端口(由项目策略决定) |
| 23 | - 重定向处理:跟随跳转的限制(如 `CURLOPT_FOLLOWLOCATION`) |
| 24 | - 重定向与最终地址校验:即使初始 URL 通过 allowlist,仍必须对“重定向后的最终 URL”执行同等拦截与协议校验 |
| 25 | - DNS rebinding 防护:允许域名访问时,必须在实际发起请求前进行最终解析,或使用安全解析策略避免“先外网后内网” |
| 26 | - URL 归一化:对编码后的主机/路径(双重编码、大小写、用户信息段 `user:pass@host`)先归一化再做 allowlist 判断 |
| 27 | |
| 28 | ## 触发 tracer 的条件 |
| 29 | - URL 由多字段拼接(schema + host + path + query) |
| 30 | - 存在多层函数调用或编码/解码/替换 |
| 31 | - 安全判断依赖字符串规范化(必须追踪真实最终 URL) |
| 32 | |
| 33 | ## 报告输出 |
| 34 | ``` |
| 35 | {output_path}/vuln_audit/ssrf_{timestamp}.md |
| 36 | ``` |
| 37 | |
| 38 | ## 漏洞条目模板(强制) |
| 39 | 与 `php-sql-audit` 同结构,但在数据流链里必须覆盖: |
| 40 | - 最终用于发起请求的 URL/Host/Port 变量来源与拼接过程 |
| 41 | - 协议选择与内网拦截判断的分支证据 |
| 42 | |
| 43 | ## 证据引用(强制:来自 php-route-tracer) |
| 44 | 每条 SSRF 疑似漏洞必须逐项引用 trace 输出中 `## 9) Sink Evidence Type Checklist` 的 **SSRF 行**对应证据要点(禁止只写“可能”;允许状态为待验证,但证据引用必须存在): |
| 45 | 1. `EVID_SSRF_URL_NORMALIZATION`:URL 归一化步骤(对应 SSRF 行中的证据点) |
| 46 | 2. `EVID_SSRF_FINAL_URL_HOST_PORT`:发起请求前的最终 URL/Host/Port(对应 SSRF 行中的证据点) |
| 47 | 3. `EVID_SSRF_FINAL_REDIRECT_URL`:若存在重定向/跟随跳转:最终重定向后地址证据(对应 SSRF 行中的证据点) |
| 48 | 4. `EVID_SSRF_DNSIP_AND_INNER_BLOCK`:DNS/IP 解析与内网拦截判定证据(对应 SSRF 行中的证据点) |
| 49 | |
| 50 | ## tracer 证据缺失处理(强制) |
| 51 | - 若在 trace 中找不到上述 1~4 任一关键证据点:该条漏洞状态只能标记为 `⚠️待验证`,不得给出 `✅已确认可利用`。 |
| 52 | |
| 53 | #### PoC(强制) |
| 54 | - 必须给出可执行请求(HTTP 代码块) |
| 55 | - PoC URL 必须使用真实路由并替换为真实可控字段名 |