简介

XSS全称为Cross Site Scripting,为了和CSS分开简写为XSS,中文名为跨站脚本。该漏洞发生在用户端,是指在渲染过程中发生了不在预期过程中的JavaScript代码执行。XSS通常被用于获取Cookie、以受攻击者的身份进行操作等行为。

每当应用程序的新网页中包含不受信任的、未经过恰当验证或转义的数据,或者使用可以创建JavaScript 的浏览器API 更新现有的网页时,就会出现XSS 缺陷。XSS 缺陷让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、污损网站或将用户重定向到恶意站点。

XSS攻击类型

1. 反射型 XSS

需要攻击者提前构造一个恶意链接,来诱使客户点击,

比如这样的一段链接:abc.com/?params=<script>alert(/xss/)</script>

反射型XSS是比较常见和广泛的一类,举例来说,当一个网站的代码中包含类似下面的语句:

<?php echo "<p>hello, $_GET['user']</p>";?>

那么在访问时设置 /?user=</p><script>alert("hack")</script><p> ,则可执行预设好的JavaScript代码。

反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor、NoScript等防御手段的影响较大。

2. 存储型(持久型) XSS
  • 主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
3. DOM XSS
  • 这种类型则是利用非法输入来闭合对应的html标签。

  • 比如,有这样的一个a标签:<a href='$var'></a> 当$var的内容变为 ' οnclick='alert(/xss/) // 这段代码就会被执行

  • 例如

    <html>
    <head>
    <title>DOM Based XSS Demo</title>
    <script>
    function xsstest()
    {
        var str = document.getElementById("input").value;
        document.getElementById("output").innerHTML = "<img src='"+str+"'></img>";
    }
    </script>
    </head>
    <body>
    <div id="output"></div>
    <input type="text" id="input" size=50 value="" />
    <input type="button" value="submit" onclick="xsstest()" />
    </body>
    </html>
    

    输入 x' onerror='javascript:alert(/xss/) 即可触发。

4.Blind XSS

Blind XSS是储存型XSS的一种,它保存在某些存储中,当一个“受害者”访问这个页面时执行,并且在文档对象模型(DOM)中呈现payload。 它被称为Blind的原因是因为它通常发生在通常不暴露给用户的功能上。

XSS 常见攻击方法

  1. 绕过 XSS-Filter,利用 <> 标签注入 Html/JavaScript 代码;
  2. 利用 HTML 标签的属性值进行 XSS 攻击。例如:<img src="javascript:alert('xss')"/>;(当然并不是所有的 Web 浏览器都支持 Javascript 伪协议,所以此类 XSS 攻击具有一定的局限性)
  3. 空格、回车和 Tab。如果 XSS Filter 仅仅将敏感的输入字符列入黑名单,比如 javascript,用户可以利用空格、回车和 Tab 键来绕过过滤,例如:<img src="javas cript:alert(/xss/);"/>
  4. 利用事件来执行跨站脚本。例如:<img src="#" onerror= "alert(1)"/>,当 src 错误的视乎就会执行 onerror 事件;
  5. 利用 CSS 跨站。例如:body {backgrund-image: url("javascript:alert('xss')")}
  6. 扰乱过滤规则。例如:<IMG SRC="javaSCript: alert(/xss/);"/>
  7. 利用字符编码,通过这种技巧,不仅能让 XSS 代码绕过服务端的过滤,还能更好地隐藏 Shellcode;( JS 支持 unicode、eacapes、十六进制、十进制等编码形式);
  8. 拆分跨站法,将 XSS 攻击的代码拆分开来,适用于应用程序没有过滤 XSS 关键字符(如<、>)却对输入字符长度有限制的情况下;
  9. DOM 型的 XSS 主要是由客户端的脚本通过 DOM 动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。容易导致 DOM 型的 XSS 的输入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、Document.referrer、Window.name、Document.cookie、localStorage/globalStorage;

防御

对输入内容的特定字符进行编码
为了避免反射式或存储式的XSS漏洞,最好的办法是根据HTML输出的上下文(包括:主体、属性、JavaScript、CSS或URL)对所有不可信的HTTP请求数据进行恰当的转义
Http Only cookie , 许多 XSS 攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 http only,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie,这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。