freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

探秘条件漏洞:系统安全的潜在隐患
2025-03-04 11:16:24
所属地 四川省

竞争条件

竞争条件是一种常见的漏洞,与业务逻辑缺陷密切相关。当网站在没有足够保护措施的情况下并发处理请求时,会发生竞争条件。这可能导致多个不同的线程同时与相同的数据交互,从而导致应用程序中的“碰撞”,引发意外行为。竞争条件攻击通过精心计时的请求来故意引发碰撞,并利用这种意外行为进行恶意目的。

可能发生碰撞的时间段称为“竞争窗口”。例如,这可能是两次与数据库交互之间的几分之一秒。

与其他逻辑缺陷一样,竞争条件的影响严重依赖于应用程序以及发生该问题的具体功能。

限制溢出竞争条件

最著名的竞争条件类型使你能够超出应用程序业务逻辑施加的某种限制。

例如,考虑一家在线商店,允许你在结账时输入促销代码以获得一次性订单折扣。为了应用此折扣,应用程序可能会执行以下高层次步骤:

  1. 检查你之前未使用过此代码。

  2. 将折扣应用于订单总额。

  3. 更新数据库记录,以反映你已使用此代码的事实。

如果你稍后尝试重复使用此代码,过程开始时执行的初始检查会阻止你这样做。

image-20250304102959656.png

如果尝试重复使用此代码,过程开始时执行的初始检查会阻止你这样做。

image-20250304103040676.png

如你所见,应用程序通过了一个临时子状态;即,它进入然后在请求处理完成之前退出的状态。在这种情况下,子状态从服务器开始处理第一个请求时开始,并在更新数据库以表明你已使用此代码时结束。这引入了一个小的竞争窗口,在此窗口期间,你可以反复多次获得折扣。

这种攻击有许多变体,包括:

  • 多次兑换礼品卡

  • 多次评价产品

  • 提取或转账超过账户余额的现金

  • 重复使用单个 CAPTCHA 解决方案

  • 绕过防暴力破解速率限制

限制溢出是所谓的“检查时间到使用时间”(TOCTOU)缺陷的子类型。稍后在本主题中,我们将查看一些不属于这些类别的竞争条件漏洞示例。

使用 Burp Repeater 检测和利用限制溢出竞争条件

检测和利用限制溢出竞争条件的过程相对简单。从高层次来说,只需要:

  1. 识别一个具有某种安全影响或其他有用目的的单次使用或速率限制端点。

  2. 连续快速发出多个请求到此端点,看看是否可以超出此限制。

主要挑战是使请求的时机对齐,以便至少两个竞争窗口重叠,从而引发碰撞。此窗口通常仅为几毫秒,甚至更短。

即使同时发送所有请求,实际上,各种不可控和不可预测的外部因素会影响服务器处理每个请求的时间和顺序。

Burp Suite 2023.9 为 Burp Repeater 添加了强大的新功能,使你可以轻松地以并行方式发送一组请求,从而大大减少其中一个因素的影响,即网络抖动。Burp 会根据服务器支持的 HTTP 版本自动调整其使用的技术:

  • 对于 HTTP/1,它使用经典的最后一个字节同步技术。

  • 对于 HTTP/2,它使用单包攻击技术,PortSwigger Research 在 Black Hat USA 2023 上首次演示了这种技术。

单包攻击允许可以通过使用单个 TCP 包同时完成 20-30 个请求,从而完全消除网络抖动的干扰。

即使你通常可以仅使用两个请求来触发漏洞利用,但像这样发送大量请求有助于减轻内部延迟,也称为服务器端抖动。这在初始发现阶段特别有用。

限制溢出竞争条件-靶场

靶场地址:https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overru

image-20250304103837805.png

image-20250304103855501.png

image-20250304103911457.png

使用 Turbo Intruder 检测和利用限制溢出竞争条件

除了在 Burp Repeater 中提供对单包攻击的原生支持外,我们还增强了 Turbo Intruder 扩展以支持这种技术。你可以从 BApp Store 下载最新版本。

Turbo Intruder 需要一定的 Python 熟练度,但适用于更复杂的攻击,例如需要多次重试、交错请求时间或极大量请求的攻击。

要在 Turbo Intruder 中使用单包攻击:

  1. 确保目标支持 HTTP/2。单包攻击与 HTTP/1 不兼容。

  2. 为请求引擎设置engine=Engine.BURP2concurrentConnections=1配置选项。

  3. 当排队请求时,通过使用engine.queue()方法的gate参数将它们分配到命名门。

  4. 要并行发送给定组中的所有请求,请使用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-bypa

# web安全 # 系统安全 # 漏洞分析 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录