本文将向读者介绍了利用Flash参数注入的新型攻击技术,最重要的是该技术能够造成永久性的攻击效果。鉴于目前的Web应用采用的常规防御机制尚不足以抵御这种攻击,所以希望能引起Web开发人员的高度重视。本文最后给出了有关的安全建议。
一、综述
本文将向读者介绍一种新型的攻击,我们称之为FPI,即Flash参数注入攻击。此前,安全专家曾发现,如果攻击者能访问和控制Flash的全局参数的话,他们就能够完成诸如经由Flash的跨站点脚本攻击、跨站flash以及修改Flash视频的信息流等等。这些攻击需要能够直接访问Flash视频以及通过URI对有关参数进行设置。当Flash视频是嵌入到HTML页面中并且无法访问原始DOM的时候,攻击者将无法发动这些攻击。
许多时候,Flash文件只能在原始的HTML中运行,而不能作为URI加载,这样的话,就无法进行常规的跨站flash攻击。本文展示了一些技术,在电影被嵌入到一个原始的HTML页面的时候,攻击者可以用这些技术来注入全局Flash参数。这些注入的参数不仅可以赋予攻击者对页面DOM的完全控制权,还能控制Flash视频内部的其它对象。这个可以利用Flash视频及其所在的HTML 页面之间的交互发动更多精心策划的各种攻击。由此,本文所述的FPI技术能够增加了Flash攻击的适应面,也就是说会有更多的网站面临Flash攻击的危险。
本文中,我们将论述五种不同的技术。首先,我们将描述一种简单的基于DOM的注入技术,提供该技术,攻击者能够使用原始HTML 页面的URI来注入Flash参数,从而逃避诸如Web服务器的IDS以及IPS保护机制的检测。本例将向大家证明,经常用于为URI消毒的encodeURI函数不足以抗击该攻击。第二种技术将利用HTML表单或者URI参数来注入全局Flash参数。第三种技术展示如何利用Flash视频的引用来覆盖这些参数的值。第四种技术为大家展示如何利用HTML的对象标签的属性实现FPI。最后,第五种技术为大家说明一种持久性Flash参数注入攻击方法。这种技术致使注入的内容成为持久性数据,这意味着在不同的会话中、甚至在允许注入的安全漏洞已被修复之后,注入的内容仍然有效。实际上,本文涉及的一些技术已被广泛应用于现实中的各种应用程序。
二、背景知识
Adobe Flash被广泛应用于为Web页面提供生动性和互动性元素。Flash视频不仅可以嵌入到HTML页面中,而且还可以在独立的Flash Player中播放。
Flash视频可以包含简单的脚本,这些脚本通常用ActionScript语言编写。这些脚本用来增强Flash视频的性能,还用来创建更加动态的Web页面以及更加丰富多彩的互联网应用程序。
1.在HTML中嵌入Flash视频
可以用下列方式在一个HTML页面内嵌入Flash视频:
图1 在HTML中嵌入Flash |
当访问该页面时,浏览器会自动下载该Flash视频,并在该页面内为用户播放该Flash视频。当嵌入到HTML页面中时,Flash视频就具备了访问该页面的DOM的权限,这意味着可以通过该电影的ActionScript代码来执行JavaScript代码。因为电影能够访问整个DOM,所以该电影也就能访问加载该Flash的域为该用户的计算机设置的Cookie了。
将Flash视频嵌入到一个HTML页面时,还有一种方法可用,那就是当用户浏览Flash视频的URL时,直接由浏览器将Flash视频嵌入页面。在这种情况下,会创建一个“幽灵”HTML页面,它将Flash视频作为一个嵌入对象存于其中,这个页面如下所示:
图2 指定Flash下载地址的HTML |
注意,在这种情况下,由于原始的Flash视频被嵌入一个HTML页面,所以这个Flash视频继续嵌入到上述HTML页面中,因此也就无法访问上述HTML页面的DOM了。
2.向Flash视频传递参数
有多种方法可以从嵌入的对象中向Flash视频传递参数。传递给电影的各个参数可以在Flash视频内部用作影片片段对象“_root”下的全局变量。下面是展示如何使用名为“a”的全局参数的ActionScript2代码示例:
图3 读取全局变量的ActionScript 2代码 |
这在Flash视频中是一段非常常见的代码,攻击者可以利用这样的代码实现跨站点脚本攻击、跨站flash攻击以及其他类型的攻击。下面我们将会介绍三种不同的方法来利用这些代码。
方法1:直接引用
传递参数的第一个方法是直接给出Flash文件地址,然后在URI本身中传递参数,这跟利用GET方式传递HTTP参数非常类似。举例来说,可以像下面这样来利用直接引用传递参数:
http://URL/myMovie.swf?a=5&b=hello
在本例中,有两个参数传送给了Flash文件。第一个参数是“a”,它的值为“5”;第二个参数是“b”,其值为“hello”。使用这种方法时,Flash文件并没有嵌入到原始HTML页面,而是嵌入到了自动生成的“幽灵”HTML页面之中。
方法2:嵌入URI
第二种方法是利用嵌入对象的URI来传递参数,举例如下:
图4 利用嵌入的URI传递参数 |
在这种情况下,Flash文件仍旧是嵌入到了原始HTML页面之中。
方法3:利用“flashvars”属性
第三种方法要用到“flashvars”属性,这个属性可以在 "OBJECT"标签中加以指定,或者作为"parameter"标签加以指定。下面是一个嵌入式Flash文件的例子,它可以接收嵌入在一个HTML页面内参数:
图5 利用“flashvars”传递参数 |
就像前面的方法一样,这种方法可用于向嵌入在在一个HTML页面内的Flash视频传递参数。如本文开头提到的那样,迄今为止已知用于覆盖全局Flash参数的方法只有直接访问Flash视频并通过URI传递参数,即本文所示的第一种方法。这种攻击方法不能访问原始HTML页面(即嵌入Flash的页面)的DOM,所以对攻击范围有所限制。
三、新型攻击技术
下面我们将介绍一种新型方法,它可以用来覆盖全局Flash参数的值,即使Flash视频是被嵌入在原始的HTML页面的情况下,仍然能够获得对该页面的DOM的访问权限。我们将演示一些完成Flash参数注入攻击的技术。首先,我们将从一些简单的技术入手,您将看到例如“encodeURI”之类的消毒函数并不能提供必要的保护。之后,我们会介绍一种持久性Flash参数注入攻击技术,该方法不仅可以用于感染Flash文件,重要的是用户每次播放Flash视频时都会引发Flash参数注入攻击。持久性FPI会导致受害者每次观看有漏洞的Flash文件时都会受到攻击。即使Flash文件本身的安全漏洞已经修改之后,受害者仍受到该攻击的影响。
⒈基于DOM 的Flash参数注入攻击
当“document.location”变量被用作Flash参数的一部分的时候,可以实现这种形式的FPI。下面是有漏洞的HTML文件的一个片段:
图6 用于创建Flash对象的JavaScript代码 |
正常使用这个网页的时候,上述的JavaScript代码会生成以下HTML页面:
图7 由JavaScript代码生成的HTML |
在这种情况下,该HTML页面的开发人员将页面的URL传递给了全局参数“location”中的Flash文件了。开发人员意识到Web 应用程序的安全问题后,使用了“encodeURI”函数来避免诸如基于DOM的跨站点脚本攻击之类的攻击。
尽管开发人员非常谨慎,但是攻击者仍然能够诱骗毫无戒心的受害者单击如下所示的链接:
http://URL/index.htm#&globalVar=e-v-i-l
单击以上链接后,将导致如下所示的HTML页面:
图8 攻击引起的HTML |
这时候,有两个变量传送给了该Flash文件。第一个变量是“location”,其值为“http://URL/index/htm#”;第二个变量是“globalVar”,其值为“e-v-i-l”。这意味着,攻击者可以控制嵌入原始HTML页面内部的Flash文件的所有全局Flash变量。
事实上,利用“?”代替“#”的话也行,它也会导致同样的攻击。然而,使用井号(#)的优点在于其后的数据不会发送给服务器,从而致使受攻击的站点上的IDS或者IPS觉察不到攻击的发生。
这种攻击之所以得手,是因为JavaScript函数“encodeURI”没有对所有字符全部进行编码,例如“&”和“?”等字符。虽然该函数广泛用于基于DOM 的跨站脚本攻击的防范之上,但是不能防范基于DOM 的Flash参数注入攻击。在这种情况下,应该按照具体情况来采取消毒措施,比如使用“escape”或者“encodeURIComponent”等函数。
⒉反射式Flash参数注入攻击
当Flash视频的名称作为表单或者URL 参数暴露在外的时候,应用程序就会易受Flash参数注入的攻击。攻击者可以控制装入的Flash视频,以加载一个恶意Flash视频,即使已经采取了防范措施,例如只允许从一个特定的域装载合法的电影,但是指定Flash下载地址会使覆盖嵌入HTML页面内部的Flash视频全局参数变得更容易。例如,下面是在一个Web服务器上的Perl脚本,其中“params”是一个存放所有相关HTML参数的关联数组:
图9 创建具备动态Flash视频的HTML的Perl代码 |
在上面的代码中,Flash视频的名称取自请求中的表单或者URL参数,并将其作为要加载的Flash视频的名称放到生成的HTML页面中。攻击者可以创建如下所示的攻击性链接来覆盖一些全局Flash参数:
http://URL/index.cgi?movie=myMovie.swf?globalVar=e-v-i-l
注意,影片的名称包含了一个问号,其后就是将传递给Flash文件的各个参数。当受害者点击该链接时,会生成如下所示的HTML代码,并被发给受害者:
图10 由CGI脚本生成的带有注入参数的HTML |
浏览器将根据攻击者提供的额外的全局参数来加载嵌入的Flash文件。为了一次控制多个参数,攻击者需要使用URI编码的&号将这些参数分开即可。下面是一个用来一次注入多个参数的恶意链接:
http://URL/index.cgi?movie=myMovie.swf?globalVar=e-v-i-l%26otherVar=b-a-d
虽然Web 应用程序开发人员确保了影片的名称是从一个特定的域装入的,但是仍然存在Flash参数注入攻击安全漏洞。
可以实现这种攻击的另一种方法是,在另一个Flash视频内部控制被加载的Flash视频的名称。下面是一个容易受到这种攻击的ActionScript2示例代码。这段代码将一个Flash文件加载到现有的Flash文件之中:
图11 用于加载内部Flash文件的ActionScript代码 |
如果使用下列攻击性链接来加载Flash文件:
http://URL/myMovie.swf?moviename=internalMovie.swf?globalVar=e-v-i-l
则可以通过将全局参数“globalVar”设为“e-v-i-l”来加载内部Flash文件。
⒊反射式Flash参数注入攻击(附带FlashVars)
当使用“flashvars”属性来传递的一个或多个参数来源于未经严格消毒的HTML参数的时候,有可能导致通过HTML参数发动的FPI攻击。让我们假设在服务器上有一个用Perl编写的CGI脚本包含下列所示的代码(关联数组params存放传递给页面的所有参数):
图12 创建带有一个Flash对象的HTML的Perl CGI代码 |
如果攻击者可以设法让受害者单击以下恶意链接:
http://URL/index.cgi?language=English%26globalVar=e-v-i-l
上面链接中的“%26”将被编码成一个与符号(&),从而引起产生以下HTML代码:
图13 由带有一个附加的参数的CGI代码所生成的HTML |
如今,攻击者已经控制了嵌入到了原始HTML页面之中的Flash文件的所有全局Flash变量。如果在嵌入的URI中将参数传递给Flash视频的话(即向Flash文件传递参数的第二种方法),也可以完成此种攻击。
4.Flashvars注入攻击
在某些情况下, "OBJECT"标签的一些属性是作为参数接收的。例如,Flash视频的宽度和高度可以通过以下用Perl编写的CGI脚本来动态创建(“params”是一个存放所有HTML参数的关联数组):
图14 创建具有动态宽度和高度的Flash对象的Perl-CGI脚本 |
在本例中,参数“width”和“height”未经严格消毒的就被直接传递到输出的HTML文件中了。攻击者可以设法让不知情的受害者单击以下攻击性链接:
http://URL/myMovie.cgi? width=600&height=600%22%20flashvars=%22globalVar=e-v-i-l
这个URL将被编码成:
http://URL/myMovie.cgi? width=600&height=600" flashvars="globalVar=e-v-i-l
单击这个链接会导致向客户端的浏览器发送如下所示的HTML页面:
图15 由CGI脚本生成的HTML |
通过这种方式,可以在web页面的创建者在不允许向Flash文件传递参数的情况下,将“flashvars”属性注入到"OBJECT"标签中。
⒌持久性Flash参数注入攻击
共享的本地Flash对象,也就是之前所称的Flash Cookie将允许Flash视频保存供之后的会话使用的数据。共享对象内部的数据不仅可以保存下来,并且还能加载到Flash视频之中。下面是一个保存共享Flash对象内的数据的例子:
图16 存储共享对象内部的数据 |
而下面是装载来自共享对象的数据的示例:
图17 加载来自共享对象的数据 |
如果共享对象保存了由用户输入并且随后又被插入至具有潜在危险性的本地函数中的话,就可能发生持久性Flash参数注入攻击,每当Flash视频被加载时,恶意代码都会被注入到Flash文件并执行。下面是易受持久性Flash参数注入攻击入侵的示例代码:
图18 易受持久性FPI攻击的Flash |
在这个Flash文件中,如果全局变量“_root.flashfile”被设置为undefined,那么它的值不是通过读取存放在一个共享对象(如果有的话)的数据来设置,就是通过一个缺省值进行设置。这个值随后存储到一个共享对象中,并用作具有潜在危险性的本地函数“getURL”的一个参数。
如果一个没有对此产生怀疑的用户在攻击者的诱骗下点击了如下所示的恶意链接:
http://URL/vulnerable.swf?flashfile=javascript:alert(document.domain)
那么后果就不是受害者的浏览器以具有该有弱点的Flash文件的域的上下文来执行一次所示JavaScript代码就过去了,而是每次加载该Flash时,不管是否直接引用了它或者将其嵌入该域内部,这段JavaScript脚本都会再次执行。部署在有弱点的站点上的跟踪设备,如IDS或者IPS,只能发现感染情况,却无法找出原因,甚至稍作手脚就可以让它们觉察不到这一切的发生。随后对站点的请求将完全正常,但是受害者的浏览器上仍会遭受这种攻击。
这个攻击以前的Flash攻击的攻击范围,并使它们变成持久性攻击。
利用这种方式,一个精明的攻击者以只在Flash嵌入到HTML页面内部时才发动攻势。第一次执行被用于感染受害者。随后,每次代码被执行时,它将检查Flash是否被嵌入到正确的HTML页面,然后再开始发起攻势。
这种攻击最大的影响在于它的持久性。即使将来对该代码打了防止注入参数值的补丁,原先注入的值还是会无限期地存在于共享对象之内,从而每当载入该Flash文件时都会再次导致攻击的发生。
四、新型攻击带来的影响
本文所介绍的各种技术具有一个主要优点在于,由于可以攻击嵌入到原始的HTML页面的Flash视频,所以可以利用Flash文件和父页面之间的交互作用来实现更加精巧的攻击。 即使Flash视频的创建者不允许从原始的HTML页面之外运行该Flash文件,这些攻击仍然奏效。
五、安全建议
当在Web页面嵌入Flash视频的时候,Web应用程序开发人员必须仔细对输入进行消毒处理。开发人员必须意识到,JavaScript函数“encodeURI”并不能够对用于全局Flash参数的输入进行彻底的消毒。 应该对此使用一种专门的消毒方法,当然,如果有一个能够精确描述哪些字符是可以接受的输入的安全模型就最好了,因为白名单相对要安全。
易受基于DOM的FPI攻击的Web应用程序不能假定他们的客户端没有受到攻击,即使有IPS或者IDS之类的安全机制在监视流量也不行,因为攻击片段(URI中井号[#]之后的部分)是不会被浏览器发送给Web服务器的,所以Web服务器根本就无法检测到该攻击。
Flash视频开发人员必须意识到,将收到的信息作为全局参数保存在本地共享对象中会导致持久性Flash参数注入攻击。易受持久性FPI攻击的Flash视频将一直受到由覆盖全局参数所引起的Flash攻击的影响,这些攻击包括跨站点脚本攻击、跨站flash攻击,等等。 即使FPI安全漏洞被修复之后仍然如此。在这种情况下,必须修复Flash文件本身的漏洞,并对其重新进行编译,同时还要改变本地共享对象的名称,才能彻底解决问题。
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交