jQuery框架漏洞全总结及开发建议

2019-09-29 17:23:14 浏览数 (1)

一、jQuery简介

jQuery是一个快速、简洁的JavaScript框架,是一个丰富的JavaScript代码库。jQuery设计的目的是为了写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

据一项调查报告,在对433,000个网站的分析中发现,77%的网站至少使用了一个具有已知安全漏洞的前端JavaScript库,而jQuery位列榜首,而且远远超过其他库。但事实上这些库有可用的不存在漏洞的最新版本,只是很少有开发人员会更新,一方面安全意识不够,另一方面更新需考虑兼容性问题。

二、漏洞研究

2.1 DOM-based XSS

0x01 概述

在JQuery的诸多发行版本中,存在着DOM-based XSS(跨站脚本攻击的一种)漏洞,易被攻击者利用。漏洞原因在于过滤用户输入数据所使用的正则表达式存在缺陷,可能导致LOCATION.HASH跨站漏洞。这也是最为被大众熟知的jQuery的一个漏洞。

此外,1.12.0之前的jQuery UI库也可以通过对话框函数的closeText参数进行DOM-based XSS攻击。

漏洞编号

CVE-2016-7103、CVE-2015-9251、CVE-2014-6071、CVE-2012-6708、CVE-2011-4969

影响版本:1.x系列版本等于或低于1.12的jQuery

2.x系列版本等于或低于2.2的jQuery

0x02 漏洞复现

1.6.1版本:

xss#<img src=1 onerror=alert('jayway')>

1.7.2版本:

xss#<img src=1 onerror=alert('jayway')>

1.11.3版本:

xss#<img src=1 onerror=alert('jayway')>

2.x版本:

Chrome 未对 location.hash 部分进行 URL 编码处理进入函数,而 Safari 会经过 URL 编码进入函数。依然可以使用html5 的一些特性,引发错误并弹框,只是局限于Safari 浏览器。

0x03 漏洞原理

1.6.1版本的jQuery代码正则为:

quickExpr = /^(?:[^<]*(<[wW] >)[^>]*$|#([w-]*)$)/,

1.7.2版本的jQuery代码正则为:

quickExpr =/^(?:[^#<]*(<[wW] >)[^>]*$|#([w-]*)$)/,

1.11.3版本的jQuery代码正则为:

rquickExpr =/^(?:s*(<[wW] >)[^>]*|#([w-]*))$/,

2.x系列jQuery代码正则为:

rquickExpr = /^(?:#([w-] )|(w )|.([w-] ))$/,

总结起来,DOM-based XSS漏洞在各个版本都可成功的原因在于jquery本身对于正则表达式都无法完善地过滤危险字符,但前提是源码使用了$(location.hash)。故触发条件较为苛刻,且只可触发DOM型xss漏洞。

0x04 开发建议

1)临时解决方案:

暂时隐藏jQuery版本信息,避免被攻击者识别出版本号,但不建议采取此办法;

2)正式解决方案:

建议将jQuery版本升级至1.9.x或以上版本3.4.0,升级jquery-ui版本到1.12.0以上。不过升级有风险,因为版本兼容的问题,jQuery官方推荐了jQuery Migrate 库来解决jQuery升级问题。

3)代码层解决方案:

1. 过滤用户输入的内容

检查用户输入的内容中是否有非法内容。如<>(尖括号)、"(引号)、 '(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、 (加号)等。

2. 严格控制输出

可以利用下面这些函数对出现xss漏洞的参数进行过滤

1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。

2、htmlentities() 函数,用于转义处理在页面上显示的文本。

3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。

4、header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。

5、urlencode() 函数,用于输出处理字符型参数带入页面链接中。

6、intval() 函数用于处理数值型参数输出页面中。

7、自定义函数,在大多情况下,要使用一些常用的 html 标签,以美化页面显示,在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。

各语言示例:

2.2 jQuery File Upload插件文件上传漏洞

0x01 概述

jQuery File Upload是文件上传小工具,包含多个文件选择:拖放支持,进度条,验证和预览图像,jQuery的音频和视频。支持跨域,分块和可恢复文件上传以及客户端图像大小调整。适用于支持标准HTML表单文件上载的任何服务器端平台(PHP,Python,Ruby on Rails,Java,Node.js,Go等)。目前该插件在GitHub最受欢迎的jQuery项目中位居第二位,仅次于jQuery框架本身。

该漏洞早在2016年就已经被广泛利用,它允许攻击者向服务器上传恶意js文件甚至后门和 Web shell,从而控制服务器。

漏洞编号:CVE-2018-9206

影响版本:9.22.1之前的所有jQuery文件上传版本

0x02 漏洞复现

测试环境搭建及验证POC:

https://github.com/lcashdol/Exploits/tree/master/CVE-2018-9206

在线漏洞环境:

https://github.com/vulnspy/jQuery-File-Upload-9.22.0

此漏洞被用于挂马进行博彩网站跳转,一次攻击实例如图:

0x03 漏洞原理

漏洞原因是Apache的一次升级,在版本2.3.9中禁用了对.htaccess的支持以提高性能(服务器不必在每次访问控制器时检查此文件)并防止用户覆盖安全功能在服务器上配置, 副作用是这次升级移除了安全控制措施。

0x04 开发建议

1、将此插件升级到9.22.1版本。

2、对可上传的文件类型进行严格限制。

2.3 原型污染漏洞

0x01 概述

不久前发布的 jQuery 3.4.0 除了常规更新外,更重要的是修复了一个称为“原型污染(prototype pollution)”的罕见安全漏洞。

原型污染就是指由攻击者控制的属性可被注入对象,之后或经由触发 JavaScript 异常引发拒绝服务,或篡改该应用程序源代码从而强制执行攻击者注入的代码路径。

漏洞编号:CVE-2019-11358

影响版本

0x02 漏洞原理

基础知识:

JavaScript 对象就跟变量一样,但它不是存储一个值(var car =“Fiat”),而是可以包含基于预定义结构的多个值 (var car ={type:"Fiat", model:"500", color:"white"})。

prototype 定义了 JavaScript 对象的默认结构和默认值,因此在没有为对象赋值时应用程序也不会崩溃。但如果攻击者从 JavaScript 对象的 prototype 入手,攻击者可通过将其控制的 prototype 注入对象,然后通过触发 JavaScript 异常导致拒绝服务(denial of service),或者篡改应用程序源代码以注入攻击者的代码路径。最终的结果可能就是导致应用程序崩溃或劫持应用程序。

漏洞原理:

例如,构建一款应用程序时,用户经授权能够发送和保存时一样的JSON有效负载,如下:

此时需要以递归方式克隆一个对象,通过如下方式::

如果从数据库中获取的用户对象myObject并未在isAdmin 属性中设置任何值,那么用户对象本质上是未明确的。在这种情况下,访问 if 从句中的 isAdmin 属性将要求访问user对象原型链中的父对象,即 Object,它现在即被污染并且包含被值为 true的 isAdmin 属性。这样,不安全的递归合并操作,加上 JSON.parse 的运作方式将导致潜在的原型链污染后果。

在3.4.0之前的jQuery,如在Drupal,Backdrop CMS和其他产品中使用,由于Object.prototype污染而错误处理jQuery.extend(true,{},...)。如果未过滤的源对象包含可枚举的__proto__属性,则它可以扩展到Object.prototype。

0x03 开发建议

(1)jQuery version 3.x 修复方案

升级到最新的3.4.0版本,带有修复程序的jQuery 3.4.0下载地址:

https://blog.jquery.com/2019/04/10/jquery-3-4-0-released/。

(2)jQuery version 2.x 修复方案

(3)jQuery version 1.x 修复方案

2.4 Denial of Service (DoS)漏洞

0x01 概述

受影响的软件包版本容易受到拒绝服务(DoS)的影响,因为删除了一个小写属性名称的逻辑。使用布尔属性的混合类名称的任何属性getter都会进入无限递归,超过堆栈调用限制。

漏洞编号:CVE-2016-10707

影响版本:jQuery 3.0.0-rc1

0x02 漏洞原理

由于删除了一个小写属性名称的逻辑,jQuery3.0.0-rc.1容易受到拒绝服务(DoS)的攻击。使用布尔属性的混合类名称的任何属性getter都会进入无限递归,超过堆栈调用限制。

0x03 开发建议

升级jquery到3.0.0或更高版本。

三、总计

总结起来,对于jQuery的漏洞修复和防范,主要体现在对开发中所调用的jQuery版本的重视。尽可能使用不含漏洞的高版本JQuery,对于已开发的程序,需采取的方案有:

1)采取隐藏版本号的方法增加攻击难度;

2)对已存在的jQuery进行升级和打补丁;

3)在代码层对用户输入数据进行严格限制,这也是防御的根本。

附:

1、通过下列链接查看存在漏洞的jQuery版本:

http://research.insecurelabs.org/jquery/test/

2、通过下列链接查看漏洞详情:

https://bugs.jquery.com/ticket/11290

0 人点赞