听团里说WordPress又爆跨站漏洞了:“ XSS漏洞在Jetpack和二十五默认主题影响百万WordPress用户 ”,分析发现原来是jQuery老版本的DOM XSS漏洞【错误#9521】。
11年dmethvin提交jQuery 1.6.1版本的Ticket#9521,其原因是由$() | jQuery()预选的CSS选择器在其他情况下可用于创建HTML元素,如果编码不当(事实上很多编码不当的情况),将会导致产生DomXSS漏洞。

示例(jQuery 1.6.1)

  1. <html>
  2. <head>
  3. <title>jQuery DomXSS test</title>
  4. <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
  5. <script>
  6. $(location.hash);
  7. </script>
  8. </head>
  9. <body>
  10. Hello, jQuery.
  11. </body>
  12. </html>

复制代码

WordPress默认主题二十一个例子

example.html 297-299行:
  1. // set permalink
  2. var permalink = cssclass.split(' genericon-')[1];
  3. window.location.hash = permalink;

复制代码

console.log永久链接:

  • http://linux.im/wp-content/themes/twentyfifteen/genericons/example.html#123
  • console.log(permalink):genericon-123
335-343行:
  1. // pick random icon if no permalink, otherwise go to permalink
  2. if ( window.location.hash ) {
  3. permalink = "genericon-" + window.location.hash.split('#')[1];
  4. attr = jQuery( '.' + permalink ).attr( 'alt' );
  5. cssclass = jQuery( '.' + permalink ).attr('class');
  6. displayGlyph( attr, cssclass );
  7. } else {
  8. pickRandomIcon();
  9. }

复制代码

如果存在window.location.hash则拼接固定链接并使用jQuery的进行属性操作,问题出现,当我们将的location.hash为设置<img src=@ onerror=alert(1)>时,导致跨站。

jQuery 1.6.1源码

  1. >_ $
  2. jquery.js:25 function ( selector, context ) {
  3. // The jQuery object is actually just the init constructor 'enhanced'
  4. return new jQuery.fn.init( selector, context, rootjQuery );
  5. }
  6. >_ jQuery.fn.init
  7. jquery.js:93 function ( selector, context, rootjQuery ) {
  8. var match, elem, ret, doc;
  9. // Handle $(""), $(null), or $(undefined)
  10. if ( !selector ) {
  11. return this;
  12. }
  13. // Handle $(DOMElement)
  14. if ( selector.nodeType ) {
  15. this.context = this[0] = selector;
  16. this.length = 1;
  17. return this;
  18. }
  19. ......
  20. if (selector.selector !== undefined) {
  21. this.selector = selector.selector;
  22. this.context = selector.context;
  23. }
  24. return jQuery.makeArray( selector, this );
  25. }

复制代码

其中jQuery.fn.init:

  1. if ( typeof selector === "string" ) {
  2. // Are we dealing with HTML string or an ID?
  3. if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
  4. // Assume that strings that start and end with <> are HTML and skip the regex check
  5. match = [ null, selector, null ];
  6. } else {
  7. match = quickExpr.exec( selector );
  8. }

复制代码

quickExpr对选择器进行过滤,正则为:

  1. quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,

复制代码

显然我们上面的Payload是能通过的。

jQuery 1.7.2源码

当时漏洞报告者在#9521中提到修复方案:
  1. the quick patch by jquery is here
  2. -       quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
  3. +       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,

复制代码

尽管在开始的例子代码中不能生效,但由于程序开发人员的编码习惯显然按照上面的修复并没有什么卵用,修复后原有的攻击代码效果:

  1. >_ location.hash
  2. "#test<img src=1 onerror=alert(1)>"
  3. >_$(location.hash)
  4. []

复制代码

因为正则新增#的原因导致增加失败,在真实环境中属性或其他操作直接使用location.hash的可能性叫小,开发人员以及业务需求使得上面的修复方案没有意义,例如开始提到的WordPress默认主题XSS漏洞337行:

  1. permalink = "genericon-" + window.location.hash.split('#')[1];

复制代码

程序将获取到的哈希['#test111'] split后,只保存test111,也就可以得到我们能忽略到1.7.2的修复。

jQuery 1.11.3源码

在前面版本中其实能够得以证明jQuery团队确实修复#9521的问题就是quickExpr的上方注释:
  1. // A simple way to check for HTML strings or ID strings
  2. // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
  3. quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,

复制代码

可能开发团队遇到了1.7.2中我提到问题的尴尬窘境,他们在1.11.3又对其进行了升级:

  1. rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

复制代码

看到这个正则我几乎无语,使用开头和结尾<就能轻易绕过:

终于,他们在2.x系列正式修复了这个问题:
  1. rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

复制代码

其他浏览器

如何所见,上面这些Payload并不会在Safari中成效,通过调试即可发现Chrome未对location.hash部分进行URL编码处理进入函数,而Safari会经过URL编码进入函数,是这样的:

但是我们仍然可以使用html5的一些特性,引发错误并onerror出来:
  1. file:///Users/evi1m0/Desktop/1.html#<video><source/onerror=alert(1)>

复制代码

来源:

http://www.hack80.com/forum.php?mod=viewthread&tid=47045

jQuery <= 1.11.3 DomXSS漏洞的更多相关文章

  1. jQuery table td可编辑

    参考链接: http://www.freejs.net/ http://www.freejs.net/article_biaodan_34.html http://www.freejs.net/sea ...

  2. jQuery代码实现表格内容可编辑修改

    1.效果及功能说明 表格特效制作jquery表格可编辑任意修改里面的数值,是一种比较人性化的用户设计体验方式 2.实现原理 通过点击事件来触发跳出一个输入框可以在里面输入当这个输入框失去焦点后就把,所 ...

  3. jQuery实现可编辑表格

    在很多的网页中,这个可编辑表格在许多地方都是非常有用,配合上AJAX技术能够实现很好的用户体验,下面我 们就jQuery来说明一下可编辑表格的实现步骤 首先是HTML代码,非常简单 <!DOCT ...

  4. JQuery实战--可以编辑的表格

    廊坊下雪了,15年的第二场雪,比14的来的稍晚一些,停靠在11教门前的自行车,成了廊坊师范学院最美丽的风景线.还记得以前学习css的时候,就曾经接触过如何编写设计一些表格和表单的样式,例如如何设计表格 ...

  5. JQuery实战--能够编辑的表格

    廊坊下雪了.15年的第二场雪.比14的来的稍晚一些.停靠在11教门前的自行车.成了廊坊师范学院最漂亮的风景线.还记得以前学习css的时候.就以前接触过怎样编写设计一些表格和表单的样式,比如怎样设计表格 ...

  6. 实战Jquery(二)--能够编辑的表格

    今天实现的是一个表格的样例,通过获取表格的奇数行,设置背景色属性,使得奇偶行背景色不同.这个表格能够在单击时编辑,回车即更改为新输入的内容;ESC还原最初的文本.表格的实现思路非常清晰,仅仅是在实现的 ...

  7. JQuery DataTables Editor---页面内容修改&&数据库信息修改 (2)

    接上篇博文,详细说一下js代码以及JQuery DataTables Editor---页面内容修改&&数据库信息修改遇到的问题和解决办法. 1.关于dialog 初始化: $(&qu ...

  8. 扩展jquery easyui datagrid编辑单元格

    扩展jquery easyui datagrid编辑单元格 1.随便聊聊 这段时间由于工作上的业务需求,对jquery easyui比较感兴趣,根据比较浅薄的js知识,对jquery easyui中的 ...

  9. JQuery实现可编辑的表格

    点击表格后可直接编辑,回车或鼠标点击页面其他地方后编辑生效,按Esc可取消编辑 第一种单击表格可以编辑的方法 //相当于在页面中的 body标签加上onload事件$(function() {    ...

  10. 基于layui,Jquery 表格动态编辑 设置 编辑值为 int 或者 double 类型及默认值

    首先先推荐大家在看这篇笔记时,阅读过我写的这篇 Layui表格编辑[不依赖Layui的动态table加载] 阅读过上面那篇笔记之后呢,才能更好的理解我现在所要说的这个东西 接下来废话不多说,上代码. ...

随机推荐

  1. [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader

    [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 目录 [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 0x00 摘要 0x01 ...

  2. k8s之数据存储-高级存储

    PV和PVC 前面已经学习了使用NFS提供存储,此时就会要求用户会搭建NFS系统,并且会在yaml配置nf's,由于k8s支持的存储系统有很多,要求客户全部掌握,显然不现实.为了能够屏蔽底层存储实现的 ...

  3. kali2020更换JDK&&安装burpsuite pro

    写在前面 之前因为安装maven把JDK换成了1.8.0_261,尝试诸多方法依然打不开自带的burp,正好在做CTF做不出来 QAQ,一气之下打算安个破解版burp. 安装 0x00 更换JDK 使 ...

  4. NOIP 模拟 $12\; \text{简单的区间}$

    题解 签到题 求区间和为 \(k\) 的倍数的区间,我们可以转化为求左右两个端点,其前缀和相等 对于区间最大值,我们可以把其转化为一个值,它能向左,向右扩展的最远边界,一个单调栈即可 我们设一个值 \ ...

  5. 【ArcEngine】多用户同时编辑同一个版本数据的解决方法

    ArcMap或ArcEngine中,使用多个用户同时编辑default版本的时候,问题就来了,StopEditing 错误信息如下 FDO_E_VERSION_REDEFINED -214721714 ...

  6. ubuntu 查看系统信息

    1.系统信息 uname -a 显示linux的内核版本和系统是多少位的:X86_64代表系统是64位的. Linux field-ubuntu-18 4.15.0-20-generic #21-Ub ...

  7. 理解java调试的工作目录 working directory

    原文链接使用idea或者eclipse进行调试的时候会有Working directory配置: 我们创建工程,IDE会自动创建一个工程目录,假设工程名称为:TestProject,那么在会创建一个目 ...

  8. git推送文件到gitee

    注册gitee账号 设置姓名.个人空间地址 点击头像旁边的加号,新建仓库 安装git # 设置姓名和邮箱,姓名是注册gitee时设置的姓名,邮箱是注册gitee的邮箱 git config --glo ...

  9. 微信小程序 div选中效果

    ._left{ position: relative; margin-top: 40rpx; width: 40%; height: 350rpx; border-radius: 12rpx; tex ...

  10. Java的Class类及static块的执行时机

    要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工程由Class对象完成,它包含了与类有关的信息.Java使用Class对象来执行其RTTI,即使你执行的是类似转型 ...