通过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 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属性。如果点击堆栈跟踪并查看控制台,可以看到接收器发生的具体行号。
创建攻击载荷需要注入两个锚点标签来破坏这些属性:
|
|
查看解决方案 在示例中我们使用了data URL,需要注意的是这不是必须的,只是更优雅。你可以使用HTTP URL,效果同样很好。注意我使用问号而不是单行注释,将utils文件名移动到查询字符串中:
|
|
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日)