测试员应始终检查所测试的任何Web应用程序中的/crossdomain.xml文件。即使应用程序本身不使用Flash,但如果向另一个域授予权限,则由该域发布的Flash对象将可以与发布策略的域进行交互。
如果应用程序允许无限制访问(通过指定<allow-access-from domain=“*” />),则任何其他站点均可以执行双向交互,从而控制应用程序用户的会话。这样,其他域就可以检索全部数据,并执行任何用户操作。
如果应用程序可以访问同一组织使用的子域或其他域,则这些域当然可以与应用程序进行双向交互。这意味着,攻击者可以利用这些域上的XSS等漏洞来攻破授予权限的域。此外,如果攻击者能够在任何域上购买基于Flash的广告,就可以使用其部署的Flash对象来攻破授予权限的域。
一些策略文件会披露内联网主机名或其他可能对攻击者有用的敏感信息。
此外,需要注意的是,Flash对象可能会在应从中下载策略文件的目标服务器上指定一个URL。如果默认位置没有顶级策略文件,Flash浏览器会尝试从该指定的URL处下载策略文件。对此URL的响应必须包含格式有效的策略文件,并必须在Content-Type消息头中指定一种XML或基于文本的MIME类型,才能得到处理。当前,网络上的大多数域都没有在/crossdomain.xml位置发布Flash策略文件,这可能基于以下假设:在没有策略的情况下,默认行为是禁止任何跨域访问。但是,这一假设忽略了第三方Flash对象指定用于下载策略的定制URL的可能性。如果应用程序包含任何功能,可被攻击者用于在应用程序域上的URL中插入任意XML文件,则该应用程序可能就易于受到这种攻击。
2.同源策略与Silverlight
用于Silverlight的同源策略在很大程度上基于由Flash实施的策略。Silverlight对象的来源由加载这些对象的URL所在的域决定,而不是由加载这些对象的HTML页面的URL决定。
Silverlight与Flash的一个重要区别在于,Silverlight不会基于协议或端口隔离来源,因此通过 HTTP加载的对象可以与同一域上的HTTPS URL交互。
Silverlight使用自己的跨域策略文件,地址为/clientaccesspolicy.xml。由www.microsoft.com发布的Silverlight策略文件如下所示:
上面介绍的针对Flash跨域策略文件的注意事项同样适用于Silverlight,但是,Silverlight不允许对象为策略文件指定非标准的URL。
如果服务器上没有Silverlight策略文件,Silverlight浏览器扩展会尝试从默认位置加载有效的Flash策略文件。不过,如果存在策略文件,则扩展会处理该文件。
3.同源策略与Java
Java在来源之间实施隔离,它实施隔离的方式在很大程度上基于浏览器的同源策略。和其他浏览器扩展一样,Java applet对象的来源由加载这些对象的URL所在的域决定,而不是由加载这些对象的HTML页面的URL决定。
Java同源策略的一个重要不同在于:某些情况下,与来源域共享IP地址的其他域将被视为“同源”。在某些共享主机的情况下,这可能会导致一定程度的跨域交互。
当前,Java并不限制一个域发布允许与其他域进行交互的策略。
按照最初的设计,XMLHttpRequest仅允许向与调用页面的来源相同的来源提出请求。随着HTML5的出现,这一技术已得以修改,从而可以与其他域进行双向交互,前提是被访问的域为交互提供权限。
跨域交互的权限通过一系列新的HTTP消息头来实现。如果某个脚本尝试使用XMLHttpRequest提出跨域请求,处理该请求的方式将因请求的具体内容而异。
对于“常规”请求,即可以使用现有的HTML结构跨域生成的请求,浏览器将提出请求,并检查生成的响应消息头,以确定是否应允许调用脚本访问该请求的响应。
其他无法使用现有的HTML生成的请求,如那些使用非标准HTTP方法或Content-Type、或添加了定制HTTP消息头的请求,将进行不同处理。浏览器会首先向目标URL提出一个OPTIONS请求,然后检查响应消息头,以确定是否应允许那些请求。
在上述两种情况下,浏览器都会添加一个Origin消息头,用于指示尝试提出跨域请求的域。
要确定可能执行双向交互的域,服务器的响应中应包含Access-Control-Allow-Origin消息头,其中包括以逗号分隔的允许的域列表和通配符:
在第二种情况下,如果已使用OPTIONS请求预先验证了跨域请求,则可以使用以下消息头来指示尝试提出的请求的具体内容:
为响应OPTIONS请求,服务器可以使用以下消息头来指定允许提出的跨域请求的类型: