跨站点脚本是跨站点脚本——DOM/持久/反射之间的区别仅在于攻击是如何完成(和防止)的。
威胁是一样的——攻击者以某种方式将恶意 javascript 注入到他们不应该控制的页面中,通常是由于网站设计中的漏洞。
以OWASP 中的示例为例,其中 HTML 页面包含一些内联 javascript(部分位于标签内)。内联 javascript 的目的是从“默认”查询参数中获取一个变量,并使用它的值来修改 DOM——即将第一个<option>标记的值更改为该查询参数的值。
网页源(通过网络发送)如下所示:
Select your language:
<select><script>
document.write("<OPTION value=1>"+document.location.href.substring(document.location.href.indexOf("default=")+8)+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
但从 中查看后http://www.some.site/page.html?default=French,DOM 将变为:
Select your language:
<select>
<OPTION value=1>French</OPTION>
<OPTION value=2>English</OPTION>
</select>
这意味着您的 Web 浏览器一旦运行 DOM 修改 javascript(对 的调用),就会将上述网页视为通过网络发送的网页document.write。
现在,一个聪明的攻击者会发送一个链接(通过电子邮件/网页链接),受害者单击该链接指向http://www.some.site/page.html?default=<script>alert(document.cookie)</script>. 然后页面上的网页(在使用 处理初始 javascript 之后document.write)看起来像:
Select your language:
<select>
<OPTION value=1><script>alert(document.cookie)</script></OPTION>
<OPTION value=2>English</OPTION>
</select>
同样alert(document.cookie)可以是攻击者想要的任意 javascript。
也许页面上有一个秘密的用户名/密码或会话 cookie 或信用卡号,而不是警报,您将按下提交按钮绑定到 ajax 调用,以便当用户按下提交时,它将所有秘密数据发送到服务器攻击者可以访问。
实际上没有最坏的情况——如果存在 DOM-XSS 漏洞,您应该能够使用 javascript 执行的任何操作。