PHP 鉴权机制审计(Auth Audit)用于分析 PHP Web 项目源码,识别认证与授权链路,判断每条路由的鉴权状态,并检测鉴权绕过/越权/IDOR 风险。
主要能力
工具会完成完整分析:处理所有在 php-route-mapper 中出现的路由;识别认证链(Session/JWT/中间件/自定义校验函数);输出路由-鉴权映射表(不做省略);对所有可疑点给出位置证据、数据流链、可利用性分析、验证 PoC 与修复建议。
运行模式
工具支持两种模式,用于解决“尚未生成 trace 之前无法引用 EVID_*”的问题:
- STATIC_MAPPING(推荐用于流水线阶段 1):只生成 auth_mapping 文件(以及可选的 auth_README),允许缺少 php-route-tracer 的 EVID_* 证据点引用,必须给出鉴权状态分级(✅/⚠️/❌/❓)与 P0/P1 分桶依据(不需要 PoC)。
- TRACE_AUDIT(推荐用于流水线阶段 4,trace 已存在):生成完整的 auth_audit_report 文件,并强制逐条引用 trace 契约中的 EVID_* 证据点,PoC 与修复建议必须齐全。
漏洞分级详见 shared/SEVERITY_RATING.md。
输入依赖
建议输入(与 shared/IO_PATH_CONVENTION.md 一致;合并流水线时读总报告中等价章节):routes 与 params 文件。可选输入为 source_path。
识别鉴权实现
按框架识别:
- Laravel:middleware('auth'|'can'|'role:')、Auth::check()/Auth::user()、Policies/Gates(Gate::allows、->can)、路由保护(Route::middleware([...])->group(...))。
- Symfony:security.yaml / access_control、denyAccessUnlessGranted、isGranted、voter/policy。
- 原生 PHP:session_start + $_SESSION 判断、if (!isset($_SESSION['user']))/requireLogin()、自定义函数(checkAuth/authorize/hasRole/isAdmin)。
路由-鉴权映射
对每条路由输出以下状态:✅ 公开、✅ 受保护、⚠️ 仅认证、❌ 无鉴权、❓ 不确定(动态权限/复杂自定义逻辑导致难判时仍必须写出证据点)。并输出风险类型 AUTH,包括认证绕过、授权绕过/越权、IDOR。
可疑模式检测
- 路径/URI 匹配导致鉴权绕过:常见根因是用原始 $_SERVER['REQUEST_URI'] 或 parse_url 结果做白名单匹配,但路径未规范化;编码/大小写/重复斜杠/尾部字符差异导致匹配失败。必须输出白名单检查位置与代码片段、绕过请求(PoC)与命中的 handler 证据。
- 仅校验登录态,缺少角色/资源授权:必须输出路由的“认证检查”位置与“授权检查缺失”位置。
- IDOR/越权:必须输出敏感对象 id 来源、归属校验是否存在、未校验的原因与可达性。
报告输出
输出到 {output_path}/auth_audit/ 目录,包含 auth_audit_report、auth_mapping 与 auth_README 三类文件。强制规则:STATIC_MAPPING 必须生成 auth_mapping;TRACE_AUDIT 必须生成完整三文件并要求 trace 证据点齐全。
主报告包含鉴权框架识别、鉴权架构概览、风险统计、每条风险的完整漏洞结构(编号/分级/数据流/PoC/修复)。映射表只列路由与鉴权状态、所需角色/条件,但必须新增分桶字段 p_bucket(P0 为 ❌ 无鉴权;P1 为 ⚠️ 仅认证或检测到授权绕过/越权/IDOR 风险)与 p1_reason(简短静态依据)。说明文档只说明方法论、工具与验证指南,不包含具体漏洞细节。
PoC 验证模板
必须区分至少以下场景:未登录访问、普通用户访问、管理员/高权限对照(如适用)。PoC 必须是可执行 HTTP 请求代码块,路由路径必须使用真实路由规则。
证据引用
STATIC_MAPPING 不强制引用 trace 的 EVID_* 证据点。TRACE_AUDIT 每条疑似鉴权风险必须逐项引用 trace 输出中的证据:EVID_AUTH_PATH_PROTECTED_MATCH、EVID_AUTH_TOKEN_DECODE_JUDGMENT、EVID_AUTH_PERMISSION_CHECK_EXEC、EVID_AUTH_IDOR_OWNERSHIP_CONDITION。
限制
TRACE_AUDIT 模式下若 trace 契约校验失败或无法定位任一关键证据点,该风险只能标记为 ⚠️待验证,不得给出已确认可利用或“确定可绕过”的结论。