关于XSS

参考 www.jianshu.com/p/2d9da4490…javascript

简述

XSS攻击一般指的是经过利用网页开发时留下的漏洞,经过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序一般是JavaScript,但实际上也能够包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能获得包括但不限于更高的权限(如执行一些操做)、私密网页内容、会话和cookie等各类内容。java

原理

HTML是一种超文本标记语言,经过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看做是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。因此,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。express

防范

<input type="text" value="<%= escapeHTML(getParameter("keyword")) %>">
<button>搜索</button>
<div>
  您搜索的关键词是:<%= escapeHTML(getParameter("keyword")) %>
</div>
复制代码

通过了转义函数的处理后,最终浏览器接收到的响应为:浏览器

<input type="text" value="&quot;&gt;&lt;script&gt;alert(&#x27;XSS&#x27;);&lt;&#x2F;script&gt;">
<button>搜索</button>
<div>
  您搜索的关键词是:&quot;&gt;&lt;script&gt;alert(&#x27;XSS&#x27;);&lt;&#x2F;script&gt;
</div>
复制代码

注意特殊的 HTML 属性、JavaScript API

<a href="<%= escapeHTML(getParameter("redirect_to")) %>">跳转...</a>
复制代码

这段代码,当攻击 URL 为http://xxx/?redirect_to=javascript:alert('XSS'),服务端响应就成了:安全

<a href="javascript:alert(&#x27;XSS&#x27;)">跳转...</a>
复制代码

虽然代码不会当即执行,但一旦用户点击 a 标签时,浏览器会就会弹出“XSS”。bash

解决

// 根据项目状况进行过滤,禁止掉 "javascript:" 连接、非法 scheme 等
allowSchemes = ["http", "https"];

valid = isValid(getParameter("redirect_to"), allowSchemes);

if (valid) {
  <a href="<%= escapeHTML(getParameter("redirect_to"))%>">
    跳转...
  </a>
} else {
  <a href="/404">
    跳转...
  </a>
}
复制代码
  • 作了 HTML 转义,并不等于高枕无忧。
  • 对于连接跳转,如 <a href="xxx" 或 location.href="xxx",要检验其内容,禁止以 javascript: 开头的连接,和其余非法的 scheme。

根据上下文采用不一样的转义规则

把一个数据经过 JSON 的方式内联到 HTML 中:cookie

<script>
var initData = <%= data.toJSON() %>
</script>
复制代码

插入 JSON 的地方不能使用 escapeHTML(),由于转义 " 后,JSON 格式会被破坏。 但安全组又发现有漏洞,原来这样内联 JSON 也是不安全的:函数

  • 当 JSON 中包含 U+2028 或 U+2029 这两个字符时,不能做为 JavaScript 的字面量使用,不然会抛出语法错误。
  • 当 JSON 中包含字符串 时,当前的 script 标签将会被闭合,后面的字符串内容浏览器会按照 HTML 进行解析;经过增长下一个 <script> 标签等方法就能够完成注入。

因而咱们又要实现一个 escapeEmbedJSON() 函数,对内联 JSON 进行转义。 转义规则以下:ui

修复后的代码以下:url

<script>
var initData = <%= escapeEmbedJSON(data.toJSON()) %>
复制代码
  • HTML 转义是很是复杂的,在不一样的状况下要采用不一样的转义规则。若是采用了错误的转义规则,颇有可能会埋下 XSS 隐患。
  • 应当尽可能避免本身写转义库,而应当采用成熟的、业界通用的转义库。

总结

  • 在 HTML 中内嵌的文本中,恶意内容以 script 标签造成注入。
  • 在内联的 JavaScript中,拼接的数据突破了本来的限制(字符串,变量,方法名等)。
  • 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其余属性或者标签。
  • 在标签的 href、src 等属性中,包含 javascript: 等可执行代码。
  • 在 onload、onerror、onclick 等事件中,注入不受控制代码。
  • 在 style 属性和标签中,包含相似 background-image:url("javascript:..."); 的代码(新版本浏览器已经能够防范)。
  • 在 style 属性和标签中,包含相似 expression(...) 的 CSS 表达式代码(新版本浏览器已经能够防范)。

总之,若是开发者没有将用户输入的文本进行合适的过滤,就贸然插入到 HTML 中,这很容易形成注入漏洞。攻击者能够利用漏洞,构造出恶意的代码指令,进而利用恶意代码危害数据安全。

插入 JSON 的地方不能使用 escapeHTML(),由于转义 " 后,JSON 格式会被破坏。 但安全组又发现有漏洞,原来这样内联 JSON 也是不安全的:

当 JSON 中包含 U+2028 或 U+2029 这两个字符时,不能做为 JavaScript 的字面量使用,不然会抛出语法错误。 当 JSON 中包含字符串 时,当前的 script 标签将会被闭合,后面的字符串内容浏览器会按照 HTML 进行解析;经过增长下一个

相关文章
相关标签/搜索