渗透测试 | 利用条件竞争突破优惠券仅能使用一次的逻辑限制
字数 1358 2025-08-10 13:48:25
利用条件竞争突破优惠券使用限制的渗透测试技术
一、条件竞争漏洞概述
条件竞争(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)和行级锁
- 在检查和应用优惠券的整个过程中保持锁定
BEGIN TRANSACTION;
SELECT * FROM coupons WHERE code = 'DISCOUNT20' FOR UPDATE;
-- 检查和使用逻辑
UPDATE coupons SET used = 1 WHERE code = 'DISCOUNT20';
COMMIT;
6.2 应用层面
- 实现乐观锁或悲观锁机制
- 使用原子操作更新优惠券状态
- 添加唯一约束防止重复使用
6.3 架构层面
- 引入分布式锁(如Redis锁)
- 使用消息队列序列化请求
- 实现幂等性设计
七、其他可能受影响的场景
- 多次兑换礼品卡
- 多次对产品进行评分
- 提取超过账户余额的现金
- 重复使用验证码
- 绕过暴力破解防护机制
八、防御最佳实践
- 最小化检查和使用之间的时间窗口
- 对关键操作实施适当的锁定机制
- 进行并发测试和安全审计
- 实现请求去重和幂等性处理
- 监控异常使用模式(如短时间内多次使用优惠券)