jQuery框架漏洞全总结及开发建议
⼀、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
jquery下载文件进度条影响版本: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 = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\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漏洞。format rat是什么意思
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:
在线漏洞环境:
此漏洞被⽤于挂马进⾏⽹站跳转,⼀次攻击实例如图:
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),或者篡改应⽤程序源代码以注⼊攻击者的代码路径。最终的结果可能就是导致应⽤程序崩溃或劫持应⽤程序。
漏洞原理:
rank升序和降序什么意思例如,构建⼀款应⽤程序时,⽤户经授权能够发送和保存时⼀样的JSON有效负载,如下:
此时需要以递归⽅式克隆⼀个对象,通过如下⽅式::
如果从数据库中获取的⽤户对象myObject并未在isAdmin 属性中设置任何值,那么⽤户对象本质上是未明确的。在这种情况下,访问 if 从句中的 isAdmin 属性将要求访问user对象原型链中的⽗对象,即 Object,它现在即被污染并且包含被值为 true的 isAdmin 属性。这样,不安全的递归合并操作,加上 JSON.parse 的运作⽅式将导致潜在的原型链污染后果。
在3.4.0之前的jQuery,如在Drupal,Backdrop CMS和其他产品中使⽤,由于Object.prototype污染⽽错误处理d(true,{},...)。如果未过滤的源对象包含可枚举的__proto__属性,则它可以扩展到Object.prototype。
0x03 开发建议
(1)jQuery version 3.x 修复⽅案
升级到最新的3.4.0版本,带有修复程序的jQuery 3.4.0下载地址:
printf在c语言中的意思
(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 漏洞原理
css样式选择器类型由于删除了⼀个⼩写属性名称的逻辑,jQuery3.0.0-rc.1容易受到拒绝服务(DoS)的攻击。使⽤布尔属性的混合类名称的任何属性getter都会进⼊⽆限递归,超过堆栈调⽤限制。
0x03 开发建议
升级jquery到3.0.0或更⾼版本。
三、总计
总结起来,对于jQuery的漏洞修复和防范,主要体现在对开发中所调⽤的jQuery版本的重视。尽可能使⽤不含漏洞的⾼版本JQuery,对于已开发的程序,需采取的⽅案有:
1)采取隐藏版本号的⽅法增加攻击难度;
2)对已存在的jQuery进⾏升级和打补丁;
3)在代码层对⽤户输⼊数据进⾏严格限制,这也是防御的根本。
附:
1、通过下列链接查看存在漏洞的jQuery版本:
2、通过下列链接查看漏洞详情:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。