基于DOM的漏洞笔记
个人总结
参考:https://portswigger.net/web-security/dom-based
- name: 个人总结
desc: 参考:https://portswigger.net/web-security/dom-based
bgColor: '#F0DFB1'
textColor: 'green'
1
2
3
4
2
3
4
# 基于DOM的漏洞笔记
# 1基于DOM的漏洞基本知识
# 1、什么是DOM?
答案
文档对象模型(DOM,Document Object Model)是 Web 浏览器对网页元素的分层表示形式。网站可以使用 JavaScript 来操作 DOM 节点和对象,以及它们的属性。
# 2、DOM漏洞是如何产生的?
答案
DOM 中存在很多动态的值(源)和许多危险的函数(接收器),当一个动态值 被传递到 危险的函数中时,就有可能产生基于 DOM 的漏洞。
# 3、DOM漏洞有什么危害?
答案
DOM 漏洞的危害飘忽不定,取决于具体的危险函数(接收器)是什么。
- 例如,如果一个动态值,最终被传递到了接收器
eval()
中,那危害就有可能是 XSS - 如果接收器是
window.location
,那危害就有可能是开放重定向 - 而
document.cookie
既可以作为 “源” 又可以作为 “接收器”,当它作为一个接收器时,危害有可能是 Cookie 操纵
# 4、有哪些常见的DOM漏洞?导致漏洞的接收器分别是什么?
答案
有很多,表格 (opens new window)在这里,自己慢慢看吧。本站有经过翻译的表格 (opens new window)。
# 2基于DOM的漏洞
# 1、基于DOM的开放重定向漏洞有什么危害?该漏洞是由哪种类型的接收器导致的?
答案
危害:
- 危害一般为钓鱼攻击
- 如果能够控制 URL 的开头部分,可以尝试注入
javascript:
伪协议,看能不能升级为 XSS 漏洞
可以实现 “跨域导航” 的接收器,例如window.location
,以下是一些常见的接收器:
location
location.host
location.hostname
location.href
location.pathname
location.search
location.protocol
location.assign()
location.replace()
open()
element.srcdoc
XMLHttpRequest.open()
XMLHttpRequest.send()
jQuery.ajax()
$.ajax()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2、基于DOM的 cookie 操纵漏洞有什么危害?该漏洞是由哪一个接收器导致的?
答案
此漏洞的危害取决于 Cookie 在网站中所扮演的角色:
- 例如,如果 Cookie 用于控制某些用户操作,则攻击者可以操纵 Cookie 的值来让用户执行某些非预期的操作
- 如果 Cookie 用于跟踪用户的会话,则攻击者可能执行会话固定攻击
由document.cookie
接收器导致。
# 3、基于DOM的web消息源控制漏洞有什么危害?该漏洞是由哪些接收器导致的?
答案
此漏洞的危害取决于 目标文档对传入消息的处理方式。例如,如果消息被传入eval()
接收器,则危害可能是 XSS 攻击。
如果网站接收来自不受信任源的 Web 消息数据,并将消息传入事件监听器,则其中使用的任何接收器都可能导致漏洞。
# 4、DOM clobbering是什么?
答案
DOM clobbering 是一种攻击技术,它可以在 HTML 中通过某些标签(例如锚元素)来注入id
或name
等属性,以覆盖某些全局变量,最后将这个变量传递到不安全的接收器中。
- 之前的 DOM 漏洞,都是直接把用户输入赋值给 “源”,再将 “源” 传递到 “接收器” 中(源 --> 接收器)
- 在 DOM clobbering 中,则是通过标签注入一些属性,覆盖程序中原有的变量,最后将被污染的变量传递到 “接收器” 中(通过标签属性覆盖变量 --> 污染变量 --> 接收器)
(有点像变量覆盖漏洞)
# 5、DOM clobbering如何实现攻击?
答案
- 通过锚元素覆盖全局变量:
<a id=someObject><a id=someObject name=url href=//malicious-website.com/evil.js>
- 通过表单之类的元素覆盖
attributes
属性,欺骗客户端过滤器:<form onclick=alert(1)><input id=attributes>Click me
# 3防御措施
# 1、如何防范基于DOM的漏洞?
答案
- 不要根据用户输入来动态变更 DOM 文档中的元素;
- 不要完全信任用户输入,应该在白名单的基础上验证相关数据,确保所有输入变量都经过了验证;
- 对输出的数据进行编码,按适当的顺序实施 JavaScript 转义、HTML 编码和 URL 编码的组合。
# 2、如何防范DOM clobbering
答案
- 检查对象或函数是否合法——实现检查功能,确保对象或函数符合预期;
- 避免错误的代码格式——编写代码时,避免将逻辑与运算符
||
和全局变量(||
+全局变量)结合使用; - 使用现成的、经过良好测试的 JavaScript 库实现过滤功能,例如 DOMPurify。
还有个更简单的办法,把过滤功能写在后端代码里就行了。
编辑 (opens new window)