Authentication Bypass|静态资源后缀 + %23 编码绕过 401:/api/users%23.map 让网关放行、框架命中真实路由

发布于 23 小时前  13 次阅读


静态资源后缀 + %23 编码绕过 401(/api/users%23.map)

技巧本体

对被 401 保护的路由 /api/users:

GET /api/users%23.map     → 200,返回 /api/users 的真实响应
GET /api/users?.map       → 仍 401(无效)

必须 %23.map(# 的编码),?.map(query 形式)不行。

为什么 %23 行而 ? 不行(机制拆解)

两层对"这个请求是什么"的判断不一致:

层 看到 %23.map 看到 ?.map
网关/鉴权层(Nginx/openresty/WAF) 原始字节 %23 不是 # → 不当作 fragment 截断;`.m
静态资源后缀 + %23 编码绕过 401:/api/users%23.map 让网关放行、框架命中真实路由
原文配图(来源:local://user-case/2026-10-27-gateway-suffix-bypass)
Authentication Bypass 评分 58.0 状态 candidate QGG-KB-20261027-002

一、核心思路

  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】画状态机:每步 输入 / 服务端产出 / 会话或 token / 下一步依赖,缺一步会误判
  • 来源链接: local://user-case/2026-10-27-gateway-suffix-bypass
  • 分类命中词: {'Authentication Bypass': [], 'Command Injection / RCE': ['rce'], 'Path Traversal / LFI': ['../']}
落到 QGG 怎么用

可直接落到 QGG 的「Authentication Bypass」测试清单:【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】画状态机:每步 输入 / 服务端产出 / 会话或 token / 下一步依赖,缺一步会误判;仅可生成人工核查清单(缺请求级证据,禁自动生成生产模板)

二、成立条件

  • 来源未明确写出成立条件(缺失,需在验证阶段补齐)

三、验证方法与步骤

  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】画状态机:每步 输入 / 服务端产出 / 会话或 token / 下一步依赖,缺一步会误判
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】身份来源标注:每步服务端认定的身份来自输入参数、会话 cookie、数据库、还是上一步响应?
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】步骤跳跃与乱序:直达 step3/step4、跳过 step2、重放 step1 的响应推进 step2
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】参数替换:在某一步替换主体标识(手机号/邮箱/uid),观察最终写入落在谁身上
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】响应篡改:改 success/code/step/returnkey,看服务端是否采信客户端结论
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】state token 跨主体:把 returnkey/flow_id 换到另一会话,是否跨主体生效(只读判定)
  • 【方法模板·非来源原文】【多步骤流程的信任模型错位(每步各自校验、步骤间主体不一致)】终态核对:改密/改绑后用'原身份'与'目标身份'分别登录,确认到底改了谁
  • 【方法模板·非来源原文】【版本 diff 定位 1-day(补丁差异 → 根因 → 可测点)】拿到补丁前后的两个版本(官方发布、容器镜像、JAR/DLL、固件),先比文件清单再比内容
  • 【方法模板·非来源原文】【版本 diff 定位 1-day(补丁差异 → 根因 → 可测点)】diff 出改动函数/字符串/常量,反推输入如何到达该点(source→sink)
  • 【方法模板·非来源原文】【版本 diff 定位 1-day(补丁差异 → 根因 → 可测点)】把改动点翻译成一个可发的请求:参数名、编码、路径、header
  • 【方法模板·非来源原文】【版本 diff 定位 1-day(补丁差异 → 根因 → 可测点)】在受影响版本上验证:改动前通过、改动后被拒(这就是可复现的判据)
  • 【方法模板·非来源原文】【JS 端点扒取 → 未授权可达矩阵(把"猜"变成"枚举")】从 JS(含 sourcemap、懒加载 chunk)提取全部 API 路径与参数,落盘接口账本
  • 【方法模板·非来源原文】【JS 端点扒取 → 未授权可达矩阵(把"猜"变成"枚举")】对每个端点做未授权探测:无 Cookie、无 Token,只发一次
  • 【方法模板·非来源原文】【JS 端点扒取 → 未授权可达矩阵(把"猜"变成"枚举")】按响应差异分桶:403/401(有鉴权)vs 200/302/405(可疑)vs 业务码差异
  • 【方法模板·非来源原文】【JS 端点扒取 → 未授权可达矩阵(把"猜"变成"枚举")】对可疑端点补参数,再判断是否真能取到数据(不是只看状态码)
  • 【方法模板·非来源原文】【编码/规范化逻辑穿透(条件分支里的绕过)】定位编码/转义/校验函数,看它的前置条件(什么情况下跳过)
  • 【方法模板·非来源原文】【编码/规范化逻辑穿透(条件分支里的绕过)】构造让该条件为假的输入(空值、类型不符、超长、数组、编码歧义)
  • 【方法模板·非来源原文】【编码/规范化逻辑穿透(条件分支里的绕过)】观察服务端是否按'未编码'的语义继续处理
  • 【方法模板·非来源原文】【多步骤流程身份错位(step 间主体不一致 / 响应篡改 / 终态核对)】画状态机:每步输入 / 服务端产出 / token / 下一步依赖
  • 【方法模板·非来源原文】【多步骤流程身份错位(step 间主体不一致 / 响应篡改 / 终态核对)】标注每步'服务端认定的身份'来自参数、cookie、数据库还是上一步响应
  • 【方法模板·非来源原文】【多步骤流程身份错位(step 间主体不一致 / 响应篡改 / 终态核对)】步骤跳跃/乱序/重放;某步替换主体标识;篡改 success/step/returnkey
  • 【方法模板·非来源原文】【多步骤流程身份错位(step 间主体不一致 / 响应篡改 / 终态核对)】终态核对:改完用'原身份'与'目标身份'分别登录,确认到底改了谁
  • 【方法模板·非来源原文】【边界设备 pre-auth 面(指纹 → 未授权 → 会话泄露)】先定指纹与版本(测绘结果 + 页面特征),确认是否落在已知影响范围
  • 【方法模板·非来源原文】【边界设备 pre-auth 面(指纹 → 未授权 → 会话泄露)】优先打 pre-auth 路径:认证前可访问的 servlet、/api/v1/*、管理端登录前置接口
  • 【方法模板·非来源原文】【边界设备 pre-auth 面(指纹 → 未授权 → 会话泄露)】内存破坏类优先找'会话/token 泄露'证据(读到自己不该有的 cookie/token)
  • 【方法模板·非来源原文】【边界设备 pre-auth 面(指纹 → 未授权 → 会话泄露)】只读到自身会话不算;必须拿到他人会话或明确的内存内容
  • 【方法模板·非来源原文】【HTTP 方法覆盖/OPTIONS 绕过鉴权】对受保护端点做方法矩阵:GET/POST/PUT/DELETE/OPTIONS/HEAD/PATCH 各一次,记录状态与响应体差异
  • 【方法模板·非来源原文】【HTTP 方法覆盖/OPTIONS 绕过鉴权】试方法覆盖头:X-HTTP-Method-Override / X-Method-Override / _method 参数
  • 【方法模板·非来源原文】【HTTP 方法覆盖/OPTIONS 绕过鉴权】对比响应体而不只是状态码(部分网关 OPTIONS 返回 200 + 真实数据)
  • 【方法模板·非来源原文】【HTTP 方法覆盖/OPTIONS 绕过鉴权】同族横向:同网关下其他路径是否同样绕过
  • 【方法模板·非来源原文】【弱口令/默认口令(有限度,命中即停)】先确认账号存在性差异(响应/耗时),再决定是否试口令
  • 【方法模板·非来源原文】【弱口令/默认口令(有限度,命中即停)】按产品默认口令字典试:产品名+年份(@2024/@2025)+ 常见 admin/111111
  • 【方法模板·非来源原文】【弱口令/默认口令(有限度,命中即停)】上限 3 次/账号、串行、间隔 2-5s、5 分钟内停;命中即停并留证
  • 【方法模板·非来源原文】【SSRF / 可控 issuer 拉取(认证链上的请求伪造)】找可控 URL 参数(iss/jku/callback/webhook/avatar/import)
  • 【方法模板·非来源原文】【SSRF / 可控 issuer 拉取(认证链上的请求伪造)】回连自有 canary(DNS/HTTP),确认请求确实由服务端发出
  • 【方法模板·非来源原文】【SSRF / 可控 issuer 拉取(认证链上的请求伪造)】试内网地址与元数据地址(云 metadata),只读判定
  • 【方法模板·非来源原文】入口发现:登录/重置/SSO 回调/验证码/记住我/多因子各分支
  • 【方法模板·非来源原文】测试变量:字段省略(如 captcha 整体不传)、类型污染、大小写、注释截断、响应篡改
  • 【方法模板·非来源原文】成功证据:无凭据拿到受保护资源(带响应体)或进入他人账号
  • 【方法模板·非来源原文】误报过滤:仅 302 到首页不算;必须验证会话真的可访问受保护页面

【缺失】来源未给出可执行复现步骤;需按 test_methodology 在授权靶场自行设计并记录

四、误报排除

  • 【来源原文片段】00 且返回用户数据 JSON(真实主体字段,非错误页)。 - 负向:?.map 与 裸 # 均 401(证明不是"随便加后缀"都能绕)。 误报排除 - 响应必须是接口数据(用户字段/列表),不是 index.html 或通用 200 壳。 - 对照路径 /nonexist%23.map 应
反向证据

  • 00 且返回用户数据 JSON(真实主体字段,非错误页)。 - 负向:?.map 与 裸 # 均 401(证明不是"随便加后缀"都能绕)。 误报排除 - 响应必须是接口数据(用户字段/列表),不是 index.html 或通用 200 壳。 - 对照路径 /nonexist%23.map 应

五、影响与修复

影响:

分类:Authentication Bypass;来源严重性:未提供。实际影响需以本地/授权靶场复现结果为准,评分与来源自述不构成影响结论。

修复:

统一鉴权中间件覆盖全部路由,验证码字段缺失即拒绝,禁止客户端可控的信任标记。

关联:CWE-288

六、原始来源

local://user-case/2026-10-27-gateway-suffix-bypass



レムは信じています。 蕾姆相信 …而是你怕自己,再次辜负了雷姆爱你的心。