本篇主要讲解什么是基于DOM的XSS漏洞,基于DOM的XSS漏洞产生的原因以及一般会在何处产生,最后讲解如何利用基于DOM的XSS漏洞(如XSS经典的窃取cookie、钓鱼等)。
在讲解什么是基于DOM的XSS漏洞之前,我们先来看看什么是DOM。
所谓的DOM又称DOM树,全称为文档对象模型(Document Objeet Mode),是Web前端开发中使用到的一种模型。在前端开发中会使用到很多元素,如< title>、< h1>等,而为了方便使用这些已经定义的元素,将这些元素作为结点排成树状后,通过遍历这棵树,就可以很方便的调用这些元素。而这颗树就称为DOM树。
当js脚本从url获得数据并将其传递到支持动态代码执行的接收器时,就会产生基于DOM的XSS漏洞。也就是说不规范的使用接收器时就会产生基于DOM的XSS漏洞。因此基于DOM的XSS漏洞一般产生于用户能够进行参数输入查询的地方。以下是一些常见的接收器:
document.write()
document.writeln()
document.domain
someDOMElement.innerHTML
someDOMElement.outerHTML
someDOMElement.insertAdjacentHTML
someDOMElement.onevent
当我们进行手工挖掘基于DON的XSS漏洞时,可以先找找看网页使用了那些接收器,再输入任意参数,然后查看参数所在位置,最后尝试写入XSS脚本所在的上下文看脚本能否成功执行。需要注意的是,当接收器为js执行接收器时,我们输入的参数可能不会出现在DOM的任何位置,此时我们可以通过js调试器来追踪我们输入参数。
在了解了相关知识后我们再来看看如何利用基于DOM的XSS漏洞。
以下是靶场首页:
输入随机参数进行查询后通过查看源码看看使用了那些接收器:
接着查看输入的参数所在的位置:
可以看到输入的参数出现在了img src中并且没有进行转码等处理。
接着写入以下脚本:
"><svg onload=alert(1)>
成功出现弹窗,表明写入的XSS成功执行:
到这一步就可以确定该处存在基于DOM的XSS漏洞。接下来就可以通过此漏洞构造虚假的URL诱使受害用户点击以获得cookie,与之前的反射型或存储型XSS基本一致。还可以利用window.location.assign(URL)将受害用户重定向到钓鱼网站。
写入以下脚本:
">
执行结果将会将受害用户重定向到百度首页。
在知道基于DOM的XSS漏洞产生的原因后,我们可以通过使用接收器类型来初步寻找漏洞所在点,接着写入脚本验证能否成功执行,如果能够成功执行表明确实存在漏洞。接着利用该漏洞构造虚假URL盗取cookie或者将受害者重定向到钓鱼网站以窃取敏感信息。