【技术分享】梨子带你刷burpsuite靶场系列之客户端漏洞篇 – 基于DOM的漏洞
本系列介绍
PortSwigger是信息安全从业者必备工具burpsuite的发行商,作为网络空间安全的领导者,他们为信息安全初学者提供了一个在线的网络安全学院(也称练兵场),在讲解相关漏洞的同时还配套了相关的在线靶场供初学者练习,本系列旨在以梨子这个初学者视角出发对学习该学院内容及靶场练习进行全程记录并为其他初学者提供学习参考,希望能对初学者们有所帮助。
什么是DOM?
DOM,全称document object model,译为文档对象模型。是浏览器对页面元素的分层表示。网站可以使用JS操作DOM的节点和对象以及它们的属性。在DOM的概念中有两个专有名词source和sink,目前梨子还找不到合适的中文翻译。我们暂且理解为DOM操作的入口点和出口点。如果当不安全的payload从入口点传递给出口点则可能存在基于DOM的漏洞。
source
source是一个JS属性,可以接收用户输入。比如location.search,它可以从查询字符串中获取数据,这也是攻击者比较容易利用的点。还有其他的也是容易被攻击者控制的source,例如document.referrer、document.cookie还有Web消息等。
sink
既然source是接收用户输入,那么sink就是使用危险的方式处理source的函数或DOM对象。比如eval()就是一种sink,可以处理JS传递给它的参数值。还有一种sink是document.body.innerHTML,攻击者可以向其注入恶意的HTML和JS脚本并执行。
什么是污点流(Taint-flow)?
当网站将数据从source传递给sink,然后sink以不安全的方式处理该数据,则可能出现基于DOM的漏洞。危险的数据由source流向sink,所以叫做污点流(Taint-flow)。最常见的source就是URL,通常使用location对象访问。攻击者可以构造一个链接,然后让受害者跳转到指定的页面。例如
goto = location.hash.slice(1)if (goto.startsWith('https:')) { location = goto;}
上面这段代码会检查URL,如果包含以https开头的哈希片段则提取location.hash属性的值并将其设置为window对象的location属性。所以攻击者可以构造这样的URL来利用这个基于DOM的开放重定向漏洞。
https://www.innocent-website.com/example#https://www.evil-user.net
经过上面那段代码处理以后,会将https://www.evil-user.net 设置为location属性的值,这会自动将受害者重定向到该站点。一般可以用于钓鱼攻击。
常见的source
下面列出一些常见的可能触发污点流(Taint-flow)漏洞的source
- document.URL
- document.documentURI
- document.URLUnencoded
- document.baseURI
- location
- document.cookie
- document.referrer
- window.name
- history.pushState
- history.replaceState
- localStorage
- sessionStorage
- IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
- Database
下面几种数据也是可能触发污点流(Taint-flow)漏洞的source
- 反射型数据(已在XSS专题中讲解)
- 存储型数据(已在XSS专题中讲解)
- Web消息
以Web消息为source的基于DOM的漏洞
如果网站以不安全的方式传递Web消息,例如,未在事件侦听器中正确验证传入的Web消息的源,则事件侦听器调用的属性和函数可能会成为sink。攻击者可以托管恶意iframe并使用postMessage()方法将Web消息数据传递给事件监听器,然后将payload发送到父页面上的sink。这就以为着攻击者可以以Web消息为source将恶意数据传递到这些所有的sink。
如何以Web消息为source构造攻击?
首先我们考虑这样的代码
<script>window.addEventListener('message', function(e) { eval(e.data);});script>
这段代码添加了一个事件监听器,在接收到消息时执行里面的data部分。这里我们通过iframe注入这个消息
