听团里说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. Java 多线程与并发【原理第二部分笔记】

    Java 多线程与并发[原理第二部分笔记] 什么是Java内存模型中的happens-before Java内存模型,即JMM,本身是一种抽象的概念,并不是真实存在的,他描述的是一组规则或者说是一种规 ...

  2. Java基础技术基础面试【笔记】

    Java基础技术基础面试[笔记] String.StringBuilder以及StringBuffer三者之间的区别? 三者的区别可以从可变性,线程安全性,性能这三个部分进行说明 可变性 从可变性来说 ...

  3. AttributeError: module 'numpy' has no attribute 'num'

    AttributeError: module 'numpy' has no attribute 'num' 写在前面 总的来说,先看看自己用的计算方式是不是写对了先,多个一起使用的话记得都看看 通过想 ...

  4. spring-data-jdbc的基础使用(一)

    前言 很多人知道Mybatis,知道Jpa,但是对spring-data-jdbc可能了解的少之又少.注意我们这里说的是data-jdbc,而不是普通的jdbc.它拥有了类似jpa的一些特性,比如能够 ...

  5. 寻找写代码感觉(二)之 Spring Boot 项目属性配置

    一.前言 写代码就和恋爱一样,有反馈就要趁热打铁,搞完了项目搭建,接下来就来搞搞项目配置. 二.IDEA设置 1.编码配置 这里所说的就是代码的编码格式,你可以不设置,但是可能要面临的是,很多未知的麻 ...

  6. sqli-labs lesson 21-22

    less 21: username:admin password:admin 登录. 发现这里和之前不太一样.用到了base64加密而不是之前的明文了. 传送门:base64在线编码解码 所以要做的就 ...

  7. Java调用阿里云短信接口发送手机验证码

    前五步可参考阿里云服务文档:https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.4.1.2b152c42DoJ7 ...

  8. SpringBoot开启异步方法

    在启动类上加入@EnableAsync 异步方法 /** * 简单文本邮件 * @param to 收件人 * @param subject 主题 * @param content 内容 */ @As ...

  9. open62541(opcua)传输延迟探索小记

    缘起 将open62541作为中间件使用代替自定义数据的RPC,client通过订阅valueChange来接收数据.使用时发现有一些问题: 前后两次产生的数据相同时,不会触发valueChange ...

  10. 使用GZIP压缩网页内容(一)

    在JDK中提供了GZIP压缩,来压缩网页的内容,降低网络传输时候的字节数,到达浏览器端的时候,再解压,GZIP压缩之后传输耗费的流量大大降低,但是同时也不会降低用户体验. package day04; ...