Please enable Javascript to view the contents

XSS 原理、构造

 ·  ☕ 5 分钟

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

1. 名词解释

  • XSS。
    全称Cross Site Script,跨站脚本攻击。
  • XSS向量。
    通常将,一段用于XSS攻击的代码片段称之为XSS向量。比如:
1
<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向量,就可以成功注入。这部分的关键在于找到可以回显的输入点,闭合<之前的字符配对。

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

3.2 利用HTML标签属性执行XSS

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

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

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

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

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

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

3.4 对标签的属性值转码

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

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

3.5 产生自己的事件

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

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

3.6 利用CSS跨站解析

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

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

3.7 扰乱过滤规则

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

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

一个正常的XSS输入:

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

转换大小写后的XSS:

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

大小写混淆的XSS:

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

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

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

不使用引号的XSS:

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

其他:

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

4. 参考


微信公众号
作者
微信公众号