Web安全-JQuery框架XSS漏洞浅析

   日期:2024-12-21    作者:fetg6 移动:http://qyn41e.riyuangf.com/mobile/quote/8310.html

Web安全-JQuery框架XSS漏洞浅析

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 漏洞。

漏洞利用条件

  1. 系统使用 jQuery 的 html()、append() 或 等方法处理用户输入
  2. 用户输入已经过“消毒”(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,官方推荐


 

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号