jQuery是一个快速、简洁的JavaScript框架,是一个丰富的JavaScript代码库。jQuery设计的目的是为了写更少的代码,做更多的事情。它封装 JavaScript 常用的功能代码,提供一种简便的 JavaScript 设计模式,优化 HTML 文档操作、事件处理、动画设计和 Ajax 交互。
据一项调查报告,在对 433000 个网站的分析中发现,77%的网站至少使用了一个具有已知安全漏洞的前端 JavaScript 库,而 jQuery 位列榜首,而且远远超过其他库。但事实上这些库有可用的不存在漏洞的最新版本,只是很少有开发人员会更新,一方面安全意识不够,另一方面更新需考虑兼容性问题。
DOM型 XSS
在 JQuery 的诸多发行版本中,存在着 DOM-based XSS(跨站脚本攻击的一种) 漏洞,易被攻击者利用。漏洞原因在于过滤用户输入数据所使用的正则表达式存在缺陷,可能导致 跨站漏洞。这也是最为被大众熟知的 jQuery 的一个漏洞。此外,1.12.0 之前的 jQuery UI 库也可以通过对话框函数的 closeText 参数进行 DOM-based XSS 攻击。
漏洞编号
影响版本
漏洞成因
jQuery 中过滤用户输入数据所使用的正则表达式存在缺陷,导致跨站脚本攻击。
jQuery 1.6.1版本
正则表达式如下:
正则表达式如下:
正则表达式为:
演示程序
【注意】此漏洞场景不适用于 谷歌浏览器和 火狐浏览器,可能因为浏览器自身安全策略问题。但是 Microsoft Edge 浏览器的爸爸(微软)并不把它当作一个漏洞,于是乎……
1、临时解决方案:
暂时隐藏 jQuery 版本信息,避免被攻击者识别出版本号,但不建议采取此办法;
2、正式解决方案:
建议将 jQuery 版本升级至 1.9.x 或以上版本 3.4.0,升级 jquery-ui 版本到 1.12.0 以上。不过升级有风险,因为版本兼容的问题,jQuery 官方推荐了 jQuery Migrate 库来解决 jQuery 升级问题。
3、代码层解决方案:
(1)过滤用户输入的内容
(2)严格控制输出
可以利用下面这些函数对出现xss漏洞的参数进行过滤
jQuery 官方在 2020年4月 发布了最新版本 3.5.0,主要修复了两个安全问题(漏洞编号 ),官方博客为:jQuery 3.5.0 Released!
据NVD描述:在大于或等于 且在 之前的 jQuery 版本中,即使执行了消毒(sanitize)处理,也仍会执行将来自不受信任来源的HTML传递给 jQuery 的 DOM 操作方法(即 html()、.append()等),从而导致 XSS 漏洞。
漏洞利用条件
- 系统使用 jQuery 的 html()、append() 或 等方法处理用户输入;
- 用户输入已经过“消毒”(sanitize)处理。
分析下以上网页源码:
1、首先使用如下代码模拟了一个开发场景,即将页面的所有 div 元素替换为根据 ID 取到的 sanitizedHTML:
2、虽然三个 poc 都使用了包含 onerror 事件的 img 标签,但其实它们是放在属性或 style 元素内部,因此会绕过 HTML 清理器。以 poc1 为例,根据此 id 取到的值如下:
闭合了标签,成功执行后面的脚本,导致XSS。
1、CVE-2020-11022
导致上述问题的关键是,在 html() 方法中,作为参数传递的 HTML 字符串将传递到 方法:
在 jquery 3.x 版本之后使用的正则为:
这就使用到环境里的 poc2(仅适用于 jQuery3.x ),注意这里的 XSS payload 是作为属性出现,所以可以绕过消毒器规则:
该 poc 使用 html() 方法执行后发现变为:
针对上述漏洞原理,jQuery Team 进行了修复,修复手段为将方法替换为标识函数,因此传递的HTML字符串现在不再经过函数处理,从而成功修复了漏洞。但仍有一些手段可以绕过,C VE-2020-11023 就是针对 CVE-2020-11022 的绕过。
绕过使用的是另一个特性,某些特殊的标签在经过 html() 方法处理时,会由于 HTML 的特性或浏览器的 bug 而使得这些标签被移除。
option 就是这些特殊标签之一,我们知道 option 元素通过位于 select 元素内部来构造一个选择列表,但如果没有 select 元素,option 会被移除。为了解决这个 bug,如果传入参数的第一个元素为 option,jQuery 会新增和。所以我们提交 poc3:
经过处理会变为:
根据HTML从前往后解析的顺序,会先解析一个标签,且不允许将大部分 HTML 标签包裹其中,导致被忽略,而后识别标签从而触发 XSS。
此漏洞在最新的3.5.0中也被修复,对于特殊的标签进行了处理。
(1)更新 jQuery 到 3.5.0 或更高版本:
(2)使用XSS清理工具清理用户输入的HTML,官方推荐: