文章转自以下链接:浅析DOM型XSS
推荐点击阅读原文。本博客只作为自己理解使用。
DOM以及DOM型XSS
官方的说法是:文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口。它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式。
上面的话我个人觉得不是很好理解。我们来一句一句解释一下。它给文档提供了一种结构化的表示方法。
通过下图我们可以理解这句话的意思
上图是HTML DOM定义的结构,我们可以看出来其中包含了HTML中定义的所有元素和对象属性,通过上面的DOM树进行了展现。这就是一种规定。
接着第二句,可以改变文档的内容和呈现方式
由于定义了上面的结构,因此在客户端页面进行渲染的时候,可能会根据用户的不同的输入将输入的内容嵌入到页面中某一部分,也可能删除页面中的一部分渲染代码。这个地方就是对页面的代码进行了修改,那么就有可能造成XSS。
举个例子:如果输入框中需要我们写入name,如果name变成了一段XSS的代码,脚本处理这段代码后就会被嵌入页面,这就产生了DOMXSS。
DOM型XSS是基于DOM文档对象模型的一种漏洞。严格地说,DOM型XSS其实算反射型XSS,(也有看说DOM型XSS可以产生反射也可以产生存储型XSS)。区别在于DOM型XSS并不会和后台进行交互,是完完全全的Web前端安全问题,要做防御也只能在客户端上进行防御。
首先,客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它并不与服务端进行交互而是从客户端获得DOM中的数据(如从URL中获取数据)并在本地执行;其次,浏览器用户可以操纵DOM中的一些对象如URL、location等;因此,当攻击者可以控制一些DOM对象、输入一些恶意JS代码,而客户端的脚本并没有对用户输入内容进行有效的过滤就传入一些执行危险操纵的函数如eval等或直接输出到页面时,就会导致DOM型XSS漏洞的存在。
例子
接着参考大佬的那篇文档
<!DOCTYPE html>
<html>
<head>
<title>DOM XSS</title>
</head>
<body>
<script>
var pos=document.URL.indexOf("name=")+5;
document.write(decodeURI(document.URL.substring(pos,document.URL.length)));
</script>
</body>
</html>
如上面的HTML文件就存在DOM型XSS,其功能是当我们在URL栏输入参数name的值后,就会在当前页面显示输入如的name的值,其功能的实现全都在前端JS中进行、未与后台进行任何交互。
从代码层面看,漏洞形成原因很简单,document.URL获取用户输入,在代码中未经过任何过滤就传递给了document.write输出到当前页面中。
当我们正常输入name值时页面直接显示输入的内容,F12查看DOM文档可看到输入的内容确实是插入到当前DOM结构中:
也就是说DOM结构我们用户输入可控,当我们输入XSS payload时就会弹框,造成DOM型XSS:
以上就是一个DOM-XSS的例子。