PHP 任意文件写入审计(php-file-write-audit)
用途:分析 PHP 项目源码中「将数据写入磁盘文件」的实现逻辑,识别并评估任意文件写入风险,输出结构化审计报告。
主要能力:
- 任意落点写入:识别写入目标路径可被攻击者控制的情况,含路径穿越到落点。
- 写入内容可控:判断写入文件内容是否来源于用户输入,为后续 RCE/覆写创造条件。
- 覆盖/截断模式:检查是否以 w/x 等覆盖方式写入,或产生可利用的同名冲突覆盖。
- WRITE Sink 识别:覆盖 file_put_contents、fwrite、stream_write/fputs、fopen('w'|'x'|'a' 等)、ftruncate、rename、copy、move_uploaded_file、error_log(message,3,destination) 等函数与语句。
- 路径穿越到写入落点检测:分析 base 目录与用户输入的拼接与归一化链路,检查净化/拒绝穿越片段、realpath/canonicalize 及前缀校验,判定最终 resolved target 是否逃逸 base。
- 写入内容可控性与覆盖策略:追踪 content/data 来源、decode/拼接/模板化后是否仍可控,以及覆盖模式与条件分支。
- 写入后可执行性/可触达性评估:检查扩展名/解析路径、落点是否在 Web 根或可包含目录、是否存在执行禁用策略。
分级与编号:详见 shared/SEVERITY_RATING.md;漏洞编号格式 {C/H/M/L}-WRITE-{序号}。
证据要求:每条 WRITE 疑似漏洞必须逐项引用来自 php-route-tracer 的 ## 9) Sink Evidence Type Checklist 中 WRITE 行的证据要点,包括 EVID_WRITE_WRITE_CALLSITE、EVID_WRITE_DESTPATH_JOIN_AND_NORMALIZATION、EVID_WRITE_DESTPATH_RESOLVED_TARGET、EVID_WRITE_CONTENT_SOURCE_INTO_WRITE、EVID_WRITE_TRUNCATE_OR_OVERWRITE_MODE、EVID_WRITE_EXECUTION_ACCESSIBILITY_PROOF。若关键证据缺失或无法对应,漏洞状态只能标记为 ⚠️待验证,不得直接给出 ✅已确认可利用。
tracer 触发条件:至少满足其一,且必须依赖 trace 验证 sink 存在:写入目标路径经过多层函数/对象属性/JSON 字段传递后到达写入函数;写入内容经过 decode/拼接后仍可控;存在分支逻辑导致仅部分情况下会覆盖/截断/落到可写可控目录。
报告输出:输出到 {output_path}/vuln_audit/write_{timestamp}.md。每条漏洞须遵循指定模板,含严重等级、可达性、影响范围、利用复杂度、可利用性、位置、数据流链、可利用前置条件、证据引用、验证 PoC(HTTP 请求与观察点)以及建议修复。
使用方式:作为技能在源码审计流程中调用,依赖 php-route-tracer 的 trace 输出进行证据化判断,并生成上述 Markdown 报告。修复建议强调以最终 resolved target 是否在允许 base 目录内为准,强制 realpath + 前缀校验;严格限制可写目录并使用 allowlist;避免把用户输入直接拼到文件路径;对写入内容做类型约束;避免以 w/x 直接覆盖敏感文件;提供 rg 搜索语句定位写入 API 与路径拼接点。
适用场景:PHP Web 应用源码安全审计、任意文件写入漏洞排查、写入链路与路径穿越分析。
限制:具体误报率、性能数据、依赖环境与版本要求暂未提供。