XSS(Cross Site Scripting) 攻击,跨站脚本攻击,因为缩写 CSS 和层叠样式表(Cascading Style Script)冲突,所以改为 XSS。
  XSS 攻击者在 Web 页面插入恶意的脚本,当用户访问该页面时,嵌入到页面中的恶意脚本执行,从而攻击用户。

非持久型XSS(反射型XSS)

通过特定手法(如电子邮件、网站论坛发布包装链接等),诱使用户去访问一个包含恶意代码的 URL,当受害者点击该链接的时候,恶意代码就会直接在受害者主机上的浏览器执行。

原理

一个简易的假设如下,输入一个脚本得到一个脚本结果。

  1. 客户端访问指定页面(漏洞页面);
  2. 在表单(搜索框)中输入 XSS 代码(<script>alert(1)</script>),提交,即访问(http://test.com/?=<script>alert(1)</script>);
  3. 服务器收到请求,解析,并返回响应内容(含有 XSS 代码);
  4. 浏览器解析响应(解析过程中会执行 XSS 代码);
  5. alert(1) 被执行。

条件

  • 页面对特殊字符未转义

特点

  • 即时性,不进行服务器存储;
  • 需要诱使用户点击;
  • 盗取用户信息。

防御

  • 页面渲染的所有内容应该来自服务端;
  • 对特殊字符做转义处理(传向服务器的数据和服务器传来的数据);
  • 对重要的 cookie 设置 httpOnly,避免 cookie 被客户端恶意的 JS 窃取。

持久型XSS(存储型XSS)

通过特定手法(留言板),将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交 XSS 代码,而是从服务器解析之后加载出来。

原理

一个简易的假设如下,输入一个脚本存储到服务器,每次在请求指定页面时,都会直接读取解析到之前在该页面存储的 XSS 代码。

  1. 客户端访问指定页面(漏洞页面);
  2. 在表单(留言板)中输入 XSS 代码(<script>alert(1)</script>),提交;
  3. 服务器收到请求,解析,并返回响应内容(含有 XSS 代码);
  4. 浏览器解析响应(解析过程中会执行 XSS 代码);
  5. alert(1) 被执行;
  6. 再次访问该页面,浏览器自动解析留言内容;
  7. alert(1) 被执行。

条件

须同时满足以下条件。

  • 后端对前端的 POST 请求未做转义就直接入库;
  • 后端从数据库中取出的数据未做转义就直接输出给前端;
  • 前端拿到后端的数据未做转义就直接渲染成 DOM。

特点

  • 植入在数据库中;
  • 危害面广;
  • 盗取用户信息。

防御

对需要达成 XSS 的条件进行阻断。

  • 后端对前端的 POST 请求须做转义再入库;
  • 后端从数据库中取出的数据须做转义再输出给前端;
  • 前端拿到后端的数据须做转义再渲染成 DOM。

DOM-based XSS

通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。

原理

  1. 攻击者构造出特殊的URL、在其中可能包含恶意代码;
  2. 用户打开带有恶意代码的URL;
  3. 用户浏览器收到响应后解析执行。前端使用js取出url中的恶意代码并执行;
  4. 执行时,恶意代码窃取用户数据并发送到攻击者的网站中,那么攻击者网站拿到这些数据去冒充用户的行为操作。调用目标网站接口执行攻击者一些操作。

条件

存在下列任何一个就有可能触发。

  • 使用document.write直接输出数据。
  • 使用innerHTML直接输出数据。
  • 使用location、location.href、location.replace、iframe.src、document.referer、window.name等。

特点

  • 仅发生在客户端,服务器不参与。

防御

  • 前端页面对特殊字符做转义;
  • 少用满足条件的代码,尽可能做代码替换(纯文本时 innerText、textContent 比 innerHTML 更贴切)。

常见特殊字符转义表

特殊字符 转义字符
& &amp;
< &lt;
> &gt;
空格 &nbsp;
&#39;
&quot;
/ &#x2F;