利用伪装$Version Cookie绕过WAF防火墙

admin 2024年12月6日15:35:44利用伪装$Version Cookie绕过WAF防火墙已关闭评论2 views字数 1753阅读5分50秒阅读模式

通过使用伪装的 $Version 属性,可以有效地绕过许多 Web 应用防火墙 (WAF)。此技术利用了许多 WAF 对 Cookie 标头解析的不一致性。当 WAF 遇到包含 $Version 属性的 Cookie 标头时,它可能会错误地将其解析为遵循旧版标准的 Cookie,而忽略了其中潜在的恶意内容。这种策略的关键在于利用 $Version 属性触发旧版解析逻辑,从而避免现代安全规则的检测。

围绕 HTTP Cookie 的标准化曾进行过多次尝试,最早的官方标准是 RFC2109。尽管现代浏览器不再支持旧版 RFC,但许多 Web 服务器仍然支持。以下是一个有效的 Cookie 头示例:

利用伪装$Version Cookie绕过WAF防火墙

$Version 是一个必需的属性,用于标识 Cookie 符合的状态管理规范版本。其他有意思的属性还包括 $Domain$Path,稍后会讨论。根据该标准,Cookie 值可以包含特殊字符,例如空格、分号和等号,但前提是这些字符用双引号括起来。

现代不同的Web框架会以下列不同方式分析这个头:

利用伪装$Version Cookie绕过WAF防火墙

结果非常混乱。而这种混乱给了攻击者寻找安全漏洞的机会。首先关注 Spring Boot Starter Web 2.x.x。它默认使用 Apache Tomcat v. 9.0.83,该版本以以下方式处理 Cookie 头:

  1. 它同时支持 RFC6265RFC2109 标准。如果字符串以特殊的 $Version 属性开头,它会默认使用旧版解析逻辑。

  2. 它还支持 $Path$Domain 属性,如果这些属性在响应前未被正确检查,可能允许用户更改反射的 Cookie 属性。

  3. 解析器还会对任何以反斜杠(\)开头的字符进行解码,如以下示例所示:

利用伪装$Version Cookie绕过WAF防火墙

另一个典型的例子是 Python 的 SimpleCookie 解析器。它支持包含键值对的旧版 Cookie 请求属性。这种支持使得可以以类似的方式注入恶意 Cookie 属性。如之前演示的那样,Python 所有基于框架(如 Flask、Django 等)都允许使用带引号的 Cookie 值,但不会识别类似 $Version 的特殊字符串,而是将其视为普通的 Cookie 名称。此外,这些框架会自动对引号字符串中的八进制转义序列进行解码。

例如:

利用伪装$Version Cookie绕过WAF防火墙

许多 WAF 无法检测到上述技术,从而允许恶意Payload隐藏在带引号的字符串中。

(1).通过带引号字符串编码绕过值分析

带引号的 Cookie 可能会带来注入漏洞,例如 SQL 注入或命令注入。这类攻击通常使用特殊的命令分隔符,例如分号 (;)、逗号 (,)、换行符 (\n) 和反斜杠 ()。虽然这些分隔符在 Cookie 值中通常会受到限制,但有时可以利用操作触发漏洞。实现这种带引号的 Cookie 编码可以通过使用带有 HttpHandler 接口的 Burp Suite 扩展轻松完成:

利用伪装$Version Cookie绕过WAF防火墙

例如,Amazon Web Services WAF 会阻止任何包含被禁止函数参数的请求:

利用伪装$Version Cookie绕过WAF防火墙

(2).绕过Cookie名称黑名单

RFC2109 的另一个关键点是:服务器也应接受逗号 (,) 作为 Cookie 值之间的分隔符。这可以被利用来绕过简单的 WAF 签名,这些签名可能未预料到 Cookie 名称会被隐藏在值中。此外,该规范允许在注入的属性值对的等号前后有任意数量的空格或制表符,这也可以用来规避检测。请参阅以下 Cookie 头示例:

利用伪装$Version Cookie绕过WAF防火墙

(3).通过 Cookie 分割绕过值分析

与许多其他 HTTP 头一样,Cookie 头可以在单个请求中发送多次。服务器处理多个相同头的方式可能有所不同。例如,我发送了以下 GET 请求:

利用伪装$Version Cookie绕过WAF防火墙

并得到了如下返回结果:

利用伪装$Version Cookie绕过WAF防火墙

正如我们所见,Ruby、PHP 以及 Python 框架 Django 和 Flask 会将头合并为一个用逗号分隔的字符串(参数之间可能有可选的空格)。还支持带引号的 Cookie 值,这允许通过将 Cookie 头用作多行头续行来隐藏恶意Payload。

不幸的是,带引号的字符串技术不适用于 PHP 和 Ruby。要绕过提到的 AWS 签名,可以使用以下请求:

利用伪装$Version Cookie绕过WAF防火墙

下图是在Param Miner中已经实现的自动化构造:

利用伪装$Version Cookie绕过WAF防火墙

可以采取以下一系列步骤来防止 Cookie 中的解析器差异漏洞:

  • 确保在 Web 服务器上禁用对 RFC2109 的旧版支持,除非明确需要。

  • 严格验证所有用户输入,以识别和缓解潜在的危险数据。这有助于确保输入在应用程序内部处理或与其他系统组件交互时是安全的。

  • 避免依赖关于用户输入中特定字符存在或不存在的假设,以减少意外行为的风险。

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月6日15:35:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用伪装$Version Cookie绕过WAF防火墙https://cn-sec.com/archives/3476385.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.