XSS简介

跨站脚本攻击(XSS)是客户端脚本安全中的头号大敌。
跨站脚本攻击,英文全称是Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet, CSS)有所区别,所以在安全领域叫做“XSS”。

XSS攻击,通常指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。在一开始,这种攻击的演示案例是跨域的,所以叫做“跨站脚本”。但是发展到今天,由于JavaScript的强大功能以及网站前端应用的复杂化,是否跨域已经不重要了。但是由于历史原因,XSS这个名字却一直保留下来。

类型

  • 反射型XSS
    反射型XSS只是简单地把用户输入的数据“反射”给浏览器。也就是说,黑客往往需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫做“非持久型XSS”(Non-persistent XSS).
  • 存储型XSS
    存储型XSS会把用户输入的数据“存储”在服务器端。这种XSS具有很强的稳定性。
    比较常见的一个场景就是,黑客写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,就会在他们的浏览器中执行这段恶意的JavaScript代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击就叫做“存储型XSS”。
    存储型XSS通常也叫做“持久型XSS”(Persistent XSS),因为从效果上来说,它存在的时间是比较长的。
  • DOM Based XSS
    实际上,这种类型的XSS并非按照“数据是否保存在服务器端”来划分,DOM Based XSS从效果上来说也是反射型XSS。单独划分出来,是因为DOM Based XSS的形成原因比较特别,发现它的安全专家专门提出了这种类型的XSS。出于历史原因,也就把它单独作为一个分类了。
    通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。

XSS Payload

XSS攻击成功后,攻击者能够对用户当前浏览的页面植入恶意脚本,通过恶意脚本,控制用户的浏览器。这些用以完成各种具体功能的恶意脚本,被称为“XSS Payload”。
XSS Payload实际上就是JavaScript脚本(还可以是Flash或富客户端的脚本),所以任何JavaScript脚本能实现的功能,XSS Payload都能做到。

常见的XSS Payload:Cookie劫持;构造GET与POST请求;XSS钓鱼;识别用户浏览器;识别用户安装的软件;CSS History Hack;获取用户的真实IP地址。

XSS攻击平台

Attack API;BeEF;XSS-Proxy

调试JavaScript

Firebug;IE 8 Developer Tools;Fiddler;Http Watch

XSS构造技巧

  • 利用字符编码
    某些字符组合起来之后会变成一个新的字符。

  • 绕过长度限制
    很多时候,产生XSS的地方会有变量的长度限制。

    1. 攻击者可以利用事件(Event)来缩短所需要的的字节数;
    2. 把XSS Payload写到别处,再通过location.hash加载这段代码;
    3. 加载远程JS;
    4. 利用注释符绕过长度限制。比如我们能控制两个文本框,第二个文本框允许写入更多的字节。此时可以利用HTML的“注释符号”,把两个文本框之间的HTML代码全部注释掉,从而“打通”两个<input>标签。
  • 使用<base>标签
    <base>标签定义了页面上所有使用“相对路径”标签的hosting地址。攻击者如果在页面中插入了<base>标签,就可以通过在远程服务器上伪造图片、链接或脚本,劫持当前页面中的所有使用“相对路径”的标签。
    所以在设计XSS安全方案时,一定要过滤掉这个非常危险的标签。

Flash XSS

在Flash中是可以嵌入ActionScript脚本的,ActionScript是一种非常强大灵活的脚本,甚至可以用它发起网络连接,因此应该尽可能地禁止用户能够上传或加载自定义的Flash脚本。应对方式:

  1. 在实现XSS Filter时,禁用<embed>、<object>等标签;
  2. 视频文件转码为“flv文件”;
  3. 如果是动态脚本的Flash,则可以通过Flash的配置参数进行限制。