IDOR / BOLA|收据页多参数联合校验失效:codeId 可用 orderId 自证导致越权读取订单(IDOR)

发布于 2 小时前  13 次阅读


收据页多参数联合校验失效(orderId + codeId)

业务流程

下单 → 收到收据链接 → 打开收据查看订单详情(含收货地址、支付方式)。

入口

GET /order/receipt?orderId=12345&codeId=<uuid>

试验矩阵(每一步都是一次可复现的请求)

请求 结果 推出的规则
1 GET /order/receipt?orderId=12345&codeId=<my-uuid> 200,返回自己的完整订单 正常基线
2 移除 codeId 返回"无效代码"错误 codeId 为必需参数;错误信息可直接观测
3 orderId=12346&codeId=<my-uuid>(只改 ID,凭证仍是自
收据页多参数联合校验失效:codeId 可用 orderId 自证导致越权读取订单(IDOR)
原文配图(来源:local://user-case/2026-10-20-order-receipt-idor)
IDOR / BOLA 评分 62.0 状态 candidate QGG-KB-20261020-013

一、核心思路

  • 【方法模板·非来源原文】【多参数联合校验失效(参数互串/凭证自证)】参数角色标注:对象标识(orderId)/凭证(codeId/uuid)/签名/状态,逐个标清
  • 来源链接: local://user-case/2026-10-20-order-receipt-idor
  • 分类命中词: {'IDOR / BOLA': ['idor', '越权']}
落到 QGG 怎么用

可直接落到 QGG 的「IDOR / BOLA」测试清单:【多参数联合校验失效(参数互串/凭证自证)】参数角色标注:对象标识(orderId)/凭证(codeId/uuid)/签名/状态,逐个标清;可生成部分自动化规则候选(有请求级证据)

二、成立条件

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

三、验证方法与步骤

  • 【方法模板·非来源原文】【多参数联合校验失效(参数互串/凭证自证)】参数角色标注:对象标识(orderId)/凭证(codeId/uuid)/签名/状态,逐个标清
  • 【方法模板·非来源原文】【多参数联合校验失效(参数互串/凭证自证)】单参数消融:删/空/错类型/重复参数,记录错误文案差异,建立'什么是必需'基线
  • 【方法模板·非来源原文】【多参数联合校验失效(参数互串/凭证自证)】参数互串:把 A 参数的值塞进 B 参数的槽位(codeId=orderId);再试 A=B 同时同步递增
  • 【方法模板·非来源原文】【多参数联合校验失效(参数互串/凭证自证)】关系判定:只改一个 vs 两个同步改,结果差异说明校验是'逐个校验'还是'关系校验'
  • 【方法模板·非来源原文】【多参数联合校验失效(参数互串/凭证自证)】凭证强度:UUID 是否出现在 JS/其他接口/响应里(泄露即等于无凭证)
  • 【方法模板·非来源原文】【多参数联合校验失效(参数互串/凭证自证)】枚举可行性:对象 ID 是否顺序/自增/时间戳;只读 1-2 条他人实证即止
  • 【方法模板·非来源原文】入口发现:枚举带对象标识的接口(/{id}、?id=、body 内 objectId/uid/tenantId),从 JS/路由/流量里取参数名
  • 【方法模板·非来源原文】前置条件:至少一个自有账号与一个他人对象标识;确认鉴权发生在对象解析之后还是之前
  • 【方法模板·非来源原文】测试变量:对象标识(顺序/随机/负数/他人真实 ID)、用户身份(低权/跨租户)、方法(GET→POST/PUT 观察差异)
  • 【方法模板·非来源原文】成功证据:返回体含他人主体的真实字段值(带条数/实值),非 200 状态码本身
  • 【方法模板·非来源原文】误报过滤:统一错误页、登录跳转、空壳 200、字段名相同但值为掩码
  • 【方法模板·非来源原文】影响确认:只读读取为止,不做写操作;记录读取到的字段与条数
  1. 对象级授权:order.user_id == session.user_id(服务端强制,不看前端隐藏)。
  1. 凭证由服务端签发且与对象强绑定(一次性 token,服务端存储映射),禁止对象 ID 作为凭证。
  1. 收据链接不要把"可推导值"当凭证:改用签名(HMAC(orderId|userId|exp))或随机一次性 token。
  1. 统一错误信息,避免泄露"哪一步校验失败",降低探测效率。
  1. 订单号改为不可枚举(UUID/加盐哈希),并对同一主体高频访问做限流。
  1. 参数角色标注:对象标识 / 凭证 / 签名 / 状态。
  1. 单参数消融:删、空、错类型、重复参数。
  1. 参数互串:A 的值填进 B 的槽位(codeId=orderId),再试 A=B 同步递增。

四、误报排除

  • 【来源原文片段】- 同一会话下未持有他人 codeId,却拿到了他人对象 → 对象级授权缺失。 - 顺序 ID 使影响面从"单条"扩大到"可枚举批量"。 反向证据 / 误报排除 - 第 3 步被拒绝:说明不是"完全不校验",而是"校验方式可绕"——只测这一步会得到错误结论。 - 第 2 步的错误信息是业务错误而非 WAF
  • 【来源原文片段】QGG 接线 - 接口账本给每个参数加 role,机械生成"参数互串矩阵",不靠灵感。 - 报告口径:必须写清"哪种改法被拒、哪种改法通过",否则无法排除误报。
反向证据

  • - 同一会话下未持有他人 codeId,却拿到了他人对象 → 对象级授权缺失。 - 顺序 ID 使影响面从"单条"扩大到"可枚举批量"。 反向证据 / 误报排除 - 第 3 步被拒绝:说明不是"完全不校验",而是"校验方式可绕"——只测这一步会得到错误结论。 - 第 2 步的错误信息是业务错误而非 WAF
  • QGG 接线 - 接口账本给每个参数加 role,机械生成"参数互串矩阵",不靠灵感。 - 报告口径:必须写清"哪种改法被拒、哪种改法通过",否则无法排除误报。

五、影响与修复

影响:

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

修复:

在服务端对每个对象访问做主体归属校验(对象级授权),不要依赖前端隐藏或不可枚举 ID。

关联:CWE-639、OWASP API1:2023 BOLA

六、原始来源

local://user-case/2026-10-20-order-receipt-idor



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