通过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破坏漏洞,需要满足三个条件:
- HTML注入点
- gadget(一个或多个属性名称)
- 接收器(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的攻击。根据接收器值显示,我们需要控制ehy
和codeBasePath
属性。注意接收器值还包含JavaScript文件路径/utils.js
,在利用时需要通过单行注释处理。
现在需要构造攻击载荷(如需复习相关知识请访问安全学院的学习材料)。已知gadget最终会进入script.src
属性,通过查看控制台堆栈跟踪可以精确定位接收器位置。攻击构造需要注入两个锚点标签来破坏这些属性:
|
|
解决方案说明:
示例中使用data URL并非必需,只是更简洁的方案。完全可以使用HTTP URL替代(如下例),效果完全相同。注意这里使用问号代替单行注释,将utils文件名移动到查询字符串中:
|
|
HTTP示例:
通过这种构造方式,即使存在CSP防护,也能成功执行XSS攻击载荷。
相关标签:DOM破坏 | DOM | XSS | CSP
本文隶属技术分类:Web应用安全 | 客户端漏洞利用
本文涉及的核心技术:DOM属性破坏、CSP策略绕过、脚本注入、非预期脚本执行机制。所有技术细节均基于真实漏洞场景验证,具备实际应用价值。