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

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

文章目录
框架简介
漏洞检测
漏洞复现
漏洞简述
漏洞分析
复现过程
修复建议
新版漏洞
漏洞复现
漏洞原理
修复方案
漏洞验证
框架简介
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 标签包裹其中,导致

    目录
    相关文章
    |
    1天前
    |
    安全 应用服务中间件 开发工具
    Web安全-SVN信息泄露漏洞分析
    Web安全-SVN信息泄露漏洞分析
    9 2
    |
    4天前
    |
    SQL 安全 数据库
    惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
    在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
    30 5
    |
    2天前
    |
    开发框架 JSON 缓存
    震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
    在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
    13 1
    |
    4天前
    |
    安全 搜索推荐 应用服务中间件
    Web安全-目录遍历漏洞
    Web安全-目录遍历漏洞
    16 2
    |
    4天前
    |
    XML JSON 安全
    Web安全-XXE漏洞
    Web安全-XXE漏洞
    11 1
    |
    2天前
    |
    安全 关系型数据库 MySQL
    Web安全-条件竞争漏洞
    Web安全-条件竞争漏洞
    8 0
    |
    3月前
    |
    JavaScript 前端开发
    杨校老师课堂之Web前端JS类库_JQuery案例[效果图与代码齐全]
    杨校老师课堂之Web前端JS类库_JQuery案例[效果图与代码齐全]
    29 0
    |
    4月前
    |
    JavaScript 前端开发 索引
    【Web 前端】jQuery 里的 each() 是什么函数?你是如何使用它的?
    【5月更文挑战第2天】【Web 前端】jQuery 里的 each() 是什么函数?你是如何使用它的?
    |
    4月前
    |
    JavaScript 前端开发
    【Web 前端】jQuery 库中的 $() 是什么?
    【5月更文挑战第1天】【Web 前端】jQuery 库中的 $() 是什么?
    |
    4月前
    |
    JavaScript 前端开发
    【Web 前端】 jQuery 里的 ID 选择器和 class 选择器有何不同?
    【5月更文挑战第1天】【Web 前端】 jQuery 里的 ID 选择器和 class 选择器有何不同?