跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。
造成XSS漏洞的原因就是,攻击者的输入没有经过严格的控制,最终显示给来访的用户,攻击者通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、个人网页内容、会话和cookie等各种内容。
XSS攻击方式通常分为三大类:
反射型XSS 存储型XSS DOM型XSS
但实际上还存在flash XSS以及一个比较新的概念mXSS,下面分别来介绍一下:
反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容)。
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。
DOM型XSS,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
flash XSS,利用网页上flash文件的缺陷来执行js脚本,一般是反射型XSS。
mXSS,又被叫做突变XSS,主要被用于绕过XSS过滤。用户所提供的富文本内容通过javascript代码进入innerHTML属性后,一些意外的变化会使得一串看似没有任何危害的HTML代码,最终将进入某个DOM节点的innerHTML中,浏览器的渲染引擎会将本来没有任何危害的HTML代码渲染成具有潜在危险的XSS攻击代码。随后,该段攻击代码可能会被JS代码中的其它一些流程输出到DOM中或是其它方式被再次渲染,从而导致XSS的执行。
XSS可以在访问了被插入XSS页面的用户的浏览器上执行js,从而进行一系列的操作。常见的攻击方式主要是利用XSS盗取用户未受httponly保护的cookie,再使用盗取的cookie登陆服务器进行操作。
XSS常与CSRF漏洞结合起来使用,可在用户不知不觉中用用户的账号进行转账,加关注等操作。CSRF漏洞参见Cross-site Request Forgery/CSRF。
其它一些少见的利用方式包括利用XSS进行DDOS,参考:SOHU视频XSS漏洞导致其用户成为DDOS肉鸡。
Dom XSS案例
存储型XSS案例
反射型XSS案例
mXSS案例
flash XSS案例
flash XSS+存储型XSS案例
XSS过滤绕过案例
心伤的瘦子@wooyun 的XSS实例教程
对XSS的防御需要根据实际情况对用户的输入进行严格的过滤。基于过滤的XSS防御方式通常可分为两种:基于黑名单的过滤和基于白名单的过滤。后者的防御效果往往更好,对于用户在白名单之外的输入,可以直接忽略。在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。
Flash XSS的修复需要对相应的flash进行修改或升级替换。
在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS时损失。
XSScrapy - 快速,彻底的XSS / SQLI蜘蛛扫描
给它一个URL,它会测试每一个环节可能会发生的跨站攻击和SQL注入漏洞。
基本使用方法:
./xsscrapy.py -u http://example.com
如果你想登录以后然后爬行:
./xsscrapy.py -u http://example.com/login_page -l loginname
XSS结果会保存在xsscrapy-vulns.txt中
依赖安装包下载:
wget -O https://bootstrap.pypa.io/get-pip.py python get-pip.py pip install -r requirements.txt
github地址:https://github.com/DanMcInerney/xsscrapy