文章目录
框架简介
漏洞检测
漏洞复现
漏洞简述
漏洞分析
复现过程
修复建议
新版漏洞
漏洞复现
漏洞原理
修复方案
漏洞验证
框架简介
jQuery是一个快速、简洁的JavaScript框架,是一个丰富的JavaScript代码库。jQuery设计的目的是为了写更少的代码,做更多的事情。它封装 JavaScript 常用的功能代码,提供一种简便的 JavaScript 设计模式,优化 HTML 文档操作、事件处理、动画设计和 Ajax 交互。
据一项调查报告,在对 433000 个网站的分析中发现,77%的网站至少使用了一个具有已知安全漏洞的前端 JavaScript 库,而 jQuery 位列榜首,而且远远超过其他库。但事实上这些库有可用的不存在漏洞的最新版本,只是很少有开发人员会更新,一方面安全意识不够,另一方面更新需考虑兼容性问题。
漏洞检测
最简单粗暴的方法,直接使用火狐浏览器的插件:Retire.js,如下是 CSDN 网站主页存在的漏洞问题:
漏洞复现
漏洞简述
DOM型 XSS
在 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
影响版本
(1)1.x系列版本等于或低于1.12的jQuery;
(2)2.x系列版本等于或低于2.2的jQuery。
1
2
漏洞分析
漏洞成因
jQuery 中过滤用户输入数据所使用的正则表达式存在缺陷,导致location.hash跨站脚本攻击。
jQuery 1.6.1版本
正则表达式如下:
quickExpr = /^(?:[^<](<[\w\W]+>)[^>]$|#([\w-]*)$)/,
1
该正则表达式缺陷引起的XSS攻击:
jQuery1.7.2 版本
正则表达式如下:
quickExpr = /^(?:[^#<](<[\w\W]+>)[^>]$|#([\w-]*)$)/,
1
该正则表达式存在的缺陷,容易引起DoM型XSS攻击:
jQuery 1.11.3版本
正则表达式为:
rquickExpr = /^(?:\s(<[\w\W]+>)[^>]|#([\w-]*))$/,
1
该正则表达式引起的XSS漏洞:
总结起来,DOM-based XSS 漏洞在各个版本都可成功的原因在于 jquery 本身对于正则表达式都无法完善地过滤危险字符,但前提是源码使用了$(location.hash)。故触发条件较为苛刻,且只可触发 DOM 型 XSS 漏洞。
复现过程
演示程序
<!DOCTYPE html>
JQuery with XSS Demo
Click here!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1、将上述 html 文件保存到本地 phpstudy 网站目录下:
2、启动 phpstudy:
3、然后 IE 浏览器或者 Microsoft Edge 浏览器中访问 Demo 页面:
4、点击网页链接,触发漏洞:
【注意】此漏洞场景不适用于 谷歌浏览器和 火狐浏览器,可能因为浏览器自身安全策略问题。但是 Microsoft Edge 浏览器的爸爸(微软)并不把它当作一个漏洞,于是乎……
修复建议
1、临时解决方案:
暂时隐藏 jQuery 版本信息,避免被攻击者识别出版本号,但不建议采取此办法;
2、正式解决方案:
建议将 jQuery 版本升级至 1.9.x 或以上版本 3.4.0,升级 jquery-ui 版本到 1.12.0 以上。不过升级有风险,因为版本兼容的问题,jQuery 官方推荐了 jQuery Migrate 库来解决 jQuery 升级问题。
3、代码层解决方案:
(1)过滤用户输入的内容
检查用户输入的内容中是否有非法内容。如<>(尖括号)、"(引号)、 '(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。
1
(2)严格控制输出
可以利用下面这些函数对出现xss漏洞的参数进行过滤
1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。
2、htmlentities() 函数,用于转义处理在页面上显示的文本。
3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。
4、header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。
5、urlencode() 函数,用于输出处理字符型参数带入页面链接中。
6、intval() 函数用于处理数值型参数输出页面中。
7、自定义函数,在大多情况下,要使用一些常用的 html 标签,以美化页面显示,在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。
1
2
3
4
5
6
7
新版漏洞
jQuery 官方在 2020年4月 发布了最新版本 3.5.0,主要修复了两个安全问题(漏洞编号 CVE-2020-11022、CVE-2020-11023),官方博客为:jQuery 3.5.0 Released!
据NVD描述:在大于或等于 1.2 且在 3.5.0 之前的 jQuery 版本中,即使执行了消毒(sanitize)处理,也仍会执行将来自不受信任来源的HTML传递给 jQuery 的 DOM 操作方法(即 html()、.append()等),从而导致 XSS 漏洞。
漏洞利用条件
系统使用 jQuery 的 html()、append() 或 $('') 等方法处理用户输入;
用户输入已经过“消毒”(sanitize)处理。
漏洞复现
对于此漏洞原作者搭建了在线环境,内置了三个 xss poc,点击 Append via .html() 按钮即可触发 XSS:
点击触发漏洞:
HTML 源码审计:
<!DOCTYPE html>
jQuery XSS Examples (CVE-2020-11022/CVE-2020-11023)
PoCs of XSS bugs fixed in jQuery 3.5.0. You can find the details in my blog post: English / 日本語
PoC 1
<br> <style><style /><img src=x οnerrοr=alert(1)><br>
PoC 2 (Only jQuery 3.x affected)
<br> <img alt="<x" title="/><img src=x οnerrοr=alert(1)>"><br>
PoC 3
<br> <option><style></option></select><img src=x οnerrοr=alert(1)></style><br>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
分析下以上网页源码:
1、首先使用如下代码模拟了一个开发场景,即将页面的所有 div 元素替换为根据 ID 取到的 sanitizedHTML:
1
2
3
4
5
6
7
8
9
10
2、虽然三个 poc 都使用了包含 onerror 事件的 img 标签,但其实它们是放在属性或 style 元素内部,因此会绕过 HTML 清理器。以 poc1 为例,根据此 id 取到的值如下:
,变成了:
1
闭合了
1
经过处理会变为:
1
根据HTML从前往后解析的顺序,会先解析一个标签,且不允许将大部分 HTML 标签包裹其中,导致