ActionScript
AS是基于ECMAScript的语言,为了交互的需要flash应用引入ActionScript。ActionScript一共有三个版本,其中3.0较之前两个版本变化很大。ActionScript 代码可用来向文档中的媒体元素添加交互式内容。例如,可以添加代码以便用户在单击某按钮时显示一幅新图像,还可以使用 ActionScript 向应用程序添加逻辑。逻辑使应用程序能够根据用户的操作和其它情况采取不同的工作方式。和其他的语言一样,如果没有规范的编码同样会产生安全问题。
a) 未初始化的flash变量
Flash变量是swf开发者用来从web页面接受数据的,一般是通过Object或者Embed标签来进行传递。例如:
<object width="550" height="400" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,124,0"> <param name="movie" value="somefilename.swf"> <param name="FlashVars" value="var1=val1&var2=val2"> <embed src="somefilename.swf" width="550" height="400" FlashVars="var1=val1&var2=val2"> </embed>
</object>同样可以用下面这种方式来传递:http://www.example.org/somefilename.swf?var1=val1&var2=val2在as2.0中,任何没有初始化的全局变量都被认为是flash变量。其中全局变量是那些以_root、_gloabal、_level0为前缀的变量。也就是说:_root.varname 如果其在as代码中没有被初始化,那么就可以同过如下方式来重写:http://victim/file.swf?varname=valueb) 不安全的方法
在调用不安全的方法,而且对传入的参数没有做有效性检查时,就会出现安全问题,不安全方法有:loadVariables()
loadMovie() getURL() loadMovie() loadMovieNum() FScrollPane.loadScrollContent() LoadVars.load LoadVars.send XML.load ( 'url' ) LoadVars.load ( 'url' ) Sound.loadSound( 'url' , isStreaming ); NetStream.play( 'url' ); flash.external.ExternalInterface.call(_root.callback)
htmlTextFlash安全策略
a) 服务端crossdomain.xml文件:
flash在跨域时唯一的限制策略就是服务端的crossdomain.xml文件,该文件限制了flash是否可以跨域读写数据以及允许从什么地方跨域读写数据。位于www.a.com域中的swf文件要访问[url]www.b.com[/url]的文件时,swf的虚拟环境flash控件首先会检查www.b.com服务器目录下是否有crossdomain.xml文件,如果没有,则访问不成功;若crossdomain.xml文件存在,且里边设置了允许www.a.com域访问,那么通信正常。所以要使Flash可以跨域传输数据,其关键就是crossdomain.xml。关于其详细介绍可以查看这里。一些crossdomain.xml实例可以访问如下连接:
http://www.renren.com/crossdomain.xml
http://www.youku.com/crossdomain.xml<cross-domain-policy>
<allow-access-from domain="*.xiaonei.com"/>
<allow-access-from domain="xiaonei.com"/>
<allow-access-from domain="*.renren.com"/>
<allow-access-from domain="renren.com"/>
<allow-access-from domain="*.kaixin.com"/>
<allow-access-from domain="kaixin.com"/>
<allow-access-from domain="*.xnimg.cn"/>
<allow-access-from domain="xnimg.cn"/>
</cross-domain-policy>这是一个典型的crossdomain.xml文件,最重要的应该数allow-access-from,flash应用通过检查该节点的属性值,确认能够读取本域内容的flash文件来源域。
* 号,如<allow-access-fromdomain="*" />,表示匹配所有域和可跨域访问本域上的内容。
后接后缀的星号,表示只匹配那些以指定后缀结尾的域,如*.renren.com,那么a.renren.com,b.renren.com都可以访问该域下的内容。
b) 客户端
在一个页面引入一个flash时,一般的做法是下面这种形式:
------begain-----------<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
name="Main" width="1000" height="600" align="middle" id="Main">
<embed flashvars="site=&sitename=" src='Loading.swf?user=453156346&key=df57546b-c68c-4fd7-9f9c-2d105905f132&v=10950&rand=633927610302991250' width="1000" height="600"
align="middle" quality="high" name="Main" allowscriptaccess="sameDomain" type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>-------end-------
由于flash的强大,并且在页面元素里基本等同于script这种危险的标签,对于这点,flash已经有所考虑,在引入flash的时候flash提供了控制属性,其中与安全最为关键的是AllowScriptAccess属性和allowNetworking属性。其中AllowScriptAccess控制flash与html页面的通讯,可选的值有:
- always:对与html的通讯也就是执行javascript不做任何限制
- sameDomain:只允许来自于本域的flash与html通讯,这是默认值
- never:绝对禁止flash与页面的通讯
默认情况下的选项是sameDomain,这个时候某些场景下看起来也是足够安全了,但是我们还是能看到经常有程序允许将这个选项设置为always,而即使是sameDomain也不是在所有场景下都安全的。
Flash跨站
上面了解了很多flash的安全策略,那么当策略没配好出现安全问题时,我们如何实现flash跨站呢。
场景一:
如果a域下有crossdomain.xml,而且crossdomain.xml的allow-access-fromdomain设置为all,a域可以上传swf文件, html文件的embed标签allowscriptaccess属性为sameDomain或者always,那么我们就可以上传一个包含恶意as脚本的swf文件,从而造成一次flash跨站。下面是一个弹出cookie的swf文件(ie无效)
http:/www.xxx.com/flash_xss/test.swf
场景二:
a域下已经有一个swf文件,html文件的embed标签allowscriptaccess属性为sameDomain或者always,而且这个swf可以接受外界的参数,那么我们就可以通过给swf传递恶意的参数从而形成基于flash的反射型跨站。具体案例:
http://www.xxx.org/search.php?q=flash+xss
常用工具
a) flash 8.0
Flash 8.0包含了许多种功能,如预置的拖放用户界面组件,可以轻松地将 ActionScript 添加到文档的内置行为,以及可以添加到媒体对象的特殊效果。这些功能使 Flash 8.0不仅功能强大,而且易于使用。可以在这里找到关于flash 8.0的使用教程,点击查看。这里是一个可以执行as脚本的swf的例子:
b) SWFScan
可以使用 SWFScan进行反编译,这样就可以源码级别的swf,可以进行白盒分析。