文章目录
前言
节选自portswigger的教程,详细介绍了竞态条件的漏洞,日常src挖掘中所说的并发漏洞。要理解该教程,需要操作系统的基础知识,如果学习过多进程、多线程编程的话,其实就是一个线程安全问题。
什么是竞态条件(race condition)
竞态条件(Race conditions) 是与业务逻辑漏洞密切相关的常见漏洞类型。当网站在缺乏有效防护机制的情况下并行处理请求(process requests concurrently)时就会发生此类漏洞,导致多个独立线程(distinct threads)同时操作同一数据,引发冲突(collision)并产生应用程序的异常行为。竞态条件攻击通过精确时序控制的请求(carefully timed requests)制造人为冲突,利用这种异常行为实现恶意目的。
可能发生冲突的时间段称为竞态窗口(race window)。例如,这可能是两次数据库操作之间的毫秒级间隙。
与其他逻辑漏洞类似,竞态条件的影响高度取决于漏洞所在的具体应用场景(application context)和功能模块(functionality)。在本节中,您将学习如何识别和利用不同类型的竞态条件。我们将向您介绍Burp Suite的内置工具如何帮助您克服执行经典攻击的挑战,以及一种久经考验的方法,用于检测隐藏在多步骤流程中的新型竞态条件。这些技术远超您可能已熟知的**超额限制漏洞(limit overruns)**范畴。
超额限制(Limit Overrun)竞争条件
最著名的竞争条件类型使您能够超出应用程序的业务逻辑所施加的某种限制。例如,考虑一个在线商店,它允许您在结帐时输入促销代码以获得订单的一次性折扣。要应用此折扣,应用程序可以执行以下步骤:
- 检查您是否已经使用过此代码。
- 将折扣应用于订单总额。
- 更新数据库中的记录以反映您现在已经使用此代码的事实。
现在考虑一下,如果一个从未应用过这个折扣代码的用户试图在几乎完全相同的时间应用两次,会发生什么:
如你所见,该应用程序在处理请求时会经历一个临时子状态(temporary sub-state)——即一个在请求处理完成前进入并退出的过渡状态。在本案例中,这个子状态的生命周期是:
- 起始点:服务器开始处理第一个请求时
- 终止点:服务器更新数据库标记兑换码已使用时
这导致了一个微小的竞态条件窗口(race window),在此期间攻击者可以无限次重复申领折扣。
这类攻击有许多变体,包括:
- 多次兑换礼品卡
- 对产品进行多次评级
- 提取或转移超过账户余额的现金
- 重用单个CAPTCHA解决方案
- 绕过反暴力破解速率限制
超额限制漏洞(Limit overruns) 是典型的"检查-使用"时差漏洞(TOCTOU)子类。在本专题后续内容中,我们将重点分析不属于上述任何分类的新型竞态条件漏洞案例。
使用 Burp Repeater 检测和利用Limit Overrun
检测与利用超额限制竞态条件(Limit overrun race conditions) 的流程相对简单,可概括为两个核心步骤:
-
定位关键端点(即接口URL):识别具有安全影响或实用价值的单次使用端点(single-use endpoint)或速率限制端点(rate-limited endpoint)
-
实施并发爆破:向该端点快速连续发送多重请求(issue multiple requests in quick succession),测试是否能突破限制
核心挑战在于时序控制:必须确保至少两个竞态窗口(race window)发生重叠(overlap)以引发冲突。这类窗口通常仅为毫秒级(milliseconds),甚至更短。
即便所有请求都严格同步发送(send at exactly the same time),现实中仍存在诸多不可控变量(uncontrollable factors)和随机干扰(unpredictable external factors),这些因素会直接影响:
- 服务器处理各请求的具体时间点
- 请求的实际执行顺序
Burp Suite 2023.9 为 Burp Repeater 新增了突破性功能,可通过并行请求组(group of parallel requests)发送机制显著降低网络抖动(network jitter)的影响。该工具会根据目标服务器的HTTP协议版本自动切换优化策略: - HTTP/1 末字节同步技术(last-byte synchronization),经典时序控制方法,通过精确控制数据包末字节传输时间实现请求同步
- HTTP/2 单包攻击技术(single-packet attack),PortSwigger Research 在 Black Hat USA 2023 首发的革命性技术,单个TCP包可承载20-30个并发请求
单包攻击的技术优势:通过单次TCP包传输完成批量请求,从根本上消除了网络抖动(network jitter)对时序的干扰。
尽管两个请求(two requests)往往足以触发漏洞利用,但通过海量并发请求(large number of requests)可有效抵消服务器端抖动(server-side jitter)——即目标系统内部的时序偏差。该策略在漏洞初探阶段(initial discovery phase) 具有特殊价值。
- 有关如何使用Burp Repeater的新功能并行发送多个请求的详细信息,请参阅并行发送请求。
- 有关单包攻击的底层机制的技术见解,以及对方法的更详细了解,请查看随附的白皮书:粉碎状态机:Web竞争条件的真正潜力
使用Turbo Intruder检测和利用limit overrun竞争条件
除了在 Burp Repeater 中实现原生单包攻击支持(native single-packet attack),我们还增强了Turbo Intruder扩展以支持此技术。您可以从BApp Store下载最新版本。
Turbo Intruder需要一定的Python编程能力,但特别适用于需要多次重试(multiple retries)、精确交错时序控制(staggered request timing)或极大量请求(extremely large number of requests)的复杂攻击场景。
在Turbo Intruder中使用单包攻击的操作指南:
- 确保目标服务器支持HTTP/2(单包攻击技术无法兼容HTTP/1协议)
- 在请求引擎设置
engine=Engine.BURP2
和concurrentConnections=1
配置选项 - 请求分组队列管理,使用
engine.queue()
方法的gate参数对请求进行命名分组:
engine.queue(request, gate="race_group_1") # 将请求分配至"race_group_1"逻辑门
批量请求触发执行
- 通过
engine.openGate()
方法瞬时释放指定组内所有请求:
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint,
concurrentConnections=1,
engine=Engine.BURP2
)
# queue 20 requests in gate '1'
for i in range(20):
engine.queue(target.req, gate='1')
# send all requests in gate '1' in parallel
engine.openGate('1')
要了解更多细节,请参阅Turbo Intruder的默认示例目录中提供的race-single-packet-attack.py
模板。
隐藏的多步骤流程
在实际场景中,单个请求可能触发后台的多步骤状态序列(multi-step sequence),使应用程序在处理请求期间经历多个隐性状态(multiple hidden states),即进入一个请求处理并在处理完成前退出的过渡状态,我们为称之为“子状态”。
若能识别出与同一数据产生交互(interaction with the same data)的一个或多个HTTP请求,便可利用这些子状态来暴露多步骤工作流(multi-step workflows)中常见逻辑漏洞的时间敏感型变体(time-sensitive variations)。这使得竞态条件攻击的影响远超传统的超额限制漏洞(limit overruns)。
例如,您可能熟悉有缺陷的多因素身份验证(multi-factor authentication,MFA)工作流,它允许您使用已知凭据执行登录的第一部分,然后通过强制浏览直接导航到应用程序,有效地完全绕过了MFA。
以下伪代码演示了网站为何易受此类攻击的**竞态条件变种(race variation)**影响
session['userid'] = user.userid
if user.mfa_enabled:
session['enforce_mfa'] = True
# generate and send MFA code to user
# redirect browser to MFA code entry form
如你所见,这实际上是在单个请求范围内发生的多步骤流程。最关键的是,系统会经历一个子状态(sub-state)——在此状态下,用户暂时拥有有效的登录会话(valid logged-in session),但多因素认证(MFA)尚未被强制执行。 攻击者可能通过以下方式利用此漏洞:
- 发送登录请求(login request)
- 并发发送需认证的敏感端点(authenticated endpoint)请求
后续内容中,我们将分析更多隐藏多步骤流程(hidden multi-step sequences)的案例,您可在我们的交互式实验环境(interactive labs)中练习如何利用这些漏洞。然而,由于此类漏洞高度特定于具体应用程序(application-specific),在实验和真实环境(in the wild)中,首先理解以下通用方法论至关重要:
- 如何系统化识别此类漏洞
- 如何构建高效的检测流程
原文
https://portswigger.net/web-security/race-conditions#hidden-multi-step-sequences