# JQuery 漏洞修复记录及JQuery库里的各个文件的作用
你好! 这是一篇关于JQuery漏洞修复及JQery下各个文件介绍的经验文章。如果你正好用到了JQuerry或者需要修复相关漏洞, 可以仔细阅读这篇文章,了解一下JQuery相关知识。
## 背景
最近WEB项目遇到漏洞审查,发现了 JQuery原型污染漏洞(CVE-2019-11358),中危, 项目原来的JQery的版本是3.3.1,现在把修复过程记录一下。
## JQuery原型污染漏洞(CVE-2019-11358)修复
### 漏洞描述
原型污染漏洞指的是攻击者修改 JavaScript对象原型的能力。JavaScript对象就像变量一样,但存储的并非一个值 (var car = “
Fiat”),而是能够包含基于预设结构的多个值(var car ={type:"Fiat", model:"500", color:"white"})。
原型定义了JavaScript 对象的默认结构和默认值,因此当未设置值时,应用程序不会崩溃。原型污染攻击可导致攻击者覆写
JavaScript 应用程序对象原型。由攻击者控制的属性可被注入对象,之后或经由触发JavaScript异常引发拒绝服务,或篡改该应用
程序源代码从而强制执行攻击者注入的代码路径。
漏洞本身是高危漏洞,但利用难度比较大。原型污染漏洞并未可大规模被利用的漏洞,因为漏洞要利用成功,需要攻击者非常了解
具体代码的结构,需要攻击者深入了解每个网站和对象原型的运作方式以及这些原型如何在庞大的图式中进行分解,然后构造合适
的利用方法才能成功。一般闭源的网站系统,攻击者很难深入了解从而构造利用代码,所以几乎不受此漏洞攻击。
### 漏洞分析
漏洞POC:https://github.com/jquery/jquery/pull/4333。
漏洞分析如下:
./src/core.js 第155行:
if ((options = arguments[ i ]) != null) {
options 取传入的参数 arguments[i],而后第158 、159 行:
for (name in options) {
copy= options [name];
name、copy值进而可以受输入控制。
最后,在第183行:
target[name] = jQuery.extend (deep,clone,copy);
在第187行:
target[name] = copy;
如果name可以为__proto__,则会向上影响target的原型,进而覆盖造成原型污染。
target 在第127行:
target = arguments[ 0 ] || {}
### 漏洞复现和验证
测试网站是否存在此漏洞:
以google浏览器为例,打开要测试的网站,按<kbd>F12</kbd>,在Console窗口输入:
```javascript
$.fn.jquery
```
$.fn.jquery
回车查看版本号
```javascript
var maliciousJson = '{ "myProperty" : "a", "__proto__" : { "isVulnerable" : true } }'; var testObject = jQuery.extend(true, {}, JSON.parse(maliciousJson )); if (typeof {}.isVulnerable !== 'undefined' && {}.isVulnerable === true) { alert("Bad news :(\nYou're (still) vulnerable to Prototype Pollution") } else { alert("All Good! :)\nYou're NOT vulnerable (anymore) to Prototype Pollution") }
```
var maliciousJson = '{ "myProperty" : "a", "__proto__" : { "isVulnerable" : true } }'; var testObject = jQuery.extend(true, {}, JSON.parse(maliciousJson )); if (typeof {}.isVulnerable !== 'undefined' && {}.isVulnerable === true) { alert("Bad news :(\nYou're (still) vulnerable to Prototype Pollution") } else { alert("All Good! :)\nYou're NOT vulnerable (anymore) to Prototype Pollution") }
点击回车键,弹出警告(All Good),表明当前您的网站不受该威胁:
### 漏洞修复建议
(1)jQuery version 3.x 修复方案
升级到最新的3.4.0版本:https://blog.jquery.com/2019/04/10/jquery-3-4-0-released/。
(2)jQuery version 2.x和1.x 修复方案
补丁链接:https://github.com/DanielRuf/snyk-js-jquery-174006?files=1。
修复建议:
其实这是最好与最简单的修复方式,但是最新版的jquery不兼容旧版本,很多的api被废除了,所以如果升级到最新版的话,容易崩,还有个方式就是jquery团队推出的一个插件migrate。具体使用方法自行去jquery查询
其他漏洞修复方法以此为参考。
## JQuery相关文件介绍
如下图所示
1. **core.js:** core是jQuery的核心内容, 包含了最基础的方法, 比如我们常用的 $(selector, context), 用于遍历操作的 each, map, eq, first 识别变量类型的 isArray, isNumeric, type 等 . 这些方法为jQuery后续操作提供最基础的支持. [jQuery 源码分析和使用心得]
2. **jquery.js:** jquery.js是完整的未压缩的jQuery库,文件比较大,一般用于阅读学习源码或修改源码,一般不用于线上项目。
3. **jquery.min.js:** 是由完整版的jQuery库经过压缩得来,压缩后功能与未压缩的完全一样,只是将其中的空白字符、注释、空行等与逻辑无关的内容删除,并进行一些优化,发布打包是就用到里面的内容。
4. **jquery.min.map:** 可读代码(jquery.js)和压缩代码(jquery.min.js)对于关系映射文件,用于DEBUG时JavaScript的解释器会告诉你在可读代码的第几行第几列代码出错。[详细参考]
5. **jquery.slim相关文件:** 精简版jQuery库,是指一个被精简过的 jQuery 版本,它只包含了核心的功能,文件大小比普通版小很多,一般只有 70 KB 左右。精简版适用于那些只需要核心功能的项目,可以减少页面加载时间和网络传输量。