渗透测试 | 利用条件竞争突破优惠券仅能使用一次的逻辑限制
字数 1358 2025-08-10 13:48:25

利用条件竞争突破优惠券使用限制的渗透测试技术

一、条件竞争漏洞概述

条件竞争(Race Condition)是一种在多线程或并发环境下可能出现的安全漏洞,当系统对共享资源的访问顺序敏感时,如果缺乏适当的同步机制,就会导致非预期的行为。

1.1 TOCTOU缺陷

条件竞争属于"检查时间到使用时间"(Time Of Check To Time Of Use, TOCTOU)缺陷的子类型,指系统在检查某个条件(如优惠券是否已使用)和实际使用该条件之间存在时间差,攻击者可利用这个时间窗口进行恶意操作。

二、优惠券系统的典型逻辑流程

典型的优惠券使用逻辑包含以下步骤:

  1. 检查用户是否尚未使用此优惠码
  2. 将折扣应用于订单总额
  3. 更新数据库记录标记优惠码为已使用

三、漏洞利用原理

当用户尝试在极短时间内(几乎同时)多次提交使用同一优惠券的请求时:

  1. 第一个请求开始处理,检查优惠券状态(未使用)
  2. 在第一个请求完成数据库更新前,第二个请求也开始处理并检查优惠券状态(仍显示未使用)
  3. 两个请求都通过了初始检查,导致优惠券被多次使用

四、实验环境分析

4.1 实验目标

  • 目标:购买价值$1337的L33t轻型皮夹克
  • 初始资金:$50
  • 登录凭证:wiener:peter

4.2 关键功能点

  1. POST /cart - 添加商品到购物车
  2. POST /cart/coupon - 应用折扣券
  3. GET /cart - 查看购物车内容

4.3 业务逻辑限制

  • 优惠券只能使用一次(-20%折扣)
  • 第二次尝试使用同一优惠券会被阻止

五、渗透测试步骤详解

5.1 初始侦察

  1. 登录系统(wiener:peter)
  2. 检查账户余额($50)
  3. 尝试添加商品和优惠券,观察系统行为

5.2 功能测试

  1. 多次尝试应用同一优惠券:

    • 第一次:成功应用-20%折扣
    • 后续尝试:失败,提示"折扣已被使用"
  2. 检查会话机制:

    • 修改cookie后发现购物车内容变化
    • 确认购物车状态通过session cookie维护

5.3 条件竞争攻击实施

5.3.1 初步尝试

  • 顺序发送多个应用优惠券的请求:
    • 只有第一个请求成功
    • 证明系统有基本防护

5.3.2 并发攻击

  1. 使用工具(如Burp Suite的Turbo Intruder)发送并发请求
  2. 配置100个线程同时发送应用优惠券的请求
  3. 观察结果:
    • 多个请求成功绕过单次使用限制
    • 优惠券被多次应用

5.3.3 完成攻击

  1. 将目标商品(L33t轻型皮夹克)加入购物车
  2. 重复并发应用优惠券的操作
  3. 成功以\(50购买价值\)1337的商品

六、漏洞修复方案

6.1 数据库层面

  1. 使用事务(Transaction)和行级锁
  2. 在检查和应用优惠券的整个过程中保持锁定
BEGIN TRANSACTION;
SELECT * FROM coupons WHERE code = 'DISCOUNT20' FOR UPDATE;
-- 检查和使用逻辑
UPDATE coupons SET used = 1 WHERE code = 'DISCOUNT20';
COMMIT;

6.2 应用层面

  1. 实现乐观锁或悲观锁机制
  2. 使用原子操作更新优惠券状态
  3. 添加唯一约束防止重复使用

6.3 架构层面

  1. 引入分布式锁(如Redis锁)
  2. 使用消息队列序列化请求
  3. 实现幂等性设计

七、其他可能受影响的场景

  1. 多次兑换礼品卡
  2. 多次对产品进行评分
  3. 提取超过账户余额的现金
  4. 重复使用验证码
  5. 绕过暴力破解防护机制

八、防御最佳实践

  1. 最小化检查和使用之间的时间窗口
  2. 对关键操作实施适当的锁定机制
  3. 进行并发测试和安全审计
  4. 实现请求去重和幂等性处理
  5. 监控异常使用模式(如短时间内多次使用优惠券)
利用条件竞争突破优惠券使用限制的渗透测试技术 一、条件竞争漏洞概述 条件竞争(Race Condition)是一种在多线程或并发环境下可能出现的安全漏洞,当系统对共享资源的访问顺序敏感时,如果缺乏适当的同步机制,就会导致非预期的行为。 1.1 TOCTOU缺陷 条件竞争属于"检查时间到使用时间"(Time Of Check To Time Of Use, TOCTOU)缺陷的子类型,指系统在检查某个条件(如优惠券是否已使用)和实际使用该条件之间存在时间差,攻击者可利用这个时间窗口进行恶意操作。 二、优惠券系统的典型逻辑流程 典型的优惠券使用逻辑包含以下步骤: 检查用户是否尚未使用此优惠码 将折扣应用于订单总额 更新数据库记录标记优惠码为已使用 三、漏洞利用原理 当用户尝试在极短时间内(几乎同时)多次提交使用同一优惠券的请求时: 第一个请求开始处理,检查优惠券状态(未使用) 在第一个请求完成数据库更新前,第二个请求也开始处理并检查优惠券状态(仍显示未使用) 两个请求都通过了初始检查,导致优惠券被多次使用 四、实验环境分析 4.1 实验目标 目标:购买价值$1337的L33t轻型皮夹克 初始资金:$50 登录凭证:wiener:peter 4.2 关键功能点 POST /cart - 添加商品到购物车 POST /cart/coupon - 应用折扣券 GET /cart - 查看购物车内容 4.3 业务逻辑限制 优惠券只能使用一次(-20%折扣) 第二次尝试使用同一优惠券会被阻止 五、渗透测试步骤详解 5.1 初始侦察 登录系统(wiener:peter) 检查账户余额($50) 尝试添加商品和优惠券,观察系统行为 5.2 功能测试 多次尝试应用同一优惠券: 第一次:成功应用-20%折扣 后续尝试:失败,提示"折扣已被使用" 检查会话机制: 修改cookie后发现购物车内容变化 确认购物车状态通过session cookie维护 5.3 条件竞争攻击实施 5.3.1 初步尝试 顺序发送多个应用优惠券的请求: 只有第一个请求成功 证明系统有基本防护 5.3.2 并发攻击 使用工具(如Burp Suite的Turbo Intruder)发送并发请求 配置100个线程同时发送应用优惠券的请求 观察结果: 多个请求成功绕过单次使用限制 优惠券被多次应用 5.3.3 完成攻击 将目标商品(L33t轻型皮夹克)加入购物车 重复并发应用优惠券的操作 成功以$50购买价值$1337的商品 六、漏洞修复方案 6.1 数据库层面 使用事务(Transaction)和行级锁 在检查和应用优惠券的整个过程中保持锁定 6.2 应用层面 实现乐观锁或悲观锁机制 使用原子操作更新优惠券状态 添加唯一约束防止重复使用 6.3 架构层面 引入分布式锁(如Redis锁) 使用消息队列序列化请求 实现幂等性设计 七、其他可能受影响的场景 多次兑换礼品卡 多次对产品进行评分 提取超过账户余额的现金 重复使用验证码 绕过暴力破解防护机制 八、防御最佳实践 最小化检查和使用之间的时间窗口 对关键操作实施适当的锁定机制 进行并发测试和安全审计 实现请求去重和幂等性处理 监控异常使用模式(如短时间内多次使用优惠券)