Abstract:
 
jsmind.js 中的方法 onreadystatechange() 向第 781 行的 Web 浏览器发送非法数据,从而导致浏览器执行恶意代码。
 
 
Explanation:
 
Cross-Site Scripting (XSS) 漏洞在以下情况下发生:
 
1. 数据通过一个不可信赖的数据源进入 Web 应用程序。对于基于 DOM 的 XSS,将从 URL 参数或浏览器中的其他值读取数据,并使用客户端代码将其重新写入该页面。对于 Reflected XSS,不可信赖的源通常为 Web 请求,而对于 Persisted(也称为 Stored)XSS,该源通常为数据库或其他后端数据存储。
 
 
2. 未检验包含在动态内容中的数据,便将其传送给了 Web 用户。对于基于 DOM 的 XSS,任何时候当受害人的浏览器解析 HTML 页面时,恶意内容都将作为 DOM(文档对象模型)创建的一部分执行。
 
传送到 Web 浏览器的恶意内容通常采用 JavaScript 代码片段的形式,但也可能会包含一些 HTML、Flash 或者其他任意一种可以被浏览器执行的代码。基于 XSS 的攻击手段花样百出,几乎是无穷无尽的,但通常它们都会包含传输给攻击者的私人数据(如 Cookie 或者其他会话信息)。在攻击者的控制下,指引受害者进入恶意的网络内容;或者利用易受攻击的站点,对用户的机器进行其他恶意操作。
 
例 1:下面的 JavaScript 代码片段可从 URL 中读取雇员 ID eid,并将其显示给用户。
 
 
<SCRIPT>
var pos=document.URL.indexOf("eid=")+4;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
 
 
 
示例 2:考虑使用 HTML 表单:
 
 
  <div id="myDiv">
    Employee ID: <input type="text" id="eid"><br>
    ...
    <button>Show results</button>
  </div>
  <div id="resultsDiv">
    ...
  </div>
 
 
下面的 jQuery 代码片段可从表单中读取雇员 ID,并将其显示给用户。
 
 
  $(document).ready(function(){
    $("#myDiv").on("click", "button", function(){
      var eid = $("#eid").val();
      $("resultsDiv").append(eid);
      ...
    });
  });
 
 
如果雇员 ID eid 只包含标准的字母数字文本,此代码就会正常运行。如果 eid 里有包含元字符或源代码中的值,那么 Web 浏览器就会像显示 HTTP 响应那样执行代码。
 
起初,这个例子似乎是不会轻易遭受攻击的。毕竟,有谁会输入导致恶意代码的 URL,并且还在自己的电脑上运行呢?真正的危险在于攻击者会创建恶意的 URL,然后采用电子邮件或者社会工程的欺骗手段诱使受害者访问此 URL 的链接。当受害者单击这个链接时,他们不知不觉地通过易受攻击的网络应用程序,将恶意内容带到了自己的电脑中。这种对易受攻击的 Web 应用程序进行盗取的机制通常被称为反射式 XSS。
 
 
正如例子中所显示的,XSS 漏洞是由于 HTTP 响应中包含了未验证的数据代码而引起的。受害者遭受 XSS 攻击的途径有三种:
 
— 系统从 HTTP 请求中直接读取数据,并在 HTTP 响应中返回数据。当攻击者诱使用户为易受攻击的 Web 应用程序提供危险内容,而这些危险内容随后会反馈给用户并在 Web 浏览器中执行,就会发生反射式 XSS 盗取。发送恶意内容最常用的方法是,把恶意内容作为一个参数包含在公开发表的 URL 中,或者通过电子邮件直接发送给受害者。以这种手段构造的 URL 构成了多种“网络钓鱼”(phishing) 阴谋的核心,攻击者借此诱骗受害者访问指向易受攻击站点的 URL。站点将攻击者的内容反馈给受害者以后,便会执行这些内容,接下来会把用户计算机中的各种私密信息(比如包含会话信息的 cookie)传送给攻击者,或者执行其他恶意活动。
 
— 应用程序将危险数据存储在数据库或其他可信赖的数据存储器中。这些危险数据随后会被回写到应用程序中,并包含在动态内容中。Persistent XSS 盗取发生在如下情况:攻击者将危险内容注入到数据存储器中,且该存储器之后会被读取并包含在动态内容中。从攻击者的角度看,注入恶意内容的最佳位置莫过于一个面向许多用户,尤其是相关用户显示的区域。相关用户通常在应用程序中具备较高的特权,或相互之间交换敏感数据,这些数据对攻击者来说有利用价值。如果某一个用户执行了恶意内容,攻击者就有可能以该用户的名义执行某些需要特权的操作,或者获得该用户个人所有的敏感数据的访问权限。
 
— 应用程序之外的数据源将危险数据储存在一个数据库或其他数据存储器中,随后这些危险数据被当作可信赖的数据回写到应用程序中,并储存在动态内容中。
 
 
 
Instance ID: 069BCA4EE68E819122DC50C9D7E3077E
 
Priority Metadata Values:
 
            IMPACT: 5.0
 
            LIKELIHOOD: 5.0
 
Legacy Priority Metadata Values:
 
            SEVERITY: 4.0
 
            CONFIDENCE: 5.0
 
 
Remediation Effort: 1.0
 
 


 
 
Recommendations:
 
针对 XSS 的解决方法是,确保在适当位置进行验证,并检验其属性是否正确。
 
由于 XSS 漏洞出现在应用程序的输出中包含恶意数据时,因此,合乎逻辑的做法是在数据流出应用程序的前一刻对其进行验证。然而,由于 Web 应用程序常常会包含复杂而难以理解的代码,用以生成动态内容,因此,这一方法容易产生遗漏错误(遗漏验证)。降低这一风险的有效途径是对 XSS 也执行输入验证。
 
由于 Web 应用程序必须验证输入信息以避免其他漏洞(如 SQL Injection),因此,一种相对简单的解决方法是,加强一个应用程序现有的输入验证机制,将 XSS 检测包括其中。尽管有一定的价值,但 XSS 输入验证并不能取代严格的输出验证。应用程序可能通过共享的数据存储或其他可信赖的数据源接受输入,而该数据存储所接受的输入源可能并未执行适当的输入验证。因此,应用程序不能间接地依赖于该数据或其他任意数据的安全性。这就意味着,避免 XSS 漏洞的最佳方法是验证所有进入应用程序以及由应用程序传送至用户端的数据。
 
针对 XSS 漏洞进行验证最安全的方式是,创建一份安全字符白名单,允许其中的字符出现在 HTTP 内容中,并且只接受完全由这些经认可的字符组成的输入。例如,有效的用户名可能仅包含字母数字字符,电话号码可能仅包含 0-9 的数字。然而,这种解决方法在 Web 应用程序中通常是行不通的,因为许多字符对浏览器来说都具有特殊的含义,在写入代码时,这些字符仍应被视为合法的输入,比如一个 Web 设计版就必须接受带有 HTML 代码片段的输入。
 
更灵活的解决方法称为黑名单方法,但其安全性较差,这种方法在进行输入之前就有选择地拒绝或避免了潜在的危险字符。为了创建这样一个列表,首先需要了解对于 Web 浏览器具有特殊含义的字符集。虽然 HTML 标准定义了哪些字符具有特殊含义,但是许多 Web 浏览器会设法更正 HTML 中的常见错误,并可能在特定的上下文中认为其他字符具有特殊含义,这就是我们不鼓励使用黑名单作为阻止 XSS 的方法的原因。卡耐基梅隆大学 (Carnegie Mellon University) 软件工程学院 (Software Engineering Institute) 下属的 CERT(R) (CERT(R) Coordination Center) 合作中心提供了有关各种上下文中认定的特殊字符的具体信息 [1]:
 
在有关块级别元素的内容中(位于一段文本的中间):
 
- "<" 是一个特殊字符,因为它可以引入一个标签。
 
- "&" 是一个特殊字符,因为它可以引入一个字符实体。
 
- ">" 是一个特殊字符,之所以某些浏览器将其认定为特殊字符,是基于一种假设,即该页的作者本想在前面添加一个 "<",却错误地将其遗漏了。
 
下面的这些原则适用于属性值:
 
- 对于外加双引号的属性值,双引号是特殊字符,因为它们标记了该属性值的结束。
 
- 对于外加单引号的属性值,单引号是特殊字符,因为它们标记了该属性值的结束。
 
- 对于不带任何引号的属性值,空格字符(如空格符和制表符)是特殊字符。
 
- "&" 与某些特定变量一起使用时是特殊字符,因为它引入了一个字符实体。
 
例如,在 URL 中,搜索引擎可能会在结果页面内提供一个链接,用户可以点击该链接来重新运行搜索。可以将这一方法运用于编写 URL 中的搜索查询语句,这将引入更多特殊字符:
 
- 空格符、制表符和换行符是特殊字符,因为它们标记了 URL 的结束。
 
- "&" 是特殊字符,因为它可引入一个字符实体或分隔 CGI 参数。
 
- 非 ASCII 字符(即 ISO-8859-1 编码表中所有高于 128 的字符)不允许出现在 URL 中,因此在此上下文中也被视为特殊字符。
 
- 在服务器端对在 HTTP 转义序列中编码的参数进行解码时,必须过滤掉输入中的 "%" 符号。例如,当输入中出现 "%68%65%6C%6C%6F" 时,只有从输入的内容中过滤掉 "%",上述字符串才能在网页上显示为 "hello"。
 
 
在 <SCRIPT> </SCRIPT> 的正文内:
 
- 如果可以将文本直接插入到已有的脚本标签中,应该过滤掉分号、省略号、中括号和换行符。
 
服务器端脚本:
 
- 如果服务器端脚本会将输入中的感叹号 (!) 转换成输出中的双引号 ("),则可能需要对此进行更多过滤。
 
其他可能出现的情况:
 
- 如果攻击者在 UTF-7 中提交了一个请求,那么特殊字符 "<" 可能会显示为 "+ADw-",并可能会绕过过滤。如果输出包含在没有确切定义编码格式的网页中,有些浏览器就会设法根据内容自动识别编码(此处采用 UTF-7 格式)。
 
一旦在应用程序中确定了针对 XSS 攻击执行验证的正确要点,以及验证过程中要考虑的特殊字符,下一个难点就是定义验证过程中处理各种特殊字符的方式。如果应用程序认定某些特殊字符为无效输入,那么您可以拒绝任何带有这些无效特殊字符的输入。第二种选择就是采用过滤手段来删除这些特殊字符。然而,过滤的负面作用在于,过滤内容的显示将发生改变。在需要完整显示输入内容的情况下,过滤的这种负面作用可能是无法接受的。
 
如果必须接受带有特殊字符的输入,并将其准确地显示出来,验证机制一定要对所有特殊字符进行编码,以便删除其具有的含义。官方的 HTML 规范 [2] 提供了特殊字符对应的 ISO 8859-1 编码值的完整列表。
 
许多应用程序服务器都试图避免应用程序出现 Cross-Site Scripting 漏洞,具体做法是为负责设置特定 HTTP 响应内容的函数提供各种实现方式,以检验是否存在进行 Cross-Site Scripting 攻击必需的字符。不要依赖运行应用程序的服务器,以此确保该应用程序的安全。开发了某个应用程序后,并不能保证在其生命周期中它会在哪些应用程序服务器中运行。由于标准和已知盗取方式的演变,我们不能保证应用程序服务器也会保持同步。
 
 
Tips:
 
1. HPE Security 安全编码规则包将就 SQL Injection 和 Access Control 提出警告:当把不可信赖的数据写入数据库时,数据库将出现问题,并且会将数据库当作不可信赖的数据的来源,这会导致 XSS 漏洞。如果数据库在您的环境中是可信赖的资源,则使用自定义筛选器筛选出包含 DATABASE 污染标志或来自数据库源的数据流问题。尽管如此,对所有从数据库中读取的内容进行验证仍然是较好的做法。
 
2. 虽然使用 URL 对不可信数据进行编码可以防止许多 XSS 攻击,但部分浏览器(尤其是 Internet Explorer 6 和 7 以及其他浏览器)在将数据传递给 JavaScript 解释器之前,会自动在文档对象模型 (DOM) 中的特定位置对其内容进行解码。为了反映出其危险之处,规则包不再认为 URL 编码例程足以防御 cross-site scripting 攻击。如果对数据值进行 URL 编码并随后输出,HPE Security Fortify 将会报告存在 Cross-Site Scripting: Poor Validation 漏洞。
 
 
 
References:
 
[1] Understanding Malicious Content Mitigation for Web Developers, CERT, http://www.cert.org/tech_tips/malicious_code_mitigation.html#9
 
 
[3] Standards Mapping - Common Weakness Enumeration, CWE ID 79, CWE ID 80
 
[4] Standards Mapping - FIPS200, SI
 
[5] Standards Mapping - NIST Special Publication 800-53 Revision 4, SI-10 Information Input Validation (P1)
 
[6] Standards Mapping - OWASP Mobile Top 10 Risks 2014, M7 Client Side Injection
 
[7] Standards Mapping - OWASP Top 10 2004, A4 Cross Site Scripting
 
[8] Standards Mapping - OWASP Top 10 2007, A1 Cross Site Scripting (XSS)
 
[9] Standards Mapping - OWASP Top 10 2010, A2 Cross-Site Scripting (XSS)
 
[10] Standards Mapping - OWASP Top 10 2013, A3 Cross-Site Scripting (XSS)
 
[11] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1, Requirement 6.5.4
 
[12] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2, Requirement 6.3.1.1, Requirement 6.5.1
 
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0, Requirement 6.5.7
 
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0, Requirement 6.5.7
 
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1, Requirement 6.5.7
 
[16] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2, Requirement 6.5.7
 
[17] Standards Mapping - SANS Top 25 2009, Insecure Interaction - CWE ID 079
 
[18] Standards Mapping - SANS Top 25 2010, Insecure Interaction - CWE ID 079
 
[19] Standards Mapping - SANS Top 25 2011, Insecure Interaction - CWE ID 079
 
[20] Standards Mapping - Security Technical Implementation Guide Version 3.1, APP3510 CAT I, APP3580 CAT I
 
[21] Standards Mapping - Security Technical Implementation Guide Version 3.10, APP3510 CAT I, APP3580 CAT I
 
[22] Standards Mapping - Security Technical Implementation Guide Version 3.4, APP3510 CAT I, APP3580 CAT I
 
[23] Standards Mapping - Security Technical Implementation Guide Version 3.5, APP3510 CAT I, APP3580 CAT I
 
[24] Standards Mapping - Security Technical Implementation Guide Version 3.6, APP3510 CAT I, APP3580 CAT I
 
[25] Standards Mapping - Security Technical Implementation Guide Version 3.7, APP3510 CAT I, APP3580 CAT I
 
[26] Standards Mapping - Security Technical Implementation Guide Version 3.9, APP3510 CAT I, APP3580 CAT I
 
[27] Standards Mapping - Security Technical Implementation Guide Version 4.1, APSC-DV-002490 CAT I, APSC-DV-002560 CAT I
 
[28] Standards Mapping - Web Application Security Consortium 24 + 2, Cross-Site Scripting
 
[29] Standards Mapping - Web Application Security Consortium Version 2.00, Cross-Site Scripting (WASC-08)
 
 
 

Cross-Site Scripting:DOM 跨站点脚本:DOM的更多相关文章

  1. Cross-Site Scripting:Reflected 跨站点脚本:获取

  2. Cross-Site Scripting:Persistent 跨站点脚本:持久性

  3. 跨站点脚本编制实例(AppScan扫描结果)

    最近工作要求解决下web的项目的漏洞问题,扫描漏洞是用的AppScan工具,其中有很多是关于跨站点脚本编制问题的.下面就把这块东西分享出来. 原创文章,转载请注明 ------------------ ...

  4. IBM Rational AppScan:跨站点脚本攻击深入解析

    IBM Rational AppScan:跨站点脚本攻击深入解析    了解黑客如何启动跨站点脚本攻击(cross-site scripting,XSS),该攻击危害(及不危害)什么,如何检测它们,以 ...

  5. CSRF(Cross Site Request Forgery, 跨站域请求伪造)

    CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的 ...

  6. Web安全之XSS(Cross Site Scripting)深入理解

    XSS的含义 XSS(Cross Site Scripting)即跨站脚本.跨站的主要内容是在脚本上. 跨站脚本 跨站脚本的跨,体现了浏览器的特性,可以跨域.所以也就给远程代码或者第三方域上的代码提供 ...

  7. 转: CSRF(Cross Site Request Forgery 跨站域请求伪造) 背景与介绍

    from:  https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/   在 IBM Bluemix 云平台上开发并部署您的下一个应用 ...

  8. XSS (Cross Site Scripting) Prevention Cheat Sheet(XSS防护检查单)

    本文是 XSS防御检查单的翻译版本 https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sh ...

  9. 跨站点脚本编制 - SpringBoot配置XSS过滤器(基于mica-xss)

    1. 简介   XSS,即跨站脚本编制,英文为Cross Site Scripting.为了和CSS区分,命名为XSS.   XSS是最普遍的Web应用安全漏洞.这类漏洞能够使得攻击者嵌入恶意脚本代码 ...

随机推荐

  1. 【项目管理】Mybatis-Generator之最完美配置详解

    今天看到了一篇总结特别详细的关于Mybatis-Generator配置文件的文章,特转载进行记录学习使用. 先附上原文地址链接:张思全----全哥文章 <?xml version="1 ...

  2. openssl的移植

    下载openssl1.1并解压,进入openssl根目录,执行配置命令 ./Configure linux-armv4 --prefix=$(pwd)/__install 这里使用当前目录下的__in ...

  3. springmvc运行流程简单解释(源码解析,文末附自己画的流程图)

    首先看一下DispatcherServlet结构: 观察HandlerExecutionChain对象的创建与赋值,这个方法用来表示执行这个方法的整条链. 进入getHandler方法: 此时的变量h ...

  4. PyTorch最佳实践,怎样才能写出一手风格优美的代码

    [摘要] PyTorch是最优秀的深度学习框架之一,它简单优雅,非常适合入门.本文将介绍PyTorch的最佳实践和代码风格都是怎样的. 虽然这是一个非官方的 PyTorch 指南,但本文总结了一年多使 ...

  5. 洛谷 题解 P4613 【[COCI2017-2018#5] Olivander】

    我又双叒叕被包菜辣! P4613 [COCI2017-2018#5] Olivander 首先,不知道为什么这题无法提交翻译: 所以,我先放个翻译: 哈利波特在与伏地魔的战斗中损坏了他的魔杖.他决定在 ...

  6. [TimLinux] myblog 页面Axure设计

    1. 导航 2. 首页主体 3. 侧边栏 4. 页尾 5. 使用工具 Axure RP 8.0.0.3312 Pro版本.

  7. python学习笔记-生成随机数

    更多大数据分析.建模等内容请关注公众号<bigdatamodeling> 在实现算法时经常会用到随机数,有时会忘记各种随机数的生成方法,这里对Python中的随机数生成方法进行汇总,以供以 ...

  8. python之pymysql模块简单应用

    众所周知,想要在python程序中执行SQL语句需要使用第三方模块:pymysql. 下面,我将为大家简述一下pymysql第三方库的安装到使用的大体流程. pymysql的安装 1.windows系 ...

  9. Python爬虫根据关键词爬取知网论文摘要并保存到数据库中【入门必学】

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:崩坏的芝麻 由于实验室需要一些语料做研究,语料要求是知网上的论文摘要 ...

  10. ARTS-S Why do India and Pakistan keep fighting over Kashmir?

    原文 On Wednesday, Pakistani and Indian fighter jets engaged in a skirmish over Indian-controlled terr ...