http://mdsec.net/auth/409/
要利用本示例,请下载2.0版本的Firefox。请从以下URL下载该版本的Firefox:
www.oldapps.com/firefox.php?old_firefox=26
3.变量分配
以一个社交网络应用程序为例,该应用程序大量使用异步请求来执行各种操作,如更新状态、添加好友和发布评论。为提供快速无缝的用户体验,一部分用户界面使用动态生成的脚本加载。
为防止标准的CSRF攻击,这些脚本中包含了反CSRF令牌,以便在执行敏感操作时使用。利用在动态脚本中插入这些令牌导致的漏洞,攻击者可以通过跨域包含相关脚本来捕获令牌。
例如,假设wahh-network.com上的应用程序返回包含以下代码的脚本:
一个用于跨域捕获nonce值的简单概念验证攻击如下所示:
在另一个示例中,令牌的值在函数中进行分配:
这时,攻击者可以实施以下攻击:
针对不同的变量分配情形,攻击者可以采用各种其他技巧。在某些情况下,攻击者可能需要在一定程度上模仿目标应用程序的客户端逻辑,才能包含该程序的部分脚本并捕获敏感数据。
就在不久之前,E4X成为一个快速发展的领域,为应对在各种实际应用程序中发现的各种可利用条件,开发者一直在对浏览器进行更新。
E4X是对ECMAScript语言(包括JavaScript)的扩展,后者可为XML语言添加本地支持。目前,当前版本的Firefox浏览器已实施了E4X。尽管其中的漏洞已经修复,但Firefox在E4X的处理方式上仍存在漏洞,可用于跨域捕获数据。
除了允许在JavaScript中直接使用XML语法外,用户还可以在E4X嵌入代码,以调用XML中的JavaScript:
E4X的这些特性导致了两个严重的后果,可用于实施跨域数据捕获攻击:
结构正确的XML标记将被视为不会分配给任何变量的值;
嵌入{…}块中的文本将作为JavaScript执行,用于对XML数据的相关部分进行初始化。
许多结构正确的HTML也是结构正确的XML,意味着它们可以由E4X进行处理。此外,许多HTML都在{…}块中包含提供敏感数据的脚本代码。例如:
在早期版本的Firefox中,攻击者可以对类似于上面的完整HTML响应执行跨域脚本包含,并在自己的域中执行一些嵌入式JavaScript代码。
此外,利用与之前所述的CSS注入攻击类似的技巧,攻击者有时可以在目标应用程序的HTML响应中的适当位置注入文本,在该响应中的敏感数据周围插入任意的{…}块。然后,攻击者可以跨域包含整个响应,将其作为脚本执行,以捕获其中包含的数据。
上述任何一种攻击都可以在当前版本的浏览器中实施。随着这个过程不断继续,浏览器对于最新语法结构的支持也进一步扩展,在新的浏览器功能推出之前,针对不易于受到上述攻击的应用程序,很可能会出现新型跨域数据捕获攻击。
5.防止JavaScript劫持
实施JavaScript劫持攻击必须满足几个前提条件。因此,要防止这种攻击,必须违反其中至少 一个前提条件。要获得深层保护,我们建议在防御攻击时同时采用多种防范措施。
至于执行敏感操作的请求,应用程序应使用标准的反CSRF防御来阻止跨域请求返回任何包含敏感数据的响应。
当应用程序从它自己的域中动态执行JavaScript代码时,并不仅限于使用<script>标签来包含脚本。因为请求为本站请求,客户端代码可以使用XMLHttpRequest检索原始响应并进行其他处理,然后再将其作为脚本执行。这意味着,应用程序可以在响应的开始部分插入无效或有问题的JavaScript,客户端应用程序在处理脚本前,将会删除这些内容。例如,以下脚本在使用脚本包含执行时将导致无限循环,但如果使用XMLHttpRequest访问,则可以在执行之前删除:
由于应用程序可以使用XMLHttpRequest检索动态脚本,因此它也可以使用POST请求完成这个任务。如果应用程序仅接受使用POST请求访问可能易受攻击的脚本代码,它就能够阻止第三方站点将它们包含在<script>标签内。