背景阅读
重申一下关于统一资源定位符(URL, Uniform Resource Locator)各个部分的名称
漏洞相关参考资料
- (GFW) https://web.archive.org/web/20110608021534/https://bugs.jquery.com/ticket/9521
- (GFW) https://web.archive.org/web/20110611051613/http://ma.la:80/jquery_xss/
- 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插件
https://github.com/rodbegbie/threequarters/blob/master/htdocs/design/threequarters.js#L4-5
https://github.com/vitch/jScrollPane/blob/master/script/jquery.jscrollpane.js#L1013-1016
https://github.com/kastner/audio-sinner/blob/master/public/javascripts/app.js#L19
https://github.com/steadicat/labels/blob/master/tabs.js#L5-7
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标签。
漏洞复现
|
|
- 新建一个浏览器标签页
粘贴类似如下内容到地址栏
1file:///C:/Users/Test/Desktop/jquery_test/client_test/test_jquery_demo2.html#<img src=1 onerror=alert('Qihoo360')>按回车
其他资料
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