条件竞争的骚操作(一)
字数 1231 2025-08-23 18:31:24
条件竞争漏洞利用技术详解
一、条件竞争漏洞概述
条件竞争(Race Condition)是指当网站在没有足够保护措施的情况下同时处理多个请求时,服务器来不及处理多余的请求,导致多个不同的线程同时与相同的数据交互,从而产生"冲突"并导致应用程序出现意外行为。
漏洞原理
- 服务器无法同时处理大量并发请求
- 多个请求同时与相同数据交互导致逻辑冲突
- 攻击者通过精心定时的请求造成故意冲突
常见易受攻击场景
- 签到系统
- 积分领取功能
- 点赞/评论功能
- 优惠券使用
- 账户余额提取
- 图形验证码重复使用
- 任何限制用户单次操作的功能点
二、条件竞争漏洞利用技术
1. 限制性条件竞争(Limit Overrun)
典型场景:使用单张优惠券多次降低商品价格
案例:利用仅有的一张少额优惠券和50¥购买价值1337¥的商品
利用方法一:Turbo Intruder插件
- 登录系统并选择目标商品加入购物车
- 在优惠券兑换处抓取请求包
- 发送到Turbo Intruder插件
- 选择
race-single模式 - 修改并发请求数量(建议100+以提高成功率)
- 执行攻击
- 观察回显判断成功请求数量
- 完成购买
利用方法二:Repeater分组发送
- 抓取优惠券兑换请求包
- 发送到Repeater
- 使用Ctrl+R复制多个相同请求
- 将所有请求放入同一分组
- 使用
Send group同时发送 - 成功率略高于Turbo Intruder但操作更复杂
2. 绕过频率限制的条件竞争
典型场景:绕过登录尝试次数限制
案例:在3次登录尝试限制下爆破carlos用户密码
利用步骤:
- 抓取登录请求包
- 发送到Turbo Intruder
- 修改脚本以使用不同密码并发请求:
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=1,
engine=Engine.BURP2)
passwords = wordlists.clipboard
for password in passwords:
engine.queue(target.req, password, gate='1')
engine.openGate('1')
- 准备密码本(可包含常见弱密码)
- 执行攻击
- 观察302响应判断成功登录
- 成功率较低,可能需要多次尝试
3. 多端点条件竞争
典型场景:在订单支付过程中修改商品
案例:在支付过程中将高价商品替换为低价商品
利用方法:
-
抓取以下关键请求:
- 添加高价商品
- 移除高价商品
- 添加低价商品
- 提交订单
-
将所有请求放入同一分组
-
设置发送顺序:
- 添加高价商品
- 移除高价商品
- 添加低价商品
- 提交订单
-
确保每次购物车中存在低价商品
-
反复执行直到成功
替代方法:
- 将支付请求和修改商品请求放入同一分组
- 利用服务器处理支付请求的时间窗口修改商品
4. 竞争窗口概念
竞争窗口是指可能发生条件竞争的时间段,通常是:
- 数据库两次交互之间的极短时间
- 服务器处理多个接口调用的间隙
- 订单验证与支付确认之间的时间差
三、防御措施
- 实施原子操作
- 使用适当的锁机制
- 服务器端频率限制
- 关键操作添加唯一性校验
- 减少竞争窗口时间
- 实现幂等性设计
四、高级利用方向(预告)
- 单端点条件竞争
- 时间戳重置密码绕过
- 部分构造条件竞争
- 利用条件竞争上传Webshell
注:实际利用条件竞争漏洞时,成功率与网络环境、服务器性能等因素密切相关,通常需要多次尝试。所有测试应在授权环境下进行。