【安全系列】XSS攻击与防御

621 阅读5分钟

一、XSS简介

    XSS攻击全称跨站脚本攻击(Cross Site Scripting),是为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供其他用户使用的页面中。

    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、DOMXSS

    基于DOM的XSS有时候也称为type0XSS。当用户能够通过交互修改浏览器页面的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漏洞的主要原因之一。

    html实体转换相应的实体编码表如下:

    5.2、HTML Encode

    用户提交上来的数据进行HTML编码,将相应的符号转换为实体名称再进行下一步的处理。

    5.3、修复漏洞方针

    将重要的cookie标记为http only,这样的话javascript中的document.cookie就读取不到cookie了

    表单数据规定值,例如:年龄应只为Number类型,name只能为字母和数字组合

    过滤或移除特殊html标签,例如<script>,<iframe>等

    过滤javascript事件标签,例如'onclick','onfocus'等