XSS是一种在前端执行JavaScript脚本的攻击方式。随着UGC站点的流行,用户产生数据剧增,数据块的网络连接越来越有利于XSS的实施与传播。XSS带来的危害有:窃取用户cookies,窃取个人信息;劫持会话,操纵用户网络数据;发起ddos攻击; 篡改页面、弹出广告等。
1. 名词解释
- XSS。
全称Cross Site Script,跨站脚本攻击。 - XSS向量。
通常将,一段用于XSS攻击的代码片段称之为XSS向量。比如:
|
|
- XSS Filter。
即跨站脚本过滤器。用于分析用户输入和提交的数据,消除潜在的XSS、恶意的HTML或简单的HTML格式错误。一般,XSS Filter是基于黑白名单的安全过滤策略实施的。比如,仅允许特定的输入字符,或仅阻止特定的输入字符。
2. XSS原理
所有来自COOKIE、POST表单、GET请求、HTTP头的内容都可能是XSS攻击的入口。
下面以窃取cookie为例,描述XSS的攻击链路。
2.1 反射型XSS
反射型XSS是一种最常见的XSS方式。XSS向量,通常附加在URL中,诱导用户点击。
攻击链路:
- 攻击者精心构造一个包含恶意字符串的 URL,将其发送给受害者
- 攻击者欺骗受害者,使其访问该 URL
- 网站在响应中包含了来自 URL 的恶意字符串
- 受害者浏览器执行了响应中的恶意字符串,将自己的 cookie 发送到了攻击者的服务器
2.2 存储型XSS
存储型XSS是一种危害很大的XSS方式。通过表单等输入,提交XSS向量,存入数据库。在信息的输出页面,执行XSS向量。在UGC站点,存储型XSS传播速度很快,如果不及时制止,会产生很大影响。
攻击链路:
- 攻击者利用网站的表单插入恶意字符串到网站数据库
- 受害者请求网站页面
- 网站在响应中包含来自数据库的恶意字符串,并返回给受害者
- 受害者的浏览器执行了响应中的恶意字符串,将受害者的 cookie 发送到了攻击者的服务器
2.3 DOM Based XSS
DOM Based XSS,是通过修改受害者浏览器中的DOM环境,来执行攻击的。也就是说,页面响应不会更改,但是由于DOM环境中发生的恶意修改,页面中攻击脚本能够被执行。
攻击链路:
- 攻击者构造一个包含恶意字符串的 URL,将其发送给受害者。
- 攻击者欺骗受害者,使其访问了该 URL
- 网站接收到响应,但是响应中并不包含恶意字符串
- 受害者浏览器执行响应中合法的 JavaScript,导致恶意代码插入到了页面中
- 受害者浏览器执行插入到页面中的恶意代码,将 cookie 发送到了攻击者的服务器
2.4 MXSS
突变XSS,浏览器的解析引擎将一段没有威胁的代码渲染成具有威胁的XSS攻击代码,攻击代码可能被js或是其他流程输出到DOM中或是在其他地方被再次渲染导致XSS的执行。这种XSS利用方式具有很强的攻击性。
攻击链路:
- 攻击者精心构造一个包含非敏感字符串的URL,将其发送给受害者
- 攻击者欺骗受害者,使其访问该 URL
- 网站在响应中包含了来自URL的字符串
- 浏览器将响应中的非敏感字符串,渲染成可执行的XSS攻击代码。
- 受害者浏览器执行了响应中的恶意字符串,将自己的 cookie 发送到了攻击者的服务器
2.5 UXSS
浏览器通用型XSS,利用浏览器或浏览器插件漏洞来构造XSS。不同于其他XSS方式,只能获取同源(同协议、同域名、同端口)信息。UXSS能够对没有漏洞的页面发起攻击。
3. XSS构造方式
这里列出了七种方法:
3.1 利用<>标记注入HTML/JavaScript
如果能够引入<>标记,可以直接构造JavaScript编写的XSS向量,就可以成功注入。这部分的关键在于找到可以回显的输入点,闭合<之前的字符配对。
|
|
3.2 利用HTML标签属性执行XSS
很多HTML标记的属性都支持JavaScript:[code] 伪协议,这类特殊的协议由JavaScript的解释器运行,所以用户可以利用部分HTML标记的属性进行XSS。如下面的代码:
|
|
但并不是所有浏览器支持伪协议。
3.3 利用空格、回车、Tab等分隔符
由于通常XSS Filter采取的黑名单策略,不一定将全部分隔符列为敏感字符。JavaScript语法中以下三种方式都能编写合法的语句:
- 如果JavaScript引擎确定一个句子完成,而行尾有换行符,那么分号可以省略。
- 如果一行中有多个句子,那么每句都得用分号结束。
- 额外的空白无论以何种方式添加都可以,在构成一个完整的语句或遇到分号之前不会结束。
这里就是利用了第三条,拆分敏感字符,绕过XSS Filter
|
|
3.4 对标签的属性值转码
Web系统对于普通HTML标记的属性进行过滤,还可以通过编码处理来绕过。因为HTML中属性本身支持ASCII码形式。
|
|
3.5 产生自己的事件
JavaScript与HTML之间的交互是通过事件来实现的,比如click、mouseover等动作触发事件处理函数执行。事件可以让javaScript执行,当然也可以用来执行XSS脚本。
|
|
3.6 利用CSS跨站解析
XSS跨站脚本的另一个载体是CSS样式表,使用CSS样式表执行JavaScript具有隐蔽、灵活多变等特点,但是有一个很大的缺点是:各浏览器之间不能通用,甚至同一浏览器的不同版本之间都不能通用。使用CSS直接执行JavaScript代码的示例如下:
|
|
3.7 扰乱过滤规则
利用前面叙述的各种技巧,包括HTML标签属性值、事件、CSS、编码技术等,攻击者能顺利绕过XSS Filter的重重过滤。
但是,开发者在开发过程中,可能也已经考虑到各种触发XSS的情况,让系统变得更加牢固安全。但是攻击者的手段是多种多样的,看看这些示例:
一个正常的XSS输入:
|
|
转换大小写后的XSS:
|
|
大小写混淆的XSS:
|
|
不用双引号,而是使用单引号的XSS:
|
|
不使用引号的XSS:
|
|
其他:
|
|