一、XSS简介
XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
总结起来XSS就是:想尽一切办法将你的脚本内容在目标网站中目标用户的浏览器上解析执行即可。一般都会嵌入一段远程或者引用第三方域资源。
二、XSS攻击的危害
1、爆发Web 2.0蠕虫
2、蠕虫式DDoS
3、DoS客户端浏览器
4、网站挂马
5、强制发送电子邮件
6、非法转账
三、哪里会出现XSS攻击
XSS涉及的场景比较广,在大多数支持HTML和JavaScript解析的东西都可以,比如:HTML、XML、Flash、PDF、QQ、一些音乐播放器、浏览器的功能界面
【案例】QQ客户端XSS攻击
2009年,QQ客户端做出大调整,在客户端界面上融入很多HTML元素。在QQ的聊天面板中注入HTML语句破坏正常HTML结构。
漏洞的构造如下:
昵称修改为:<iframe x=` 发送一条这样的消息给攻击者:`src=`HTTP:\\%62AIDU.COM`y=。当攻击者查看聊天记录时,触发以上代码。
绕过细节:
http://必须替换为http:\\,域名的第一个字符必须为urlencode。如上格式使用了`符号,达到了在IE内核环境下的引号作用。
四、XSS分类
4.1、反射型XSS
发出请求时,XSS代码出现在URL中,作为参数提交到服务端,服务端解析后响应,在响应内容中出现这段XSS代码,最后浏览器解析执行。在整个过程就像一次反射。
【案例一】
http://www.fool.com/xss/reflection.php的代码如下:
输入X的值未经任何过滤就直接输出,可以提交:http://www.fool.com/xss/reflection.php?X=<script>alert(1)</script>
服务端解析时,echo就会完整输出<script>alert(1)</script>到响应体中,然后浏览器解析执行出发。
【案例二】
http://www.fool.com/xss/reflection.php的代码如下:
输入X的值作为响应头部的Location字段值输出,意味着会发生跳转,触发XSS的其中一种方式如下。
http://www.fool.com/xss/reflection.php?X=data:text/html;base64,PHHjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ%2b
跳转到date:协议上,text/html是MIME或Conetent-Type,表明文档类型,base64是指后面字符串的编码方式,后面这段base64解码后的值为:
<script>alert(document.domain)</script>于是,当发生跳转时,执行这段js代码。
4.2、存储型XSS
存储型XSS又称为持久型跨站脚本,它一般发生在XSS攻击向量(一般指XSS代码攻击)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久性的XSS相比非持久型XSS攻击危害更大,因为用户每次打开页面,脚本都会自动执行。
【案例】
留言板表单中的表单域: <input type="text" name="content" value="这里是用户填写的数据" />
正常操作:
用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,应用获取数据并显示。
非正常操作:
攻击者在value填写<script>alert(1)</script>或者html其他的标签、攻击代码。
将数据存储到数据库中。
其他用户取出数据显示的时候,将会执行这些攻击代码。
4.3、DOM型XSS
前提是易受攻击的网站有一个HTML页面采用不安全的方式从document.location或document.URL或document.referrer获取数据或任何其他攻击者可以修改的对象
【案例】
这个例子中name是截取URL中get过来的name参数
正常操作:
http://www.fool.com/xss/reflection.php?name=Jake
非正常操作:
http://www.fool.com/xss/reflection.php?name=<script>alert(1)</script>
之前嵌入到HTML只是攻击的一个挂载点,有很多脚本不需要依赖<和>漏洞,因此Mozilla通常也是无法阻止这些攻击。
五、XSS攻击常见的防御方式
5.1、html实体
在html中有些字符,像(<或>)这类的,对HTML来说有特殊意义,所以这些字符是不允许在文本中使用的。要在HTML显示(<或>)这个字符,我们就必须使用实体字符。
html实体的存在是导致XSS漏洞的主要原因之一。
5.2、HTML Encode
用户提交上来的数据进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理。
5.3、修复漏洞方针
将重要的cookie标记为http only,这样的话javascript中的document.cookie就读取不到cookie了
表单数据规定值,例如:年龄应只为Number类型,name只能为字母和数字组合
过滤或移除特殊html标签,例如<script>,<iframe>等
过滤javascript事件标签,例如'onclick','onfocus'等