目录

    XSS是一种在前端执行JavaScript脚本的攻击方式。随着UGC站点的流行,用户产生数据剧增,数据块的网络连接越来越有利于XSS的实施与传播。XSS带来的危害有:窃取用户cookies,窃取个人信息;劫持会话,操纵用户网络数据;发起ddos攻击; 篡改页面、弹出广告等。

    1. 名词解释

    • XSS。 全称Cross Site Script,跨站脚本攻击。
    • XSS向量。 通常将,一段用于XSS攻击的代码片段称之为XSS向量。比如:
    <script>alert(/This is a xss test!/)</script>
    
    • XSS Filter。 即跨站脚本过滤器。用于分析用户输入和提交的数据,消除潜在的XSS、恶意的HTML或简单的HTML格式错误。一般,XSS Filter是基于黑白名单的安全过滤策略实施的。比如,仅允许特定的输入字符,或仅阻止特定的输入字符。

    2. XSS原理

    所有来自COOKIE、POST表单、GET请求、HTTP头的内容都可能是XSS攻击的入口。 下面以窃取cookie为例,描述XSS的攻击链路。

    2.1 反射型XSS

    反射型XSS是一种最常见的XSS方式。XSS向量,通常附加在URL中,诱导用户点击。

    攻击链路:

    1. 攻击者精心构造一个包含恶意字符串的 URL,将其发送给受害者
    2. 攻击者欺骗受害者,使其访问该 URL
    3. 网站在响应中包含了来自 URL 的恶意字符串
    4. 受害者浏览器执行了响应中的恶意字符串,将自己的 cookie 发送到了攻击者的服务器

    2.2 存储型XSS

    存储型XSS是一种危害很大的XSS方式。通过表单等输入,提交XSS向量,存入数据库。在信息的输出页面,执行XSS向量。在UGC站点,存储型XSS传播速度很快,如果不及时制止,会产生很大影响。

    攻击链路:

    1. 攻击者利用网站的表单插入恶意字符串到网站数据库
    2. 受害者请求网站页面
    3. 网站在响应中包含来自数据库的恶意字符串,并返回给受害者
    4. 受害者的浏览器执行了响应中的恶意字符串,将受害者的 cookie 发送到了攻击者的服务器

    2.3 DOM Based XSS

    DOM Based XSS,是通过修改受害者浏览器中的DOM环境,来执行攻击的。也就是说,页面响应不会更改,但是由于DOM环境中发生的恶意修改,页面中攻击脚本能够被执行。

    攻击链路:

    1. 攻击者构造一个包含恶意字符串的 URL,将其发送给受害者。
    2. 攻击者欺骗受害者,使其访问了该 URL
    3. 网站接收到响应,但是响应中并不包含恶意字符串
    4. 受害者浏览器执行响应中合法的 JavaScript,导致恶意代码插入到了页面中
    5. 受害者浏览器执行插入到页面中的恶意代码,将 cookie 发送到了攻击者的服务器

    2.4 MXSS

    突变XSS,浏览器的解析引擎将一段没有威胁的代码渲染成具有威胁的XSS攻击代码,攻击代码可能被js或是其他流程输出到DOM中或是在其他地方被再次渲染导致XSS的执行。这种XSS利用方式具有很强的攻击性。

    攻击链路:

    1. 攻击者精心构造一个包含非敏感字符串的URL,将其发送给受害者
    2. 攻击者欺骗受害者,使其访问该 URL
    3. 网站在响应中包含了来自URL的字符串
    4. 浏览器将响应中的非敏感字符串,渲染成可执行的XSS攻击代码。
    5. 受害者浏览器执行了响应中的恶意字符串,将自己的 cookie 发送到了攻击者的服务器

    2.5 UXSS

    浏览器通用型XSS,利用浏览器或浏览器插件漏洞来构造XSS。不同于其他XSS方式,只能获取同源(同协议、同域名、同端口)信息。UXSS能够对没有漏洞的页面发起攻击。

    3. XSS构造方式

    这里列出了七种方法:

    3.1 利用<>标记注入HTML/JavaScript

    如果能够引入<>标记,可以直接构造JavaScript编写的XSS向量,就可以成功注入。这部分的关键在于找到可以回显的输入点,闭合<之前的字符配对。

    <script>alert(/XSS/)</script>
    

    3.2 利用HTML标签属性执行XSS

    很多HTML标记的属性都支持JavaScript:[code] 伪协议,这类特殊的协议由JavaScript的解释器运行,所以用户可以利用部分HTML标记的属性进行XSS。如下面的代码:

    <img src = "javascript:alert(/XSS1/);">
    <table background = "javascript:alert(/XSS2/)"></table>
    

    但并不是所有浏览器支持伪协议。

    3.3 利用空格、回车、Tab等分隔符

    由于通常XSS Filter采取的黑名单策略,不一定将全部分隔符列为敏感字符。JavaScript语法中以下三种方式都能编写合法的语句:

    • 如果JavaScript引擎确定一个句子完成,而行尾有换行符,那么分号可以省略。
    • 如果一行中有多个句子,那么每句都得用分号结束。
    • 额外的空白无论以何种方式添加都可以,在构成一个完整的语句或遇到分号之前不会结束。 这里就是利用了第三条,拆分敏感字符,绕过XSS Filter
    <img src = "javas
    cript:
    alert(/XSS/)" width = "100">
    

    3.4 对标签的属性值转码

    Web系统对于普通HTML标记的属性进行过滤,还可以通过编码处理来绕过。因为HTML中属性本身支持ASCII码形式。

    <img src = "javascript:alert(/XSS/);">
    替换成
    <img src = "javascrip&#116&#58alert(/XSS/);">
    

    3.5 产生自己的事件

    JavaScript与HTML之间的交互是通过事件来实现的,比如click、mouseover等动作触发事件处理函数执行。事件可以让javaScript执行,当然也可以用来执行XSS脚本。

    <img src = "#" onerror = alert(/XSS/)>
    

    3.6 利用CSS跨站解析

    XSS跨站脚本的另一个载体是CSS样式表,使用CSS样式表执行JavaScript具有隐蔽、灵活多变等特点,但是有一个很大的缺点是:各浏览器之间不能通用,甚至同一浏览器的不同版本之间都不能通用。使用CSS直接执行JavaScript代码的示例如下:

    <div style="background-image: url(javascript:alert('XSS'))">
    

    3.7 扰乱过滤规则

    利用前面叙述的各种技巧,包括HTML标签属性值、事件、CSS、编码技术等,攻击者能顺利绕过XSS Filter的重重过滤。

    但是,开发者在开发过程中,可能也已经考虑到各种触发XSS的情况,让系统变得更加牢固安全。但是攻击者的手段是多种多样的,看看这些示例:

    一个正常的XSS输入:

    <img src = "javascript:alert(1);">
    

    转换大小写后的XSS:

    <IMG SRC = "javascript:alert(1);">
    

    大小写混淆的XSS:

    <ImG SRc = "jAVasCRIpT:AlerT(1);">
    

    不用双引号,而是使用单引号的XSS:

    <img src='javascript:alert(0):'>
    

    不使用引号的XSS:

    <img src=javascript:alert(0);>
    

    其他:

    <img/src="javascript:alert('XSS');">
    

    4. 参考