定义
基于dom的xss是指pyaload的执行结果是用户浏览器中DOM环境的修改。网页(http响应包)本身并没有修改,但由于DOM环境中发生的恶意修改,客户端中的页面代码的执行方式有所不同。
举例
假设以下代码用来生成一个表单,使用户选择他们偏好的语言。一个默认的语言也在请求中提供,为参数“default”。
…
Select your language:
<select><script>
document.write("<OPTION value=1>"+decodeURIComponent(document.location.href.substring(document.location.href.indexOf("default=")+8))+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
…
可以用以下URL调用页面:
http://www.some.site/page.html?default=French
对此页面的基于DOM的xss攻击可以通过发送以下URL给一名用户完成:
http://www.some.site/page.html?default=<script>alert(document.cookie)</script>
当用户点击此链接,浏览器发送以下请求:
/page.html?default=<script>alert(document.cookie)</script>
到www.some.site。服务器对此的响应包带有上面的JS代码,浏览器在页面中生成一个dom对象,其中的 document.location对象带有以下字符串:
http://www.some.site/page.html?default=<script>alert(document.cookie)</script>
原本的JS代码并未想到参数default会包含html代码,所以,它在运行时简单的解码并回显到页面中。然后浏览器渲染此最终的页面并执行攻击者的脚本:
alert(document.cookie)
注意,http响应包并不含有攻击者的payload。该payload在运行时显示在客户端的页面中。当含有漏洞的脚本访问DOM变量document.location,并假定它不是恶意的时候发生。另外,大部分浏览器URL会默认对document.location进行编码,从而减少基于dom的xss攻击的影响和可能性。
高级技术和衍生
在上述的例子中,当payload没被服务器嵌入到http响应中,它仍然作为http请求的一部分到了服务器,因此攻击可以被服务器端检测。
避免发送payload到服务器的技术依靠URI fragments(在URI中“#”后面的部分),它不会被浏览器发送到服务器中。因此,任意引用(例如document.location)客户端代码,将可能受到使用fragments的攻击。在此例子中,payload将不会发送到服务器中。举个例子,上述的基于dom的xss可以修改成:
http://www.some.site/page.html#default=<script>alert(document.cookie)</script>
会发出相同攻击而不被服务器看到(只看到page.html的请求,没#后的参数)。
(略,关于adobe一个pdf阅读插件的xss)