探秘条件漏洞:系统安全的潜在隐患

2025-03-09 3 0

竞争条件

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

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

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

限制溢出竞争条件

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

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

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

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

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

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

探秘条件漏洞:系统安全的潜在隐患插图

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

探秘条件漏洞:系统安全的潜在隐患插图1

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

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

  • 多次兑换礼品卡

  • 多次评价产品

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

  • 重复使用单个 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

探秘条件漏洞:系统安全的潜在隐患插图2

探秘条件漏洞:系统安全的潜在隐患插图3

探秘条件漏洞:系统安全的潜在隐患插图4

使用 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


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

恶意软件伪装成合法 Go 库感染Linux和macOS用户 | CSO Online
PWN栈溢出基础-ret2csu
【验证码逆向专栏】某盾 v2 滑动验证码逆向分析
记录某SRC邀请处逻辑越权到组织管理员漏洞
DNSTwist 使用指南
Vulnhub靶场——Lampiao

发布评论