概念

跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。

攻击原理

跨站脚本攻击(XSS) - 图1

危害

  • 偷取网站任意数据
  • 偷取用户资料
  • 劫持前端逻辑
  • 显示伪造的文章或者图片

攻击分类

1. 反射型

反射型指的是 url 参数直接注入。比如:在浏览器地址栏中

  1. localhost:1521?from=<script>alert(1)</script>Bai

2. 存储型

存储到数据库后读取时注入。

一个攻击者在论坛的楼层中包含了一段 JavaScript 代码,并且服务器没有正确进行过滤,那就会造在浏览这个页面时会执行这段 JavaScript 代码。

XSS 攻击注入点

1. HTML 节点内容

  1. <div>
  2. #{content}
  3. </div>

注入点:

  1. <div>
  2. <script>
  3. </script>
  4. </div>

2. HTML 属性

  1. <img src="#{image}"/>

注入点:

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

其中 1” onerror=”alert(1) 就是 #{image} 。这里可看出 <img>多了一个属性 onerror。

3. JavaScript 代码

  1. <script>
  2. var data="#{data}";
  3. </script>

注入点:

  1. <script>
  2. var data="hello";alert(1);"";
  3. </script>

其中 hello”;alert(1);” 就是 #{data}。这里可看出实际上是即为 data 赋值,也进行了 alert 操作。

4. 富文本

富文本需要保留 HTML,但 HTML 存在 XSS 攻击风险。

防御

浏览器自带防御

使用浏览器自带防御可防御一些 XSS。但是存在一些不足:

  • 只能对参数出现在 HMTL 内容或属性的反射型 XSS 进行防御
  • 并不是所有浏览器都支持对 XSS 的防御

HTML 内容

  1. <div>
  2. <script>
  3. </script>
  4. </div>

解决:

  • < 转义为 &lt;
  • > 转义为 &gt;

转义后:

  1. &lt;div&gt;
  2. &lt;script&gt;
  3. &lt;/script&gt;
  4. &lt;/div&gt;

HTML 属性

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

解决:

  • "转义为 &quto;
  • '转义为 &apos;
  • 将空格转义为 &#32;

转义后:

  1. <img src="1&quto; onerror=&quto;alert(1)"/>

JavaScript 代码

  1. <script>
  2. var data="hello";alert(1);"";
  3. </script>

解决:

  • "转义为 \"
  • \转义为 \\
  • 或者转化为 json

转义后:

  1. <script>
  2. var data="hello\";alert(1);\"";
  3. </script>

富文本

白名单保留部分标签和属性。

CSP

内容安全策略(Content Security Policy):用于指定那些内容可执行。