$npx -y skills add 0xShe/PHP-Code-Audit-Skill --skill php-xxe-auditPHP Web 源码 XXE 审计工具。识别 XML 解析点与实体处理配置,追踪 XML 输入来源与回显,输出可利用性分级、PoC 与修复建议(禁止省略)。
| 1 | # PHP XXE 审计(php-xxe-audit) |
| 2 | |
| 3 | 分析 PHP 项目源码,识别 XXE(XML External Entity)风险:当 XML 解析点允许外部实体/DOCTYPE,且 XML 输入可控、并存在回显或 OOB 通道时,可能导致文件读取/SSRF/DoS。 |
| 4 | |
| 5 | ## 分级与编号 |
| 6 | - 详见:`shared/SEVERITY_RATING.md` |
| 7 | - 漏洞编号:`{C/H/M/L}-XXE-{序号}` |
| 8 | |
| 9 | ## XXE Sink(必做) |
| 10 | 识别 XML 解析相关: |
| 11 | - `DOMDocument->loadXML/loadHTML` |
| 12 | - `simplexml_load_string/simplexml_load_file` |
| 13 | - `XMLReader->open/xml` |
| 14 | - `DOMDocument->load`(若内容来自用户可控字符串/流) |
| 15 | 危险模式: |
| 16 | - 未禁用外部实体/未限制网络访问 |
| 17 | - 解析参数允许 DOCTYPE |
| 18 | |
| 19 | ## 防护检查(必做) |
| 20 | 必须输出解析器防护证据: |
| 21 | - libxml 安全参数:`LIBXML_NONET`、`LIBXML_NOENT`(注意:NOENT 可能放大风险)、`LIBXML_DTDLOAD` 等使用情况 |
| 22 | - 是否使用:`libxml_disable_entity_loader(true)`(不同 PHP 版本策略不同,仍需给证据) |
| 23 | - 解析时是否传入安全选项并禁用网络访问 |
| 24 | |
| 25 | ## 输入来源与回显(必做) |
| 26 | 必须分别输出: |
| 27 | - XML 输入来源:`$_POST`/`php://input`/上传文件流等 |
| 28 | - 回显路径:是否把解析结果写回响应(`echo`/模板输出)或仅 Blind(OOB)。 |
| 29 | |
| 30 | ## tracer 触发条件(必做) |
| 31 | - XML 经过多层传递/解析后字段再输出 |
| 32 | - 回显位置不清晰或在工具类中 |
| 33 | |
| 34 | ## 证据引用(强制:来自 php-route-tracer) |
| 35 | 每条 XXE 疑似漏洞必须逐项引用 trace 输出中 `## 9) Sink Evidence Type Checklist` 的 **XXE 行**对应证据要点(允许状态为待验证,但证据引用必须存在): |
| 36 | 1. `EVID_XXE_PARSER_CALL`:XML 解析器调用点位置证据(DOMDocument->loadXML/simplexml_load_string/XMLReader->open 等) |
| 37 | 2. `EVID_XXE_INPUT_SOURCE`:输入流来源证据($_POST/`php://input`/上传读取/参数进入解析的对应证据) |
| 38 | 3. `EVID_XXE_ENTITY_DOCTYPE_SAFETY_AND_ECHO`:外部实体/DOCTYPE 禁用相关安全选项证据(LIBXML_* 或禁用策略)以及解析结果回显位置证据 |
| 39 | |
| 40 | ## tracer 证据缺失处理(强制) |
| 41 | - 若无法定位上述 1~3 任一关键证据要点:该漏洞状态只能标记为 `⚠️待验证`,不得直接给出 `✅已确认可利用`。 |
| 42 | |
| 43 | ## 报告输出 |
| 44 | 输出到: |
| 45 | ``` |
| 46 | {output_path}/vuln_audit/xxe_{timestamp}.md |
| 47 | ``` |