Web 安全漏洞之 XSS 进击

《Web 安全漏洞之 XSS 进击》

编者说:作为JS系工程师打仗最多的破绽我想就是 XSS 破绽了,然鹅并非一切的同砚对其都有一个清楚的熟悉。本日我们请来了@卢士杰 同砚为我们分享他眼中的 XSS 破绽进击,希望能协助到人人。

什么是 XSS 进击

XSS(Cross-Site Scripting)又称跨站剧本,XSS的重点不在于跨站点,而是在于剧本的实行。XSS是一种常常出如今 Web 运用顺序中的计算机安全破绽,是由于 Web 运用顺序对用户的输入过滤不足而发生的。

罕见的 XSS 进击有三种:反射型、DOM-based 型、存储型。 个中反射型、DOM-based 型能够归类为非耐久型 XSS 进击,存储型归类为耐久型 XSS 进击。

1.反射型

反射型 XSS 平常是进击者经由历程特定手段(如电子邮件),诱运用户去接见一个包括歹意代码的 URL,当受害者点击这些特地设想的链接的时刻,歹意代码会直接在受害者主机上的阅读器实行。

关于接见者而言是一次性的,具体表如今我们把我们的歹意剧本经由历程 URL 的体式格局传递给了服务器,而服务器则只是不加处置惩罚的把剧本“反射”回接见者的阅读器而使接见者的阅读器实行响应的剧本。反射型 XSS 的触发有后端的介入,要防止反射性 XSS,必需须要后端的谐和,后端剖析前端的数据时起首做相干的字串检测和转义处置惩罚。

此类 XSS 一般出如今网站的搜刮栏、用户登录口等处所,常用来盗取客户端 Cookies 或举行垂纶诳骗。

全部进击历程约莫以下:

《Web 安全漏洞之 XSS 进击》

2.DOM-based 型

客户端的剧本顺序能够动态地搜检和修正页面内容,而不依赖于服务器端的数据。比方客户端如从 URL 中提取数据并在当地实行,假如用户在客户端输入的数据包括了歹意的 JavaScript 剧本,而这些剧本没有经由恰当的过滤和消毒,那末运用顺序就可能遭到 DOM-based XSS 进击。须要特别注意以下的用户输入源 document.URLlocation.hashlocation.searchdocument.referrer 等。

全部进击历程约莫以下:

《Web 安全漏洞之 XSS 进击》

3.存储型

进击者事先将歹意代码上传或贮存到破绽服务器中,只需受害者阅读包括此歹意代码的页面就会实行歹意代码。这就意味着只需接见了这个页面的访客,都有可能会实行这段歹意剧本,因而贮存型XSS的伤害会更大。

存储型 XSS 平常出如今网站留言、批评、博客日记等交互处,歹意剧本存储到客户端或许服务端的数据库中。

全部进击历程约莫以下:

《Web 安全漏洞之 XSS 进击》

XSS 进击的伤害

XSS 能够致使:

  1. 进击挟制接见;
  2. 盗用 cookie 完成无暗码登录;
  3. 合营 csrf 进击完成歹意要求;
  4. 运用 js 或 css 损坏页面一般的构造与款式等;

防备要领

1. XSS 防备之 HTML 编码

运用局限:将不可托数据放入到 HTML 标签内(比方div、span等)的时刻举行HTML编码。

编码划定规矩:将 & < > ” ‘ / 转义为实体字符(或许十进制、十六进制)。

示例代码:

  function encodeForHTML(str, kwargs){
    return ('' + str)
      .replace(/&/g, '&amp;')
      .replace(/</g, '&lt;')     // DEC=> &#60; HEX=> &#x3c; Entity=> &lt;
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;')
      .replace(/'/g, '&#x27;')   // &apos; 不引荐,由于它不在HTML范例中
      .replace(/\//g, '&#x2F;');
  };

HTML 有三种编码表现体式格局:十进制、十六进制、定名实体。比方小于号(<)能够编码为 “十进制> <“, “十六进制=> <“, “定名实体=> <” 三种体式格局。关于单引号(’)由于实体字符编码体式格局不在 HTML 范例中,所以此处运用了十六进制编码。

2. XSS 防备之 HTML Attribute 编码

运用局限:将不可托数据放入 HTML 属性时(不含src、href、style 和事宜处置惩罚属性),举行 HTML Attribute 编码

编码划定规矩:除了字母数字字符之外,运用 HH;(或许可用的定名实体)花样来转义ASCII值小于256一切的字符​​​​​​​

示例代码:

  function encodeForHTMLAttibute(str, kwargs){
    let encoded = '';
    for(let i = 0; i < str.length; i++) {
      let ch = hex = str[i];
      if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
        hex = '&#x' + ch.charCodeAt(0).toString(16) + ';';
      }
      encoded += hex;
    }
    return encoded;
  };

3. XSS 防备之 JavaScript 编码

作用局限:将不可托数据放入事宜处置惩罚属性、JavaScirpt值时举行 JavaScript 编码

编码划定规矩:除字母数字字符外,请运用xHH花样转义ASCII码小于256的一切字符

示例代码:

  function encodeForJavascript(str, kwargs) {
    let encoded = '';
    for(let i = 0; i < str.length; i++) {
      let cc = hex = str[i];
      if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
        hex = '\\x' + cc.charCodeAt().toString(16);
      }
      encoded += hex;
    }
    return encoded;
  };

4. XSS 防备之 URL 编码

作用局限:将不可托数据作为 URL 参数值时须要对参数举行 URL 编码

编码划定规矩:将参数值举行 encodeURIComponent 编码

示例代码:

  function encodeForURL(str, kwargs){
    return encodeURIComponent(str);
  };

5. XSS 防备之 CSS 编码

作用局限:将不可托数据作为 CSS 时举行 CSS 编码

编码划定规矩:除了字母数字字符之外,运用XXXXXX花样来转义ASCII值小于256的一切字符

示例代码:

  function encodeForCSS (attr, str, kwargs){
    let encoded = '';
    for (let i = 0; i < str.length; i++) {
      let ch = str.charAt(i);
      if (!ch.match(/[a-zA-Z0-9]/) {
        let hex = str.charCodeAt(i).toString(16);
        let pad = '000000'.substr((hex.length));
        encoded += '\\' + pad + hex;
      } else {
        encoded += ch;
      }
    }
    return encoded;
  };

跋文

在任何时刻用户的输入都是不可托的。关于 HTTP 参数,理论上都要举行考证,比方某个字段是罗列范例,其就不应当涌现罗列认为的值;关于不可托数据的输出要举行响应的编码;另外httpOnlyCSPX-XSS-ProtectionSecure Cookie 等也能够起到有用的防护。

XSS 破绽偶然比较难发明,所幸当下React、Vue等框架都从框架层面引入了 XSS 防备机制,肯定水平上解放了我们的双手。
然则作为开辟人员依旧要相识 XSS 基本知识、于细节处防止制作 XSS 破绽。框架是辅佐,我们仍需以人为本,范例开辟习气,进步 Web 前端安全意识。

参考文档

    原文作者:公子
    原文地址: https://segmentfault.com/a/1190000017057646
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞