这个漏洞往往存在于客户端脚本,如果一个Javascript脚本访问需要参数的URL,且需要将该信息用于写入自己的页面,且信息未被编码,那么就有可能存在这个漏洞。
DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
DOM—based XSS攻击源于DOM相关的属性和方法,被插入用于XSS攻击的脚本。一个典型的例子如下所述。
H TTP请求http://www.DBXSSed.site/welcome.html?name=zhangsan使用以下的脚本打印出登录用户zhangsan的名字,即
假设我输入一个
name:
于是你很容易就会想到写入这样一句:,结果呢?并没有一个熟悉的对话框弹出来,INNERHTML属性里写入块是不会被执行的,所以呢我们要用事件来执行我们的代码:
如下:
这个函数是不安全的,如果参数带有用户输入,就可能导致执行JS代码:
function HTMLDecode(strEncodeHTML)
{
var div = document.createElement('div');
div.innerHTML = strEncodeHTML;
return div.innerText;
}
HTMLDecode("");
有人以为,这个没有被appendChild到dom树的元素,应该不会执行。
例如,假设应用程序返回的错误页面包含以下脚本:
这段脚本解析 URL,提取出message参数的值,并把这个值写入页面的HTML源代码中。如果按开发者预想的方式调用,它可以和前面的示例中一样,用于创建错误消息。但是,如果攻击者设计出一个URL,并以JavaScript代码作为message参数,那么这段代码将被动态写入页面中,并像服务器返回代码一样得以执行。
在这个示例中,前面示例中利用反射型XSS漏洞的相同URL也可用于生成一个对话框:
https://wahh-app.com/error.php?message=
(1)与SQL注入防护的建议一样,假定所有输入都是可疑的,必须对所有输入中的script、iframe等字样进行严格的检查。这里的输入不仅仅是用户可以直接交互的输入接口,也包括HTTP请求中的Cookie中的变量,HTTP请求头部中的变量等。
(2)不仅要验证数据的类型,还要验证其格式、长度、范围和内容。
(3)不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。
(4)对输出的数据也要检查,数据库里的值有可能会在一个大网站的多处都有输出,即使在输入做了编码等操作,在各处的输出点时也要进行安全检查。
(5)在发布应用程序之前测试所有已知的威胁。