渗透测试步骤

(1)要测试应用程序如何使用XMLHttpRequest处理跨域请求,测试员应尝试添加一个用于指定其他域的Origin消息头,并检查返回的任何Access-Control消息头。允许任何域或指定的其他域进行双向访问导致的安全隐患与上述Flash跨域策略导致的安全隐患相同。

(2)如果有任何跨域访问受到支持,则测试员还应使用OPTIONS请求来了解到底允许哪些消息头和其他请求。

除可能允许外部域进行双向交互外,XMLHttpRequest的新特性还可能导致利用Web应用程序的特定功能的新型攻击,或新型常规攻击。

如第12章所述,一些应用程序使用XMLHttpRequest向在URL参数中、或在片断标识符后指定的文件提出异步请求。检索到的文件动态加载到当前页面的<div>中。由于以前不可能使用XMLHttpRequest提出跨域请求,因此也没有必要验证所请求的项目是否在应用程序自身的域上。利用新版本的XMLHttpRequest,攻击者可以在其控制的域上指定一个URL,从而对应用程序用户实施客户端远程文件包含攻击。

更常见的是攻击者可以借助XMLHttpRequest的新特性,利用恶意或被攻破的网站,通过访问网站用户的浏览器来实施攻击,即使这时跨域访问已遭到禁止。跨域端口扫描表明,使用 XMLHttpRequest尝试向任意主机和端口提出请求,并观察响应的时间差异,可以推断所请求的端口是否已打开、关闭或被过滤。此外,与传统的生成跨域请求的方法相比,使用XMLHttpRequest可以更快速地实施分布式拒绝服务攻击。如果目标应用程序禁止跨域访问,则需要在URL参数中增加一个值,以确保每个请求针对不同的URL,因此实际上由浏览器提出。

13.3.3 通过代理服务应用程序跨域

一些公开发布的Web应用程序提供高效的代理服务功能,允许从不同域检索内容,但服务于代理Web应用程序中的用户。Google翻译(GT)就是一个典型的例子,它可以请求指定的外部URL并返回其内容,如图13-2所示。(虽然翻译引擎可能会修改检索到的响应中的文本,但基本的HTML标记和任何脚本代码仍保持不变。)

img411

图13-2 Google翻译可请求外部URL,并返回其内容,响应中的文本将被翻译成指定的语言

如果两个不同的外部域均通过GT应用程序访问,这时可能会一个有趣的问题。这种情况下,在浏览器看来,来自每个外部域的内容将驻留在GT域中,因为这是浏览器从中检索内容的域。虽然两组内容均驻留在同一个域中,它们之间可以进行双向交互(如果这种交互也通过GT域实施的话)。

当然,如果用户登录某个外部应用程序,然后通过GT访问该应用程序,则该用户的浏览器会正确地将GT视为其他域。因此,用户用于外部应用程序的cookie将不会通过GT在请求中发送, 并且也不可能进行任何其他交互。同样,恶意网站也无法利用GT轻松攻破其他应用程序上的用户会话。

但是,网站可以利用GT等代理服务行为与位于其他域上的应用程序的公开、未授权的区域进行双向交互。Jikto就是这样的一种攻击。Jikto是一个概念验证蠕虫,通过在Web应用程序中查找并利用永久性XSS漏洞,从而在应用程序之间进行传播。Jikto代码的基本运行机制如下。

img002 初次运行时,该脚本会检查其是否在GT域中运行。如果不是,它会通过GT域加载当前URL,从而将自己传送到GT域中。

img002 该脚本通过GT请求外部域中的内容。由于该脚本自身在GT域中运行,它可以通过GT与任何其他域上的公开内容进行双向交互。

img002 该脚本以JavaScript实现一个基本的Web扫描程序,在外部域中探查永久性XSS漏洞。公告牌等可以公开访问的功能中可能存在这类漏洞。

img002 确定适当的漏洞后,该脚本将利用此漏洞将它的一个副本加载到外部域中。

img002 其他用户访问被攻破的外部域时,该脚本开始执行,并且这个过程会不断自动重复。

Jikto蠕虫会设法利用XSS漏洞来传播自己。但是,这种通过代理服务合并域的基本攻击技巧并不取决于所针对的单个外部应用程序中的任何漏洞,也无法进行有效防御。此外,它还是一种有用的攻击技巧。测试员也可以通过它来了解如何在非常规情况下应用同源策略。