后端与接口
测试 REST/GraphQL API…
当你需要对 API 做对象级授权检查、验证越权访问(BOLA/IDOR)或评估访问控制绕过时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
测试 REST/GraphQL API 通用
解决思路
- 先获取书面授权,明确目标 API 端点和测试范围;准备至少两个不同权限、数据互不相同的测试账号,以及各自的认证令牌(JWT、会话 Cookie、API Key)。
- 枚举所有 API 端点并识别引用对象的参数:从 OpenAPI/Swagger 规范提取带路径/查询参数的端点,命令如 `curl -s https://target-api.example.com/api/docs/swagger.json | python3 -c "import json,sys; spec=json.load(sys.stdin); [print(f'{m.upper()} {p} -> params: {[x[\"name\"] for x in d.get(\"parameters\",[]) if x.get(\"in\") in (\"path\",\"query\")]}') for p,ms in spec.get('paths',{}).items() for m,d in ms.items() if m in ('get','post','put','patch','delete') and [x for x in d.get('parameters',[]) if x.get('in') in ('path','query')]]"`;也可用 Burp Suite 浏览应用后从 Target > Site Map 过滤 `/api/v1/`、`/graphql` 等路径,寻找 `/users/{id}`、`/orders/{order_id}`、`/documents/{doc_uuid}` 模式。
- 对对象 ID 类型分类并评估可预测性:顺序整数(如 `/orders/1042`,可递增/递减,风险极高)、UUID v4(随机,风险中,若泄露仍可利用)、编码/哈希值(可解码预测,风险高)、复合 ID(如 `/users/42/orders/1042`,多个 ID 可替换,风险极高)、slug(如 `/profiles/john-doe`,可猜用户名,风险高)。
- 用两个账号分别捕获基线请求:以 User A 和 User B 的令牌调用 `/users/me` 获取各自 ID,再调用 `/users/{id}/orders` 等接口收集各自拥有的对象 ID 列表,作为后续替换测试的素材。
- 执行水平越权测试:用 User A 的令牌去访问 User B 的对象,包括读取 User B 的资料(`GET /users/{user_b_id}`)、读取 User B 的订单(`GET /orders/{order_id}`)、修改 User B 的订单(`PATCH /orders/{id}` 传 `{"status":"cancelled"}`)、删除 User B 的资源(`DELETE /orders/{id}`);若返回 200/204 则判定为存在 BOLA。
- 测试高级 BOLA 模式:参数污染(同时传自己的 ID 和他人 ID,如 `?order_id={user_b_order_id}`)、JSON body 中覆盖对象 ID(`POST /orders/details` 传 `{"order_id": user_b_order_id}`)、批量请求中混入他人 ID(`POST /orders/batch` 传 `{"order_ids": user_a_ids + user_b_ids}`)、对顺序 ID 做偏移枚举(`user_a_order_ids[0] + offset`,offset 从 -5 到 5,若返回 200 且 `user_id` 不等于自己则存在 BOLA)、嵌套资源路径替换(`GET /users/{user_b_id}/orders/{user_b_order_id}/invoice`)、方法切换(对同一资源尝试 GET/PUT/PATCH/DELETE/HEAD/OPTIONS,若返回非 401/403/405 则可能绕过)。
- 使用 Burp Suite 的 Autorize 扩展做自动化检测:安装 Autorize,在 Autorize 标签页粘贴 User B 的认证 Cookie 或 Header;配置拦截过滤 Include `.*\/api\/.*`、Exclude `.*\.(js|css|png|jpg)$`;设置 enforcement 检测条件(User A 访问 User B 资源返回 403/401 标记为 enforced,返回 200 且带 User B 数据标记为 bypassed);以 User A 身份浏览应用,Autorize 会自动用 User B 令牌重放每个请求;查看结果表:绿色=已授权(安全),红色=授权被绕过(BOLA 漏洞),橙色=需人工复核。
- 对 GraphQL API 做 BOLA 测试:使用 node/ID relay 模式,用 User A 的令牌查询 User B 的全局 relay ID(如 `node(id: "T3JkZXI6NTAwMw==")`,即 `Order:5003` 的 Base64),请求 `totalAmount`、`shippingAddress`、`items` 等字段;测试通过关系访问嵌套对象,如 `user(id: "1002")` 查询 User B 的 `email`、`phoneNumber`、`orders`、`paymentMethod` 等。
- 也可用 ffuf 批量枚举对象 ID:`ffuf -u https://api.example.com/orders/FUZZ -w ids.txt -H "Authorization: Bearer token"`。
- 按输出格式记录发现:包含 ID、严重级别、OWASP API 分类、受影响端点、描述、PoC 步骤(认证、合法访问、越权访问、越权修改)、影响范围、修复建议(在数据访问层加 `WHERE order.user_id = authenticated_user.id` 等对象级授权检查、用 UUID 降低可预测性、CI/CD 中加入授权测试、按用户限流)。
适用边界 · 注意事项
- 未获得 API 所有者的书面授权时不要使用——BOLA 测试会访问或尝试访问他人数据,必须获得明确许可。
- 不要只测 GET 而遗漏 PUT/PATCH/DELETE 等可修改或删除数据的方法。
- 不要假设 UUID 就能防止 BOLA——UUID 只是降低可预测性,仍可能从 API 响应、日志或 URL 参数中泄露。