jQuery 安全模型解释
前言
jQuery是一个JavaScript UI框架,它为许多DOM操作功能提供了一个抽象层。它为开发人员提供了一个友好的界面,可以快速,动态地更新DOM,而无需重新加载整个页面。这是 jQuery 的优点及概念。
但 jQuery 在有着诸多优点的同时,它本身也存一些安全问题,而所有的 jQuery 安全问题都围绕着那些被滥用的功能,jQurey 团队修改了行为来保护开发人员,下面来看看常见的 jQuery 安全问题的风险。
一、jQuery基础 - $()函数
$() 与 jQuery() 函数的最常见的书写形式是一样的,它返回一个jQuery对象:本质上要写入DOM的内容块。
在大多数情况下,jQuery函数将使用选择器,元素或对象作为参数。由哈希(#)表示的选择器是当前DOM中现有html内容的标识符。在下面的例子中,我们将使用jQuery html()函数来修改#myDivTag选择器的元素:
注意 “我的旧div标签文本!” 不显示。jQuery在运行时修改DOM来替换我们的div元素的文本:
再看看下面的例子:
根据这个例子可以看到,jQuery函数类似于getElementById()函数。但是有一个重要的区别:jQuery接受的不仅仅是一个选择器ID,包括HTML和脚本内容。比如:
二、jQuery 的 “XSS漏洞”
jQuery框架中没有已知的直接XSS漏洞(不包括jQuery插件)。但对于不受信任的内容引入到 jQuery 时,DOM (innerHTML,document.write()等)可能会被修改。
以下是最常见的漏洞代码示例:
在下面的页面中,我们可以直接在浏览器DOM中引入任意脚本,甚至绕过Chrome的 XSS审核:
这个XSS向量是很常见的,jQuery最终改变了选择器处理特性,为防止这种攻击。我们阻止以“#”开始的HTML字符串,并从window.location.hash 中开始阻止 XSS
模拟XSS问题:Bug 9521 - $("#<img src=x onerror=...>")
在以下使用jQuery 1.6.1的例子中,模拟了XSS错误。这将以#字符开头,从location.hash属性中消耗的脚本:
代码成功执行。
在下面的示例中,我们将jQuery升级到1.6.3并运行相同的代码:
代码不再运行,也就是说 jQuery-1.6.3 这个版本可以阻止像刚刚这种:Bug 9521 - $("#<img src=x onerror=...>") 的问题。
模拟XSS问题:Bug 11290 - $("element[attribute='<img src=x onerror=...>'")
前面提到的 jQuery接受的不仅仅是一个选择器ID,还包括HTML和脚本内容。 jQuery可能会错误地识别一个包含 < 作为HTML片段的选择器,并尝试解析并创建相关的元素
如图:我们引入了 jQuery-1.6.3.js 版本,并定义了<div data-val='<img src="x" onerror="console.log(xss!)">'></div>,最后执行结果如下:会发现 Bug 11290 代码被执行了
但当我换成 jQuery-1.12.4.js 版本时,Bug 11290 代码不会执行,而会报错:
三、jQuery的AJAX $ .get()响应处理弱点
jQuery ajax $ .get()函数(不要与.get()函数混淆)用于使您可能猜到的ajax GET请求。发现在1.12.0之前的版本会自动评估响应内容,如果包含在响应中,则可能会执行脚本。
此行为可能会促进应用程序中的两个潜在漏洞。
- 将跨域请求交给不受信任域的应用程序可能会无意中执行脚本,否则可能会被视为安全内容。
- 如果可以将脚本注入到数据源中,则可以在XSS攻击中利用对可信API端点的请求。
示例:当我们在页面上发送请求:$.get('http://sakurity.com/jqueryxss') 时,攻击者可能会用 type="text/javascript" 来回应我们,并写上恶意的执行代码,如:
模拟 $.get()响应 问题:jQuery issue 2432 - 3rd party $.get() auto executes if content type is text/javascript
test.html 页面:
在 https://sakurity.com/jqueryxss 网站上恶意弹出一个层
最终 test.html 页面执行效果:会执行并弹出 https://sakurity.com/jqueryxss 网站上声明的恶意脚本
总结:
像几乎所有的现代软件一样,jQuery旨在强大而多功能。有无数安全和合法的功能,在滥用时可能会导致安全漏洞。这里描述的jQuery问题都是软件的结果,该软件按照设计运行,但是被不正确地执行。
另附上链接:http://research.insecurelabs.org/jquery/test/ 可查看 jQuery 各版本关于 Bug 9521、Bug 11290、jQuery issue 2432 问题
本文参考文章链接:https://www.virtuesecurity.com/blog/jquery-security-model/