rickyma18/api-pentest-otp-business-logic

GitHub: rickyma18/api-pentest-otp-business-logic

一份聚焦 API 业务逻辑滥用与 OTP 漏洞的脱敏评估案例,展示了如何串联多个弱点形成可牟利的攻击链。

Stars: 0 | Forks: 0

# 🔴 API 安全评估 — 幻想投注平台中的业务逻辑滥用 本评估展示了识别、利用并串联多个 API 漏洞,形成真实可牟利的攻击场景的能力。 ![严重等级](https://img.shields.io/badge/Global%20Risk-CRITICAL-red) ![发现项](https://img.shields.io/badge/Findings-25%20confirmed-blue) ![范围](https://img.shields.io/badge/Scope-API%20Backend%20%2F%20Mobile-purple) ![框架](https://img.shields.io/badge/Framework-OWASP%20API%20Top%2010%20(2023)-lightgrey) --- ## ⚠️ 免责声明 本文档是**经过脱敏与匿名化处理的真实评估报告**。所有客户名称、域名、端点、标识符、令牌及用户数据均已替换为虚构占位符(`api.example.com`、`user_1`、虚拟 UUID 等)。本文档中的信息**不得用于攻击原始系统**。仅限个人作品集展示用途,经授权发布。 --- ## 📑 目录 1. [执行摘要](#1-executive-summary) 2. [参与概述](#2-engagement-overview) 3. [方法论](#3-methodology) 4. [发现汇总](#4-findings-summary) 5. [旗舰发现 — 推荐农场 + 完整折扣绕过](#5-flagship-finding--referral-farming--full-discount-bypass) 6. [攻击路径](#6-attack-paths) 7. [精选技术发现](#7-selected-technical-findings) 8. [端到端攻击叙事](#8-end-to-end-attack-narrative) 9. [影响分析](#9-impact-analysis) 10. [OWASP API Top 10 (2023) 映射](#10-owasp-api-top-10-2023-mapping) 11. [修复路线图](#11-remediation-roadmap) 12. [检测缺口分析](#12-detection-gap-analysis) 13. [经验总结](#13-lessons-learned) 14. [工具与技术栈](#14-tools--stack) --- ## 1. 执行摘要 目标为**移动端“幻想投注”应用的 REST API 后端**——用户加入私密社群,对体育赛事结果进行付费预测并共享奖金池。应用与外部金融科技提供商对接处理存取款,并运行带有真实货币奖励的推荐计划。 评估采用**黑盒方式**,针对**QA 环境**,覆盖认证、账户恢复、参与流程、支付集成、推荐跟踪、操作观察性端点与会话管理。 ### 核心结果 | 指标 | 值 | |---|---| | **全局风险等级** | 🔴 **严重** | | 确认发现 | **25**(10 个关键 · 8 个高 · 4 个中 · 3 个低) | | 已验证假设(排除) | 7(有明确记录) | | 识别出的积极控制项 | 9 | | 单个最高 CVSS | 9.1 | | 旗舰发现 | 可货币化的业务逻辑滥用链 | ### 关键结论 - **完全可自动化的业务逻辑滥用链**(旗舰发现)使外部攻击者无需真实付款即可从推荐计划中提取真实奖励,链式利用了 OTP 设计缺陷、缺少速率限制以及公开端点暴露的内部支付方式。 - **BOLA(Broken Object Level Authorization)具有系统性**:7 个端点均存在,非孤立漏洞。根本原因为架构层面未实施跨对象所有权策略。 - **密码更改不是有效的响应控制**:变更密码前后颁发的访问令牌与刷新令牌仍有效。一旦令牌泄露,攻击者可长期保持访问。 - **未认证的 Prometheus `/metrics` 端点**泄露真实 `transactionId` 与 `userId`,直接助长了针对交易记录的 BOLA 攻击。 --- ## 2. 能力展示 本评估展示了识别、验证并串联多个 API 漏洞,形成真实可牟利攻击场景的能力。 ### 🔐 API 安全评估 - OWASP API Top 10 (2023) 评估 - 端点枚举与攻击面测绘 - 认证与会话管理测试(JWT、OTP 流程) ### 🚨 授权与访问控制分析 - BOLA / IDOR 跨端点利用 - 水平与垂直权限提升 - 多端点授权链组合 ### 💣 业务逻辑滥用与金融操纵 - 可货币化攻击路径识别与利用 - 金融流程操纵(支付绕过、推荐滥用) - 面向内部使用的功能被公开暴露 ### 🔄 攻击链构建 - 端到端利用路径设计与执行 - 多个低/中严重问题汇聚为关键影响 - 模拟真实攻击者思维 ### 🧪 验证与利用 - 手工 HTTP 请求重现 - PowerShell 脚本自动化 - QA 环境受控验证 ### 🏗️ 安全架构与风险分析 - 系统性设计缺陷识别(认证、授权、可观察性) - 孤立漏洞与架构弱点的区分 - 超越 CVSS 的业务影响评估 ### 🧭 专业方法 - 以实际可利用性为导向 - 关注业务影响与攻击可行性 - 与 OWASP 及真实攻击行为对齐的方法论 --- ## 3. 测试方式 评估采用**以攻击者驱动的手动方法**,聚焦可利用的认证、授权与业务逻辑弱点。 ### 🧭 攻击面测绘 - 使用 OpenAPI(Swagger)枚举所有暴露端点 - 识别高风险区域:认证流、参与流程、交易、推荐系统、可观察性端点 - 绘制实体关系图(用户 → 参与 → 交易 → 推荐) ### 🔐 认证与会话分析 - 测试登录、密码重置、OTP 验证流程 - 分析令牌生命周期(JWT 访问令牌 + 刷新令牌) - 验证密码更改后的会话失效行为 - 发现 OTP 泄露与令牌重用机会 ### 🚨 授权测试(BOLA / IDOR) - 在用户范围端点执行水平访问控制测试 - 操纵对象标识符(userId、participationId、transactionId) - 关联来自多个端点(指标、统计、排位)的泄露标识符 - 验证多个资源上缺少所有权检查 ### 💣 业务逻辑滥用测试 - 分析支付与参与流程 - 测试多种支付方式,包括内部专用选项 - 模拟推荐与奖励系统的滥用场景 - 识别具有真实财务影响的攻击路径 ### 🔄 多步骤攻击链 - 组合多个低/中严重问题形成完整利用链 - 从数据泄露 → IDOR → 金融滥用重构攻击者路径 - 验证端到端场景的可行性 ### 🧪 验证与利用 - 使用原始 HTTP 请求重现攻击 - 使用 PowerShell 脚本自动化关键流程 - 在受控 QA 环境验证 - 验证正向与负向控制(防护按预期生效) ### 📊 可观察性与数据暴露 - 分析公开可访问的监控端点 - 识别指标中的敏感数据泄露 - 将泄露标识符与脆弱端点关联 ### 🧭 测试理念 - 优先真实可利用性而非理论漏洞 - 关注业务影响与货币化潜力 - 将业务逻辑视为主要攻击面 ### 🧰 工具(辅助角色) - Burp Suite(手动拦截与请求操作) - PowerShell(流程自动化) - 浏览器开发者工具(客户端分析) --- ## 4. 成果证明 本案例研究基于在受控 QA 环境中执行的动手测试与可重现攻击场景。 评估包含: - 跨多个 API 端点的真实攻击链重建 - 每个漏洞的可重现 HTTP 请求 - 用于自动化关键利用流程的 PowerShell 脚本 - 多端点关联攻击(IDOR + 数据暴露 + 业务逻辑) - 通过模拟场景验证的财务影响 所有示例均已脱敏,移除任何敏感或可识别信息。 --- ## 5. 影响概览 | 领域 | 影响 | |---|---| | 认证 | 因 OTP 滥用导致的账户接管 | | 授权 | 系统性 BOLA / IDOR 暴露 | | 业务逻辑 | 推荐系统中的金融操纵 | | 监控 | 指标端点泄露敏感数据 | --- ## 2. 参与概述 ### 目标 评估移动端客户端所依赖的后端 API 的安全状况,重点关注**业务逻辑完整性**,而非仅技术漏洞。评估范围明确面向可能产生直接经济、监管或声誉影响的滥用场景。 ### 范围 - 后端 API(QA 环境):`https://api.example.com/api` - 移动端客户端(Android APK —— 静态分析 + 动态调试) - 关键功能流:注册、认证、密码恢复、池参与、团体排名、获奖者、财务交易、外部钱包集成、推荐计划 - 操作端点:`/metrics`、`/api-docs` ### 范围外 - 底层基础设施(云、容器、边界网络) - 后端源代码审查(纯黑盒测试) - 第三方支付提供方内部机制 - 生产环境 ### 授权与周期 测试在客户书面授权下,针对独立的 QA 环境,在多周迭代周期内执行。 --- ## 3. 方法论 评估结合多种行业框架: - **OWASP API 安全 Top 10 (2023)** - **OWASP MASVS**(移动应用安全验证标准) - **OWASP WSTG v4.2** - **PTES**(渗透测试执行标准) ### 阶段 ``` ┌─────────────────────────────────────────────────────────────┐ │ 1. Passive recon → APK static analysis, OpenAPI │ │ enumeration, /metrics scraping │ │ 2. Active enumeration → endpoint mapping, auth patterns │ │ 3. AuthN / session → OTP flow, token lifecycle │ │ 4. AuthZ → BOLA, BFLA, horizontal/vertical │ │ 5. Business-logic → referral program, payment │ │ abuse methods, financial flows │ │ 6. Chain construction → multi-endpoint exploitation │ │ 7. Controlled PoC → end-to-end validation │ └─────────────────────────────────────────────────────────────┘ ``` ### 工具 `JADX` · `Burp Suite Pro` · `Frida` · `Postman` / `curl` · 自定义 Python 自动化脚本 --- ## 4. 发现汇总 ### 按严重性分布 | 严重性 | 数量 | CVSS 平均值 | CVSS 范围 | |---|---|---|---| | 🔴 关键 | 10 | 8.4 | 7.5 – 9.1 | | 🟠 高 | 8 | 7.3 | 6.5 – 8.1 | | 🟡 中 | 4 | 5.1 | 4.3 – 5.5 | | 🟢 低 | 3 | 2.8 | 2.0 – 3.7 | | **总计** | **25** | — | — | ### 按 OWASP API Top 10 (2023) 分布 | 类别 | 发现 | 占比 | |---|---|---| | API1 — 破坏对象级别授权 | 7 | 28% | | API2 — 破坏认证 | 5 | 20% | | API3 — 破坏对象属性级别授权 | 1 | 4% | | API4 — 无限制资源消耗 | 1 | 4% | | API5 — 破坏函数级别授权 | 1 | 4% | | API6 — 无限制访问敏感业务流 | 2 | 8% | | API8 — 安全配置错误 | 8 | 32% | **战略解读**:80% 的发现集中在 API1 + API2 + API8。这表明平台在设计时未将授权作为跨层策略,且可观察性表面未与功能表面同步加固。 --- ## 5. 旗舰发现 — 推荐农场 + 完整折扣绕过 **发现 ID**:`F-036` **严重性**:🔴 关键 · **CVSS 3.1**:8.7 — `AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:H/A:N` **OWASP**:API6:2023 — *无限制访问敏感业务流*(主要) + API5:2023 — *破坏函数级别授权* ### 是什么 一个**可自动化的业务逻辑滥用链**,使攻击者无需真实付款即可从平台的推荐计划中获取真实货币奖励。该向量由五个独立弱点组合而成,单独看均为中等严重,但组合后破坏了推荐计划的经济完整性。 ### 为何 CVSS 低估影响 CVSS 基础分 8.7 仅反映技术链条的严重性。**实际业务影响更大**,因为: - 直接货币化 - 攻击账户数量可线性扩展 - 每笔欺诈推荐的边际成本接近零 - 客户端难以检测 ### 根本原因 **架构层面**:推荐计划缺乏反欺诈模型,无法关联同一 `invitationCode` 创建的多账户、检测多账号行为,或在奖励发放前要求真实付款证明。奖励资格基于**注册**而非**真实交易**。 **实现层面**:内部支付方式 `full_discount`( intended for internal/promotional use)被公共 `POST /api/participations` 端点接受,且**无角色校验、无折扣码验证、无上下文验证**。由此创建的参与记录可计入奖品池并**触发推荐奖励累积**。 ### 组件发现 | 组件 | 在链条中的作用 | |---|---| | `F-001` — 密码恢复响应中泄露 OTP | 绕过“持有”因素 | | `F-002` — 通用认证响应中泄露 OTP | 支持批量注册而无需真实手机/邮箱 | | `F-004` — 注册 / OTP / 恢复无速率限制 | 支持自动化大规模操作 | | `F-034` — 以可控账户进行推荐农场 | 多账户创建并统一使用 `invitationCode` | | `F-019` — `full_discount` 支付方式公开可用 | 支付绕过 — 创建无需真实付款的参与记录 | ### 攻击流程 ``` ┌────────────────────────────────────────────────────────────────────┐ │ FLAGSHIP CHAIN — Referral Farming × Full-Discount Monetization │ │ │ │ [F-001/002] OTP code returned in HTTP body │ │ │ │ │ ▼ │ │ [F-004] Mass registration, no rate limit │ │ │ │ │ ▼ │ │ [F-034] N accounts registered under attacker's invitation │ │ │ │ │ ▼ │ │ [F-019] Each account creates a participation with │ │ paymentMethod: "full_discount" (no real payment) │ │ │ │ │ ▼ │ │ [F-036] Attacker's primary account accrues referral rewards │ │ (discountAmount / profitsAmount increase observed) │ │ │ │ RESULT: Real monetary value extracted from the platform │ │ Scales ~linearly with number of controlled accounts │ └────────────────────────────────────────────────────────────────────┘ ``` ### 概念验证 **步骤 1 — 攻击者获取自身的 `invitationCode`** ``` GET /api/users/me HTTP/1.1 Host: api.example.com Authorization: Bearer eyJhbGciOi...TRUNCATED ``` ``` { "id": "00000000-0000-0000-0000-000000000001", "invitationCode": "ATTACKER123" } ``` **步骤 2 — 注册被推荐账户(循环 N 次)** ``` POST /api/auth/register HTTP/1.1 Host: api.example.com Content-Type: application/json { "email": "referred01@example.com", "password": "Passw0rd!", "invitationCode": "ATTACKER123" } ``` **步骤 3 — 请求 OTP(持有因素可被绕过)** ``` POST /api/otp/send HTTP/1.1 Host: api.example.com Content-Type: application/json { "email": "referred01@example.com", "type": "registration" } ``` ``` { "status": "ok", "code": "000000" } ``` **步骤 4 — 使用泄露值验证 OTP** ``` POST /api/otp/verification HTTP/1.1 Host: api.example.com Content-Type: application/json { "email": "referred01@example.com", "code": "000000" } ``` **步骤 5 — 以被推荐账户登录** ``` POST /api/auth/login HTTP/1.1 Host: api.example.com Content-Type: application/json { "email": "referred01@example.com", "password": "Passw0rd!" } ``` **步骤 6 — 使用 `full_discount` 创建参与记录(无真实付款)** ``` POST /api/participations HTTP/1.1 Host: api.example.com Authorization: Bearer Content-Type: application/json { "poolId": "00000000-0000-0000-0000-0000000000AA", "predictedResults": [ ... ], "paymentMethod": "full_discount" } ``` ``` { "id": "00000000-0000-0000-0000-0000000000BB", "status": "CONFIRMED", "paymentMethod": "full_discount" } ``` **步骤 7 — 验证推荐账户的奖励累积** ``` GET /api/users/me HTTP/1.1 Host: api.example.com Authorization: Bearer ``` 观察到攻击者账户的 `discountAmount` 与 `profitsAmount` 持续增加。 ### 影响 **技术层面**:推荐计划经济完整性受损;用户显示的小组奖品池与真实资金支持脱节;内部增长指标失真。 **业务层面**:单个活跃攻击账户每月可造成约 **600 美元** 损失(在所测试的周频场景下),且随账户数量线性扩展。攻击者边际成本极低,客户端检测难度高。 ### 修复建议(协调式 — 单一修复无法关闭向量) 1. **从公共参与端点移除 `full_discount`**。限制仅内部角色使用。 2. **排除 `full_discount` 参与记录** 于推荐奖励与奖品池计算之外。 3. **从 `/api/otp/send` 与 `/api/auth/forgot-password` 响应中移除 `code` 字段**;OTP 仅通过带外渠道(邮件/SMS)传递。 4. **对 `/api/auth/register`、`/api/otp/send`、`/api/auth/forgot-password` 实现速率限制**(例如 5 次/分钟/IP),并采用渐进式阻断。 5. **设计推荐计划反欺诈模型**: - 按 IP、设备指纹、电话、注册模式关联账户 - 将“注册推荐人”与“奖励资格推荐人”分离(后者需经真实付款验证) - 在发放货币奖励前要求政府 ID 验证 6. **业务逻辑监控**:对异常推荐网络增长、重复使用 `full_discount`、注册→参与快速序列告警。 --- ## 6. 攻击路径 识别出五条操作攻击路径,每条均将独立发现串联为连贯影响向量。 ### 🔴 路径 1 — 推荐计划货币化(旗舰) 参见 [第 5 节](#5-旗舰发现---推荐农场--完整折扣绕过) ### 🔴 路径 2 — 持久化账户接管 攻击者控制合法账户后,**即使受害者更改密码仍可保持访问**。 ``` [F-001] Password-recovery OTP leaked in HTTP response │ ▼ [F-003] Recovery token accepted more than once (replay) │ ▼ [F-006] Access tokens issued before the password change remain valid │ ▼ [F-023] Refresh tokens issued before the password change remain valid RESULT: Persistent access to the compromised account even after the victim temporarily regains control via password reset. ``` ### 🟠 路径 3 — 竞争情报重建(多点 BOLA 链) 在不破坏任何账户的前提下,重建任意用户的完整历史竞技档案。 ``` [F-007] User enumeration (email / national ID / phone) │ → userId ▼ [BP-AC-01] GET /api/statistics/by-user/{id} │ → lastParticipation.id ▼ [F-012] GET /api/standings/historical?groupId= │ → lastParticipation.id per ranked user ▼ [F-032] GET /api/standings/by-pool/{poolId}?groupId= │ ▼ [F-011] GET /api/winners/by-pool/{poolId}?groupId= │ → participation.id + prize amounts ▼ [F-005] GET /api/participations/{id} │ → predictedResults on finalized pools ▼ [F-016] GET /metrics (real IDs accelerate reconnaissance) RESULT: Full competitive profile of an arbitrary user rebuilt with zero account compromise and low detectability. ``` ### 🟠 路径 4 — 直接金融数据暴露 ``` [F-016] Unauthenticated /metrics leaks real transactionId / userId │ ▼ [F-017] GET /api/transactions/{id} - Ownership oracle via differential error messages - Sensitive financial data (amounts, method, metadata) - metadata.token (external payment-provider integration token) RESULT: Third-party financial data + payment-integration tokens. ~75% of transactionIds scraped from /metrics were queryable in the observed sample. ``` ### 🟡 路径 5 — 跨社群数据泄露 ``` [F-011] winners/by-pool?groupId= [F-012] standings/historical?groupId= [F-032] standings/by-pool?groupId= RESULT: Rankings, prizes and competitive dynamics of private groups visible to non-members — eroding the privacy value prop of the community model. ``` --- ## 7. 精选技术发现 ### 🔴 F-001 — 密码恢复响应中泄露 OTP **CVSS 9.1** — `AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N` · API2:2023 密码恢复端点在响应体中**明文返回 OTP**,消除了带外验证渠道。攻击者仅凭已知邮箱即可在单次 HTTP 请求中接管账户。 ``` POST /api/auth/forgot-password HTTP/1.1 Host: api.example.com Content-Type: application/json { "email": "victim@example.com" } ``` ``` { "status": "ok", "code": "000000", "expiresAt": "2026-01-01T00:00:00Z" } ``` **根本原因**:OTP 生成与交付至客户端耦合在同一个 API 响应中,而非仅通过受信外部通道发送。 **修复**:移除 `code` 字段。OTP 仅通过注册邮箱/SMS 传递。API 响应应为通用确认。 --- ### 🔴 F-003 — 恢复令牌重放 **CVSS 8.1** — `AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N` · API2:2023 密码重置**令牌在使用后未被失效**。同一令牌可重复使用直至基于时间的过期。结合 F-001,攻击者在受害者临时恢复账户后可再次锁定。 **修复**:首次使用后标记令牌为已消费。发放新令牌时使旧令牌失效。记录重用尝试作为事件信号。 --- ### 🔴 F-005 — 参与记录的水平访问控制(BOLA) **CVSS 7.5** · API1:2023 `GET /api/participations/{id}` 允许任何认证用户读取其他用户的参与记录。对已结束池,返回完整对象(含 `predictedResults`、`paymentMethod` 等);对活跃池的部分限制是池生命周期副作用,而非授权检查。 ``` GET /api/participations/00000000-0000-0000-0000-000000000BBB HTTP/1.1 Host: api.example.com Authorization: Bearer ``` **根本原因**:授权依赖于池状态(`isFinished`),而非资源所有权。缺少 `assertOwnership(userId, participationId)`。 **修复**:在读取前验证 `participation.userId == authenticatedUser.id`。 --- ### 🔴 F-011 — 优胜者列表的 BOLA **CVSS 7.7** · API1:2023 `GET /api/winners/by-pool/{poolId}?groupId=<任意>` 接受任意 `groupId` 而不验证认证用户是否为其成员。响应暴露完整优胜者列表——包含 `userId`、显示名、头像、`prizeAmount`,以及关键字段 `participation.id`,可直接跳转到 F-005。 **修复**:服务端验证组成员资格。从响应中移除 `participation.id`。 --- ### 🔴 F-015 — 多端点利用链 **CVSS 8.5** — 跨 API1 + API2 + API3 + API8 的横向组合。并非单个端点漏洞,而是**BOLA、枚举与元数据泄露的组合**,使攻击者仅凭一个有效令牌即可重建任意用户的完整竞技历史。 > 说明:将此作为独立发现记录的原因在于:单独修复任一端点不足以阻断该链。需实施跨对象所有权/成员关系策略。 --- ### 🔴 F-017 — 金融数据暴露 + 所有权 oracle **CVSS 8.5** · API1:2023 + API3:2023 `GET /api/transactions/{id}` 存在两个并发问题: 1. **通过差异化错误消息实现的权限 oracle**:响应体因记录是否存在、是否属于当前令牌而不同。攻击者可在不直接访问的情况下判定存在性与所有权。 2. **有效 ID 时返回完整金融数据**:含金额、支付方式、订单元数据,以及 `metadata.token`(外部支付提供方集成令牌)。 结合 F-016(未认证 `/metrics` 泄露真实 `transactionId`),约 75% 的抓取事务 ID 可被成功查询。 **修复**:统一所有错误响应为通用“资源未找到”。强制执行严格所有权验证。移除 `metadata.token` 及内部订单数据。 --- ### 🔴 F-019 — 公共滥用内部支付方法 `full_discount` **CVSS 8.5** · API5:2023 + API6:2023 `POST /api/participations` 接受来自任意认证用户的 `paymentMethod: "full_discount"`——**无角色校验、无折扣码、无文档验证**。由此创建的参与记录: 1. 被视为有效付费参与 2. 计入奖品池 3. 触发创建者的推荐奖励累积 这是**支付绕过原语**,构成 F-036 的基础。 **修复**:将 `full_discount` 限制为内部角色。启用时要求有效 `discountCode`。将其排除在奖品池贡献与推荐奖励之外。在创建参与前对未验证账户强制执行 KYC。 --- ### 🟠 F-006 与 F-023 — 密码更改后会话仍有效 **CVSS 8.1** · API2:2023 访问令牌(F-006)与刷新令牌(F-023)在密码更改后**仍保持有效**。JWT 架构缺少吊销机制——无 `tokenVersion`、无 `jti` 跟踪、无活跃会话表。 **操作后果**:密码更改不是有效的响应控制。若令牌已被捕获,攻击者可无限期保持访问(仅受自然过期限制)。 **修复**:为每个用户引入 `tokenVersion`(密码更改时递增),或使用活跃会话表,或基于 `jti` 的吊销机制。密码更改时使所有刷新令牌失效。实现刷新令牌轮换与重用检测。 --- ### 🟠 F-016 — 未认证的 Prometheus `/metrics` 暴露 **CVSS 7.5** · API8:2023 返回标准 Prometheus 输出,包含: - 真实 `transactionId` 与 `userId` 作为标签值 - 未参数化的 API 路径(如 `/api/transactions/`) - Node.js 运行时版本 - 操作流量模式 这是**侦察加速器**,使 F-017 在规模上可行。 **修复**:认证 `/metrics` 并限制仅内部 IP。参数化指标中间件路径,避免记录真实标识符。对所有标签值进行审计。 --- ### 🟠 F-007 — 多向量用户枚举 **CVSS 7.5** · API3:2023 四个端点支持按不同标识符(邮箱、电话、身份证、邀请码)查询用户,**存在性判断与元数据泄露**均通过差异化响应体现。缺少速率限制(F-004)加剧风险。 身份证查询端点具有额外监管意义:标识符属于当地数据保护法下的受保护个人数据。 **修复**:存在性检查返回统一响应。剥离公共响应中的元数据。应用跨端点速率限制。评估禁用身份证查询或限制为管理员角色。 --- ### 🟠 BP-AC-01、F-012、F-032 — 统计与排位的 BOLA 三者共享同一反模式:端点接受 `userId`/`groupId` 参数却**未验证请求者与资源的关系**。每个均为高严重性 BOLA,但其真实价值在于作为 F-015 链中的**枢纽点**——暴露 `lastParticipation.id` 或 `participation.id`,进而跳转到 F-005。 **修复**:对相关资源家族实施统一的跨对象成员关系策略。 --- ## 8. 端到端攻击叙事 真实攻击者在 QA 条件下执行以下流程: **阶段 0 — 被动侦察** `GET /api-docs`(F-008)获取完整 OpenAPI 规范。`GET /metrics`(F-016)获取真实 `transactionId`、`userId` 及未参数化路径。 **阶段 1 — 用户枚举** 利用四个用户查找端点(F-007)构建目标用户目录及元数据。 **阶段 2 — 账户接管** F-01 泄露恢复 OTP。F-003 使恢复令牌可重放。F-004 无速率限制使自动化成为可能。 **阶段 3 — 持久化** F-006(访问令牌)与 F-023(刷新令牌)在密码更改后仍有效。攻击者保持粘性。 **阶段 4 — 竞争情报** 执行 F-015 链,获取任意用户完整竞技档案。无需账户妥协。 **阶段 5 — 金融暴露** 将 F-016 中获取的 `transactionId` 代入 `GET /api/transactions/{id}`(F-017),枚举第三方金融数据与 `metadata.token`。 **阶段 6 — 支付绕过** `full_discount`(F-019)使攻击者创建无需付款的参与记录。 **阶段 7 — 货币化** 执行完整推荐链(F-036): ``` register (referred, invitationCode=ATTACKER123) → otp/send (code leaks in response) → otp/verification (using leaked code) → login (referred account) → participation (paymentMethod: full_discount) → observe referral rewards accrue on primary account ``` 在 N 个自动化账户上以周频循环执行。 **操作特性**:接近零边际成本、线性可扩展、客户端无法察觉。 --- ## 9. 影响分析 ### 财务 | 向量 | 预估影响 | |---|---| | **F-036**(旗舰) | 每个活跃攻击账户约 **600 美元/月**,随账户数量线性扩展 | | **F-019** 单独 | 取决于池规模与攻击账户数 | | **F-006 + F-023** | 与 ATO 事件数量成正比(无有效遏制) | | **F-017** | 取决于监管暴露与品牌声誉 | ### 声誉 F-036、F-001/F-002 或 F-017 的公开披露将对平台及其外部支付合作伙伴造成重大声誉影响。 ### 社区模型信任 F-015 链允许任意用户重建其他用户的完整竞技历史。若公开化,将侵蚀私密群组功能的隐私价值主张。 ### 事件响应能力 F-006 与 F-023 意味着**密码更改无法作为响应控制**。在真实 ATO 事件中,安全团队无法通过标准流程驱逐攻击者。此能力缺口会放大未来所有事件的影响。 ### 合规性 以下组合构成合规暴露: - 公共身份证查询端点(F-007) - 金融数据暴露(F-017) - 支付集成令牌出现在响应体(F-017) 在部署至生产环境前,需由法务/合规部门进行专门审查。 --- ## 10. OWASP API Top 10 (2023) 映射 | 类别 | 发现 | 占比 | |---|---|---| | **API1** — 破坏对象级别授权 | F-005、F-011、BP-AC-01、F-012、F-017、F-028、F-032 | 28% | | **API2** — 破坏认证 | F-001、F-002、F-003、F-006、F-023 | 20% | | **API3** — 破坏对象属性级别授权 | F-007 | 4% | | **API4** — 无限制资源消耗 | F-004 | 4% | | **API5** — 破坏函数级别授权 | F-019 | 4% | | **API6** — 无限制访问敏感业务流 | F-034、F-036 | 8% | | **API8** — 安全配置错误 | F-008、F-009、F-010、F-013、F-014、F-015、F-016、F-018 | 32% | **架构诊断**:API1 + API2 + API8 占比 80%,表明平台未将授权设计为跨层策略,且可观察性表面未与功能表面同步加固。逐端点修补无法解决此类问题,需架构级干预。 --- ## 11. 修复路线图 ### 🔴 紧急 — 0–7 天(快速遏制) 在向更高环境推广前必须实施: | # | 行动 | 覆盖发现 | |---|---|---| | 1 | 禁用 `full_discount` 于公共 `POST /api/participations`(功能开关/方法白名单) | F-036、F-019 | | 2 | 排除 `full_discount` 参与记录于推荐奖励与奖品池计算 | F-036、F-019 | | 3 | 从 OTP 响应中移除 `code` 字段 | F-001、F-002 | | 4 | 对 `/api/auth/register`、`/api/otp/send`、`/api/auth/forgot-password` 实现速率限制(5 次/分钟/IP) | F-004、F-034 | | 5 | 恢复令牌使用后失效 | F-003 | | 6 | 密码更改时使所有刷新令牌失效 | F-023 | | 7 | 认证 `/metrics` 并限制仅内部 IP | F-016 | | 8 | 保护或禁用 `/api-docs` | F-008 | | 9 | 从公共错误响应中移除余额、金额、令牌等字段 | F-009 | | 10 | 在 `winners/by-pool` 与 `standings/by-pool` 中验证组成员资格;移除 `participation.id` | F-011、F-032 | | 11 | 从优胜者与统计端点移除 `participation.id` 与 `lastParticipation.id` | F-015、BP-AC-01 | | 12 | 规范化 `GET /api/transactions/{id}` 错误消息 | F-017 | | 13 | 禁用或加门身份证查询端点 | F-007 | ### 🟠 高 — 7–30 天(架构重构) - 推荐计划反欺诈架构(关联账户、检测多账号、付款前奖励资格验证) - 角色限定访问内部支付方法 - 未验证账户 KYC 强制执行 - OTP 流程重构:生成内部、仅外部交付 - 令牌吊销机制(`tokenVersion` / 活跃会话表 / `jti` 跟踪) - 所有权验证覆盖所有资源 - 统一用户搜索响应 + 跨端点速率限制 - 标准化错误消息 - 禁用身份证查询或管理员限定 - 事务数据最小化 - 外部钱包链接的双因素验证 - 多端点序列日志与告警 ### 🟡 中 — 30–90 天(可持续成熟) - 健壮的会话架构(短生命周期刷新令牌、轮换与重用检测) - 跨端点统一错误处理与 ID 脱敏 - 严格输入验证 - 路由级 `Access-Control-Allow-Methods` 配置 - 业务逻辑监控:异常推荐网络增长、重复 `full_discount` 使用、注册→参与突发模式 - 全局异常处理器与 ID 脱敏 - **跨对象授权策略**:`assertOwnership()` 与 `assertGroupMembership()` 作为一级原语 - 财务对账看板:用户看到的奖品池 vs 真实资金支持 - 漏洞管理计划:安全设计、CI/CD 安全测试、定期攻防评估 --- ## 12. 检测缺口分析 本次评估最重要的发现**并非单一漏洞,而是缺乏检测能力**。高影响向量(F-036、F-019、F-034、F-015)均通过请求序列实现,单独看与合法行为无异。检测需**跨端点关联**,而这在评估中并不存在。 ### 缺失的检测模式 | 模式 | 指示 | |---|---| | `register → otp/send → otp/verification → participation(full_discount)` 且 `invitationCode` 重复 | F-036 进行中 | | `statistics → standings → winners → participations` 序列在令牌下短时发生 | F-015 进行中 | | 高错误率访问 `/api/transactions/{id}`(所有权校验失败) | F-017 滥用 | | `/api/auth/refresh` 使用密码更改前的令牌 | F-023 滥用 | | `/metrics` 来自未授权 IP | F-017 前期侦察 | **操作影响**:若上述向量正在被利用,安全团队将无法在可接受时间窗口内识别。这会放大财务、声誉与合规影响——也意味着代码修复若无对应检测能力,无法被验证。 **检测必须与修复同步交付**。 --- ## 13. 经验总结 ### 关于业务逻辑测试 本次评估中最高影响的发现并非传统注入或认证绕过,而是**五个中等问题的逻辑组合**形成可货币化链条。自动化扫描器无法标记其为关键。这再次印证: > **业务逻辑层是黑盒测试回报最高的地方**,因为它最难通过代码审查推理,且对工具不可见。 ### 关于架构性 vs 端点级发现 七个 BOLA 与五个认证缺陷本质上是**两个架构缺失**的表现: - 无跨对象所有权策略 - 无凭证吊销机制 将发现以该框架呈现,使对话从“修补这些端点”转向“重构这些层”,从而获得更优修复效果。 ### 关于积极控制 记录客户已具备的九项积极控制(JWT 签名验证、OTP 速率限制、参与所有权检查等)同样重要,因为它: - 给予工程团队准确认可 - 使修复讨论可操作 - 展示“同一团队既构建强加密也遗漏 OTP 在响应中”的过程差距 ### 关于明确记录已排除假设 七个被验证并排除的假设确保评估被视作全面而非选择性,也能在修复会议中回答“但你是否试过 X?”。 ### 关于 CVSS 与业务影响 旗舰发现 CVSS 为 8.7,但实际业务影响更大——因为 CVSS 未建模货币化、可扩展性与可检测性。我会在报告中附加 **“CVSS vs 业务影响”** 说明,避免数字低估严重性。 ### 关于可观察性即攻击面 `/metrics` 作为运维端点,在本评估中却是最有用的侦察工具。一旦可访问,API 即成为攻击面。可观察性基础设施需要与功能面同等级别的授权纪律。 --- ## 14. 工具与技术栈 | 用途 | 工具 | |---|---| | Android APK 静态分析 | JADX | | HTTP 拦截与请求操作 | Burp Suite Professional | | 移动端动态调试 | Frida | | 请求重放 / PoC 验证 | Postman、curl | | 模式验证自动化 | Python(自定义脚本) | | 参考框架 | OWASP API Top 10 (2023)、MASVS、WSTG v4.2、PTES | --- ## 📎 脱敏说明 - 客户名称、产品名称、域名替换为通用占位符(`api.example.com`) - 所有 UUID 替换为 `00000000-...` 格式占位符 - 邮箱、电话、身份证、真实 OTP 替换为 `@example.com` 哑数据或 `000000` - 真实令牌替换为截断的 `eyJhbGciOi...TRUNCATED` 占位符 - 金额转换为近似美元以消除地理位置信号 - 司法辖区特定的合规引用泛化 - 发现 ID 重新编号为通用 `F-xxx`,原始内部标识已移除 - 作者身份有意不披露;若需进一步合作请直接联系 **许可声明**:本案例研究仅限作品集与教育用途。未经授权的复制不受鼓励。
标签:API安全, Fantasy Pools, JSON输出, OTP漏洞, OWASP API Top 10, REST API, TGT, 业务逻辑漏洞, 付费预测, 会话管理, 反取证, 奖励滥用, 安全评估, 平台安全, 折扣绕过, 攻防演练, 枚举攻击, 案例研究, 移动后端, 身份认证漏洞, 逆向工具, 金融流程漏洞