第 6 章 · 06 业务逻辑与竞争条件


文档摘要

第 6 章 · 06 业务逻辑与竞争条件 本节摘要:业务逻辑漏洞利用预期功能违反领域不变量——不付钱就拿货、突破限额、保留特权、绕过审批;竞争条件则让并发请求绕过原子性检查——重复消费、重复退款、突破单次限制。两者紧密交织:许多业务逻辑漏洞只在并发或重放下才暴露(双花、超额退款、限额切片),因此本节合并讲解。业务逻辑不靠 payload,靠的是「对业务建模」——先画出状态机与不变量(价值守恒、唯一性、单调性、互斥性),再用「跳步/重放/乱序/并发/时间窗/数值边界」去逼出每一条缺失的服务端守卫。

第 6 章 · 06 业务逻辑与竞争条件

本节摘要:业务逻辑漏洞利用预期功能违反领域不变量——不付钱就拿货、突破限额、保留特权、绕过审批;竞争条件则让并发请求绕过原子性检查——重复消费、重复退款、突破单次限制。两者紧密交织:许多业务逻辑漏洞只在并发或重放下才暴露(双花、超额退款、限额切片),因此本节合并讲解。业务逻辑不靠 payload,靠的是「对业务建模」——先画出状态机与不变量(价值守恒、唯一性、单调性、互斥性),再用「跳步/重放/乱序/并发/时间窗/数值边界」去逼出每一条缺失的服务端守卫。竞争条件不靠复杂 payload,靠的是「把每一次读-改-写与多步工作流都当作对抗性并发」——HTTP/2 多路复用、last-byte 同步、连接预热,把 N 个本该只成功 1 个的请求挤进同一个窗口。本节讲透攻击面(金融逻辑、账户生命周期、配额限额、事件驱动流)、关键漏洞(状态机滥用、并发与幂等、数值与货币、限额与库存、退款与争议、特性门槛)、竞争窗口识别与利用(请求同步、幂等绕过、原子性缺口、跨服务竞态、速率限制与配额、乐观并发规避、DB 隔离、分布式锁),以及业务逻辑+竞争+IDOR+CSRF 的链式放大。

内容来源:原项目知识包 strix/skills/vulnerabilities/{business_logic,race_conditions}.md,汉化并套用体系化模板合并。

⚠️ 仅限授权测试:本节所有 payload 与技术仅用于你自己的应用或有书面授权的渗透测试。未经授权对他人系统使用这些技术是非法的。

学习目标

阅读完本节,你应当能够:

  1. 理解业务逻辑与竞争条件的交织关系:许多逻辑漏洞只在并发/重放下暴露。
  2. 为关键工作流建模状态机与不变量(价值守恒、唯一性、单调性、互斥性)。
  3. 复现业务逻辑关键漏洞:状态机滥用(跳步/重放/乱序)、数值与货币、限额与库存、退款与争议、特性门槛与角色。
  4. 识别并利用竞争窗口:读-改-写、多步工作流、幂等键、跨服务 eventual consistency。
  5. 掌握请求同步技术:HTTP/2 多路复用、last-byte 同步、连接预热。
  6. 用验证步骤确认漏洞、排除误报(区分持久状态变更与 UI 闪现)。
  7. 评估两类漏洞的影响等级并完成链式攻击(逻辑+竞争、逻辑+IDOR、竞争+CSRF)。

一、攻击面

业务逻辑与竞争条件共享同一组「易感工作流」,区别在于是单请求就能触发(纯逻辑),还是需要并发/重放才触发(竞争)。

易感业务面:

  • 金融逻辑:定价、折扣、支付、退款、信用、争议(chargeback)。
  • 账户生命周期:注册、升降级、试用、停用、删除。
  • 按逻辑授权:特性门槛、角色转换、审批工作流。
  • 配额/限额:速率/用量限制、库存、权益、席位授权。
  • 多租户隔离:跨组织数据或动作渗漏。
  • 事件驱动流:job、webhook、saga、补偿、幂等。

高价值目标:

  • 定价/购物车(价格锁、报价转订单、税/运费计算)、折扣引擎(叠加、互斥、范围、每用户一次)。
  • 支付(auth/capture/void/refund 序列、部分、拆分、争议、幂等键)、信用/礼品卡/代金券(发行、兑换、撤销、过期、可转让性)。
  • 订阅(按比例计费 proration、升降级、试用延长、席位数、计量上报)、退款/退货/RMA(多项部分、 restocking、退货窗口边界)。
  • 管理员/员工操作(模拟、手工调整、发信用/退款、账户标志)、配额/限额(日/月用量、库存预留、特性计数器)。

竞争条件专属攻击面:

  • 读-改-写:无原子性或加锁的序列。
  • 多步操作:check → reserve → commit,阶段间有间隙。
  • 跨服务工作流:saga、最终一致性的异步 job。
  • 速率限制与配额:仅在边缘实现。

💡 核心心法:业务逻辑安全 = 在对抗性的排序、时序、输入下强制领域不变量;并发安全 = 每一条会改状态的路都要有原子性、正确隔离、幂等。任一步骤信任客户端或先前步骤,就预期被滥用。

二、检测通道(侦察)

2.1 业务逻辑侦察

工作流映射:从 UI 与代理/网络日志推导端点;映射隐藏/未文档化 API,尤其 finalize/confirm;识别 token/标志(stepToken/paymentIntentId/orderStatus/reviewState/approvalId),测跨用户/会话复用;记录不变量(价值守恒=账本余额、唯一性=幂等、单调性=非递减计数器、互斥性=单一活跃订阅)。

输入面:隐藏字段与客户端计算的总数(服务器必须基于可信源重算);替代编码与形态(数组 vs 标量、意外键的对象、null/空/0/负、科学计数法);业务选择器(货币、locale、时区、税区——触发取整与规则集变化)。

状态与时间轴:重放(重提交陈旧的 finalize/confirm);乱序(finalize 先于 verify、refund 先于 capture、cancel 在 ship 之后);时间窗(月末/日终切换、夏令时、宽限期、试用过期边界)。

2.2 竞争窗口识别

  • 显式序列:「查余额再扣」「校验优惠券再应用」「查库存再购买」。
  • 留意乐观并发标记:ETag/If-Match、version 字段、updatedAt 校验。
  • 审查幂等键支持:作用域(路径 vs 主体)、TTL、持久化(缓存 vs DB)。
  • 映射跨服务步骤:状态何时写入 vs 何时发布,有何重试/补偿。

信号:串行请求失败但并行成功;重复行、负计数器、超额发行、聚合不一致;同时 vs 串行请求的响应形态/时延不同;审计日志乱序;同一意图多个 2xx;缺失或重复的 correlation ID。

三、利用方法与技术

3.1 业务逻辑关键漏洞

状态机滥用:经直接 API 跳步或乱序;验证服务器在每个转换上强制前置条件;用改过的参数重放前序步骤(如审批后、capture 前换价格);把单个受限动作拆成多个阈值以下的子动作(限额切片)。

数值与货币:浮点 vs decimal 取整;边界上有利于攻击者的取整/截断;跨币套利(A 币买入、B 币按陈旧汇率退款);逐项 vs 逐单税额取整;负金额、零价、免运费阈值、最小/最大护栏。

配额、限额与库存:off-by-one 与基于时间的重置(UTC vs 本地);在 T-1s 预热、T+1s 触发;预留/持有泄露(预留多个、完成一个、释放未强制);缺强一致性的分布式计数器导致双消费。

退款与争议:双重退款(UI + 支持工具;部分退款之和超过 captured 金额);消费后退款(已下载数字商品、已发货)因缺消费后检查。

特性门槛与角色:客户端或边缘强制的特性开关,核心服务没有——猜测开关名或回退到默认启用;角色转换留下陈旧能力(降级后保留 premium;降职后保留 admin 端点)。

事件驱动 saga:saga/补偿间隙——触发补偿却无原始成功,或执行两次成功却无补偿;Outbox/Inbox 缺幂等 → 重复下游副作用;cron/backfill 在请求时授权之外运作,广泛改状态。

微服务边界:跨服务假设不匹配——一个服务校验总额,另一个信任 line item,在调用间改动;头部信任(内部服务信任 X-Role/X-User-Id);部分失败窗口——两阶段动作中阶段 1 提交、阶段 2 未执行,留下可利用的中间态。

多租户隔离:租户作用域的计数器与信用在 where 子句中不带租户键 → 跨组织渗漏;管理聚合视图因缺逐租户强制,允许影响他租户的动作。

3.2 竞争条件关键漏洞

请求同步:

  • HTTP/2 多路复用实现紧凑并发;在预热连接上发多个请求。
  • last-byte 同步:让请求保持打开,同时释放最后一字节。
  • 连接预热:预先建立 session、cookie、TLS 去除抖动。

幂等与去重绕过:

  • 跨不同主体/路径复用同一幂等键(若作用域不足)。
  • 在幂等存储写入前打端点(缓存先于提交的窗口)。
  • 应用层去重只丢响应,副作用(邮件/信用)仍发生。

原子性缺口:

  • 丢失更新:读-改-写自增却无原子 DB 语句。
  • 部分两阶段工作流:成功在校验完成前提交。
  • 唯一性检查在唯一索引/upsert 之外做:负载下创建重复。

跨服务竞态:saga/补偿时序间隙;eventual consistency 窗口(在服务 A 写入可见前于服务 B 行动);at-least-once 投递却无幂等消费者 → 重试风暴重复副作用。

速率限制与配额:按 IP 或按连接强制 → 多 IP/会话绕过;计数器更新非原子或分片不一致 → 在传播前发突发。

乐观并发规避:省略可选的 If-Match/ETag;若服务器忽略则提供陈旧 version;version 字段被接受却未在所有路径校验(GraphQL vs REST)。

数据库隔离:利用 READ COMMITTED/REPEATABLE READ 异常(幻读、非可串行化);upsert 竞态——用带 ON CONFLICT/UPSERT 的唯一索引,或利用朴素存在性检查;锁粒度问题(行 vs 表;仅进程内持有的应用锁)。

分布式锁:无 NX/EX 或 fencing token 的 Redis 锁允许多个赢家;单节点内存锁 → 打其他节点/区域绕过。

特殊上下文:GraphQL(并行 mutation 与批量操作可能绕过逐 mutation 守卫;持久化查询与 aliases 在单请求藏多个状态变更);WebSocket(逐消息授权与幂等必须成立;并发 emit 在仅握手校验时创建重复);文件与存储(多分片上传的并行 finalize/complete;并发复用预签名 URL);认证流(并发消费一次性 token——重置码、magic link——铸造多个 session;验证 consume 是否原子)。

四、绕过技巧

4.1 业务逻辑绕过

  • content-type 切换(JSON/form/multipart)命中不同代码路径。
  • 方法替换(GET 执行状态变更;X-HTTP-Method-Override)。
  • 客户端重算:总数、税、折扣在客户端计算并被服务器接受。
  • 缓存/网关差异:CDN/APIM 的陈旧决策不感知身份。

4.2 竞争条件绕过

  • 跨 IP、会话、用户账户分散请求以规避按实体限流。
  • 切换触发同一状态变更却经不同代码路径的方法/content-type/端点。
  • 故意触发超时引发重试,造成重复副作用。
  • 拖垮目标(大 payload、慢端点)以加宽竞态窗口

💡 绕过的本质:业务逻辑——校验常在某一条代码路径(content-type/方法/通道)上缺失,换一条即绕;竞争——限流按错误维度(IP/连接/请求)计,且竞态窗口常因后端依赖变慢而加宽,主动制造延迟是核心手段。

五、验证与误报排除

5.1 业务逻辑验证

  1. 展示一个不变量违反(一单两次退款、负库存、超额)。
  2. 提供同一主体下「预期流程 vs 滥用流程」的并排证据。
  3. 演示持久性:非预期状态持续且在权威来源(账本、邮件、管理视图)可观测。
  4. 量化每次与规模化的影响(单位损失 × 可行重复次数)。

5.2 竞争条件验证

  1. 单请求被拒;N 个并发请求在本该只成功 1 个时全部成功。
  2. 持久状态变更证据(账本条目、库存计数、角色/标志变更)。
  3. 在受控同步(HTTP/2、last-byte 同步)下跨多次运行可复现。
  4. 跨通道证据(如 REST 与 GraphQL)。
  5. 包含前后状态与确切请求集。

常见误报:

  • 业务逻辑:策略明确允许的促销(文档化的免费试用、善意信用);仅视觉不一致、无持久或可利用状态变更;有正确审计与审批的仅管理员操作。
  • 竞争条件:真正幂等且强制 ETag/version 或唯一约束的操作;可串行化事务或正确的咨询锁/队列;仅视觉故障无持久状态变更;用原子计数器拒绝超额的速率限制。

六、影响评估

  • 直接金融损失:欺诈、套利、超额退款、未付费消费。
  • 监管/合同违规:计费准确性、消费者保护。
  • 经资源耗尽拒绝合法用户的库存/服务
  • 特权保留或非授权访问 premium 功能(经角色转换残留能力)。
  • 数据完整性损坏与审计轨迹不一致(经并发更新)。

⚠️ 业务逻辑与竞争的影响常被低估——它们不触发扫描器,却能直接造成资金损失与监管违规。始终用「持久状态变更 + 权威来源证据」量化影响,而非停留在「看起来不对」。

本节要点回顾

  1. 核心心法:业务逻辑 = 对抗性排序/时序/输入下强制领域不变量;竞争 = 每条改状态的路都要原子性+隔离+幂等;二者交织——许多逻辑漏洞只在并发/重放下暴露。
  2. 建模先行:为每个关键工作流画状态机与不变量(价值守恒、唯一性、单调性、互斥性);从 UI/代理日志推导隐藏端点,尤其 finalize/confirm。
  3. 业务逻辑关键漏洞:状态机滥用(跳步/重放/乱序/限额切片)、数值与货币(浮点/跨币套利/负金额)、配额与库存(off-by-one/预留泄露)、退款与争议(双重退款/消费后退款)、特性门槛与角色残留、saga 补偿间隙、微服务假设不匹配。
  4. 竞争窗口识别:显式序列(查→扣)、乐观并发标记(ETag/version)、幂等键作用域、跨服务 eventual consistency;信号=串行失败并行成功、重复行/负计数器/审计乱序。
  5. 请求同步:HTTP/2 多路复用、last-byte 同步、连接预热;从小规模(N=5–20)起步再放大。
  6. 绕过本质:业务逻辑——校验在某条 content-type/方法/通道缺失;竞争——限流按错误维度计 + 后端变慢加宽窗口(主动制造延迟)。
  7. 验证:业务逻辑——不变量违反 + 持久状态 + 权威来源证据 + 量化影响;竞争——单请求被拒 N 个并发成功 + 持久变更 + 受控同步可复现 + 跨通道。
  8. 影响与链式:直接金融损失、监管违规、资源耗尽、特权残留、数据完整性损坏;逻辑+竞争、逻辑+IDOR、逻辑+CSRF、竞争+CSRF、竞争+缓存放大影响。

下一节,我们看客户端与其它——开放重定向、原型污染、信息泄露、子域接管、不安全文件上传、LLM 提示注入,把本章的剩余高价值漏洞一次性收束。


发布者: 作者: 灏天文库 转发
评论区 (0)
U