2023年6月21日发(作者:)
jQuery框架漏洞全总结及开发建议⼀、jQuery简介jQuery是⼀个快速、简洁的JavaScript框架,是⼀个丰富的JavaScript代码库。jQuery设计的⽬的是为了写更少的代码,做更多的事情。它封装JavaScript常⽤的功能代码,提供⼀种简便的JavaScript设计模式,优化HTML⽂档操作、事件处理、动画设计和Ajax交互。据⼀项调查报告,在对433,000个⽹站的分析中发现,77%的⽹站⾄少使⽤了⼀个具有已知安全漏洞的前端JavaScript库,⽽jQuery位列榜⾸,⽽且远远超过其他库。但事实上这些库有可⽤的不存在漏洞的最新版本,只是很少有开发⼈员会更新,⼀⽅⾯安全意识不够,另⼀⽅⾯更新需考虑兼容性问题。⼆、漏洞研究2.1 DOM-based XSS0x01 概述在JQuery的诸多发⾏版本中,存在着DOM-based XSS(跨站脚本攻击的⼀种)漏洞,易被攻击者利⽤。漏洞原因在于过滤⽤户输⼊数据所使⽤的正则表达式存在缺陷,可能导致跨站漏洞。这也是最为被⼤众熟知的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的jQuery2.x系列版本等于或低于2.2的jQuery0x02 漏洞复现1.6.1版本:xss#1.7.2版本:xss#1.11.3版本:xss#2.x版本:Chrome 未对 部分进⾏ 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本⾝对于正则表达式都⽆法完善地过滤危险字符,但前提是源码使⽤了$()。故触发条件较为苛刻,且只可触发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 onRails,Java,,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),或者篡改应⽤程序源代码以注⼊攻击者的代码路径。最终的结果可能就是导致应⽤程序崩溃或劫持应⽤程序。漏洞原理:例如,构建⼀款应⽤程序时,⽤户经授权能够发送和保存时⼀样的JSON有效负载,如下:此时需要以递归⽅式克隆⼀个对象,通过如下⽅式::如果从数据库中获取的⽤户对象myObject并未在isAdmin 属性中设置任何值,那么⽤户对象本质上是未明确的。在这种情况下,访问 if 从句中的 isAdmin 属性将要求访问user对象原型链中的⽗对象,即 Object,它现在即被污染并且包含被值为 true的 isAdmin 属性。这样,不安全的递归合并操作,加上 的运作⽅式将导致潜在的原型链污染后果。在3.4.0之前的jQuery,如在Drupal,Backdrop CMS和其他产品中使⽤,由于ype污染⽽错误处理(true,{},...)。如果未过滤的源对象包含可枚举的__proto__属性,则它可以扩展到ype。0x03 开发建议(1)jQuery version 3.x 修复⽅案升级到最新的3.4.0版本,带有修复程序的jQuery 3.4.0下载地址:(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版本:2、通过下列链接查看漏洞详情:
2023年6月21日发(作者:)
jQuery框架漏洞全总结及开发建议⼀、jQuery简介jQuery是⼀个快速、简洁的JavaScript框架,是⼀个丰富的JavaScript代码库。jQuery设计的⽬的是为了写更少的代码,做更多的事情。它封装JavaScript常⽤的功能代码,提供⼀种简便的JavaScript设计模式,优化HTML⽂档操作、事件处理、动画设计和Ajax交互。据⼀项调查报告,在对433,000个⽹站的分析中发现,77%的⽹站⾄少使⽤了⼀个具有已知安全漏洞的前端JavaScript库,⽽jQuery位列榜⾸,⽽且远远超过其他库。但事实上这些库有可⽤的不存在漏洞的最新版本,只是很少有开发⼈员会更新,⼀⽅⾯安全意识不够,另⼀⽅⾯更新需考虑兼容性问题。⼆、漏洞研究2.1 DOM-based XSS0x01 概述在JQuery的诸多发⾏版本中,存在着DOM-based XSS(跨站脚本攻击的⼀种)漏洞,易被攻击者利⽤。漏洞原因在于过滤⽤户输⼊数据所使⽤的正则表达式存在缺陷,可能导致跨站漏洞。这也是最为被⼤众熟知的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的jQuery2.x系列版本等于或低于2.2的jQuery0x02 漏洞复现1.6.1版本:xss#1.7.2版本:xss#1.11.3版本:xss#2.x版本:Chrome 未对 部分进⾏ 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本⾝对于正则表达式都⽆法完善地过滤危险字符,但前提是源码使⽤了$()。故触发条件较为苛刻,且只可触发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 onRails,Java,,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),或者篡改应⽤程序源代码以注⼊攻击者的代码路径。最终的结果可能就是导致应⽤程序崩溃或劫持应⽤程序。漏洞原理:例如,构建⼀款应⽤程序时,⽤户经授权能够发送和保存时⼀样的JSON有效负载,如下:此时需要以递归⽅式克隆⼀个对象,通过如下⽅式::如果从数据库中获取的⽤户对象myObject并未在isAdmin 属性中设置任何值,那么⽤户对象本质上是未明确的。在这种情况下,访问 if 从句中的 isAdmin 属性将要求访问user对象原型链中的⽗对象,即 Object,它现在即被污染并且包含被值为 true的 isAdmin 属性。这样,不安全的递归合并操作,加上 的运作⽅式将导致潜在的原型链污染后果。在3.4.0之前的jQuery,如在Drupal,Backdrop CMS和其他产品中使⽤,由于ype污染⽽错误处理(true,{},...)。如果未过滤的源对象包含可枚举的__proto__属性,则它可以扩展到ype。0x03 开发建议(1)jQuery version 3.x 修复⽅案升级到最新的3.4.0版本,带有修复程序的jQuery 3.4.0下载地址:(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版本:2、通过下列链接查看漏洞详情:
发布评论