DOM XSS是Reflected XSS 或者Stored XSS的变种.
前提条件是: 目标网站使用DOM elements
DOM XSS与其他两种XSS的区别在于: DOM XSS不需要server参与, 靠client的DOM解析. 换句话说, 恶意js代码不存在于服务端的http响应中, 而是直接插入在了受害者的浏览器上.
比如一个网站有如下一个HTML页面:
<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
var pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
</HTML>
indexOf是将name=作为一个整体, 取它的下标 (url第一个字符是下标0). 所以indexOf("name=")+5 取的是用户名第一个字符的下标
substring切割字符串, 表示从第几个位置开始截取到第几个位置结束. 如果只有一个参数, 表示从这个位置开始一直截取到最后.
通常这个页面作为用户欢迎页面, 例如: (这时document.write显示的内容为Joe)
http://www.vulnerable.site/welcome.html?name=Joe
然而,如下的一个请求会产生xss攻击:
http://www.vulnerable.site/welcome.html?name=
<script>alert(document.cookie)</script>
原因是:
受害者的浏览器接收到这个链接,打开http://www.vulnerable.site/welcome.html页面。受害者的浏览器会解析DOM,DOM包含一个对象叫document,document里面有个URL属性,它的值是当前页面的URL。当解析器到达javascript代码,它会执行它并且修改受害者浏览器的HTML页面。代码中document.write中的字符串将会在解析时嵌入到HTML中,并且立即解析,同时,javascript代码会找到(alert(…))并且在同一个页面执行它, 在受害者的网页会弹出一个显示cookie的弹窗。
这是发生在受害者浏览器将请求发给服务器之前的, 所以DOM XSS不需要服务器参与.