探秘条件漏洞:系统安全的潜在隐患
字数 982 2025-08-29 08:30:19
探秘条件漏洞:系统安全的潜在隐患 - 教学文档
竞争条件概述
竞争条件是一种与业务逻辑缺陷密切相关的常见漏洞,发生在网站在没有足够保护措施的情况下并发处理请求时。这会导致多个线程同时与相同数据交互,引发应用程序中的"碰撞"和意外行为。
关键概念
- 竞争窗口:可能发生碰撞的时间段,通常是两次与数据库交互之间的几分之一秒
- 影响:严重依赖于应用程序及发生问题的具体功能
限制溢出竞争条件
这是最著名的竞争条件类型,允许超出应用程序业务逻辑施加的限制。
典型示例
在线商店促销代码使用流程:
- 检查用户之前未使用过此代码
- 将折扣应用于订单总额
- 更新数据库记录以反映代码已被使用
攻击变体
- 多次兑换礼品卡
- 多次评价产品
- 提取或转账超过账户余额的现金
- 重复使用单个CAPTCHA解决方案
- 绕过防暴力破解速率限制
技术分类
限制溢出属于"检查时间到使用时间"(TOCTOU)缺陷的子类型
检测与利用方法
基本流程
- 识别具有安全影响的单次使用或速率限制端点
- 连续快速发出多个请求,尝试超出限制
- 确保请求时机对齐使竞争窗口重叠
使用Burp Repeater
Burp Suite 2023.9新功能:
- 支持并行发送请求
- 自动调整技术:
- HTTP/1:使用最后一个字节同步技术
- HTTP/2:使用单包攻击技术
单包攻击优势:
- 单个TCP包可同时完成20-30个请求
- 完全消除网络抖动干扰
- 减轻服务器端抖动
使用Turbo Intruder
配置要求:
- 目标必须支持HTTP/2
- 设置
engine=Engine.BURP2和concurrentConnections=1 - 使用
gate参数分配命名门 - 通过
engine.openGate()并行发送请求
示例代码:
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=1,
engine=Engine.BURP2
)
# 在门'1'中排队20个请求
for i in range(20):
engine.queue(target.req, gate='1')
# 并行发送门'1'中的所有请求
engine.openGate('1')
实践靶场
- 限制溢出竞争条件靶场:https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overru
- 通过竞争条件绕过速率限制靶场:https://portswigger.net/web-security/race-conditions/lab-race-conditions-bypa
防御建议
- 实施适当的锁定机制
- 使用原子操作
- 减少竞争窗口时间
- 在关键操作中增加验证步骤
- 考虑使用事务处理