用途
本技能用于测试 REST 与 GraphQL API 是否存在对象级授权缺失(Broken Object Level Authorization,BOLA,也称 IDOR,对应 OWASP API1:2023)。适用于在 URL 路径、查询参数或请求体中使用对象标识符的 API,多租户 SaaS 应用的跨租户数据隔离验证,以及新增端点后确认授权中间件是否一致生效。
使用时必须具备 API 所有者的书面授权。BOLA 测试涉及访问或尝试访问他人数据,缺少明确许可不得执行。
前提条件
- 书面授权,明确目标 API 端点与测试范围
- 至少两个权限级别不同、数据集不同的测试账号
- 配置为拦截代理的 Burp Suite Professional 或 OWASP ZAP
- 每个测试账号的认证令牌(JWT、会话 Cookie、API Key)
- API 文档(OpenAPI/Swagger 规范)或可用于枚举端点的访问方式
- Python 3.10+ 与 requests 库,用于脚本化测试
- 已安装 Autorize Burp 扩展以实现自动化 BOLA 检测
主要能力
技能围绕一个六步工作流展开:
- 端点发现与对象 ID 映射:从 OpenAPI/Swagger 规范或 Burp 流量中枚举端点,提取路径与查询参数,识别形如
/api/v1/users/{id}、/api/v1/orders/{order_id}的对象引用,并对 ID 类型分类(顺序整数、UUID v4、编码/哈希值、复合 ID、slug)及对应的可预测性与 BOLA 风险。 - 基线请求捕获:分别以用户 A 与用户 B 的令牌获取各自的资料与对象 ID 列表,作为后续交叉测试的基准。
- 水平越权测试:用用户 A 的令牌访问、修改、删除用户 B 的对象,根据响应状态码判定是否可越权(如 200、204 视为存在漏洞)。
- 进阶 BOLA 技巧:参数污染、JSON 请求体中的对象 ID 覆盖、批量请求中混入他人 ID、顺序 ID 的数值枚举、嵌套资源路径中的 ID 替换、以及对 GET 之外的方法(PUT/PATCH/DELETE/HEAD/OPTIONS)逐一切换测试。
- Autorize 自动化检测:在 Burp Suite 中配置用户 B 的凭据与拦截过滤规则(包含
.*\/api\/.*,排除静态资源),以用户 A 浏览应用时自动重放请求,并根据响应差异标记授权是否被绕过。 - GraphQL BOLA 测试:针对 node/ID relay 模式与嵌套关系查询,测试跨用户对象访问。
使用方式
技能提供直接可用的代码片段:从 Swagger 规范提取带参数端点的 curl + Python 命令、使用 requests 库获取账号对象的脚本、越权访问/修改/删除的测试脚本、参数污染与批量 ID 注入示例、方法切换测试循环,以及 GraphQL 查询示例。所有测试结果可按统一格式输出报告,包含发现 ID、严重级别、受影响端点、描述、PoC 步骤、影响与修复建议。
适用场景
文档给出一个电商 API 评估的完整示例:通过 Swagger 规范定位 47 个端点(其中 23 个带对象 ID),系统性地将用户 A 的对象 ID 替换为用户 B 的 ID,最终在订单读取、地址修改、支付方式查看、批量导出等端点发现 BOLA,而订单删除端点正确返回 403。
限制与常见误区
- 仅测试 GET 请求,遗漏 PUT/PATCH/DELETE 中可修改或破坏数据的 BOLA
- 误以为 UUID 可防止 BOLA——UUID 可预测性低,但可能通过 API 响应、日志或 URL 参数泄露
- 未测试嵌套资源路径中授权仅检查父资源而遗漏子资源的情况
- 遗漏接受对象 ID 数组的批量端点
- 未考虑不同 API 版本(v1 与 v2)可能具有不同的授权实现
修复建议包括:实现对象级授权中间件,在数据访问层加入 WHERE order.user_id = authenticated_user.id 一类校验,用 UUID 替代顺序整数 ID(纵深防御,单独使用并非修复),在 CI/CD 中为每个带对象 ID 的端点加入授权测试,并按用户实施限流以减缓枚举。