0x01 Flash简介

Adobe Flash是一种交互式矢量多媒体技术,被广泛应用于Web网站中,以增加特殊的动画效果和网页交互能力。

Flash Player与SWF

要想运行Flash程序,浏览器中必须安装Flash Player或Shockwave Player。

Flash Player是一款多媒体程序播放器,能够在各种浏览器、OS和移动设备上使用,兼容性高,应用广泛。

SWF(Shock Ware Flash)是Flash的专用格式,使用Flash Player即可运行SWF文件。此外,SWF文件可以直接嵌入到网页中去执行。

浏览器中SWF解释器如图:

可看到浏览器运行Flash应用程序的步骤:

  1. 浏览器解析HTML页面;
  2. 解析嵌入的Flash插件;
  3. Flash插件解析SWF字节码;
  4. 插件和浏览器通过LiveConnect接口进行交互;

ActionScript语言

ActionScript(简称AS)是由Macromedia(现已被Adobe收购)为其Flash产品开发的 ,最初是一种简单的脚本语言,现在最新版本ActionScript3.0,是一种完全的面向对象的编程语言,功能强大,类库丰富,语法类似JavaScript,多用于Flash互动性、娱乐性、实用性开发,网页制作和RIA(丰富互联网程序)开发。

目前,网上大多数Flash都是应用ActionScript2或ActionScript3来编写的。

一般是使用Adobe Flash CS系列的软件直接进行AS代码的编写和编译。

SWF文件编译与反编译

具体可参考之前的博文:https://www.mi1k7ea.com/2019/07/21/Flash%E5%9E%8BXSS%E5%B0%8F%E7%BB%93/#swf%E6%96%87%E4%BB%B6%E7%9A%84%E7%BC%96%E8%AF%91%E4%B8%8E%E5%8F%8D%E7%BC%96%E8%AF%91

嵌入Flash文件

在HTML页面中嵌入Flash,一般使用object和embed标签。

(1)使用embed标签:

1
<embed src="filename.swf" width="200" height="100" type="application/x-shockwave-flash" />

embed标签支持Mozilla系列的浏览器或其他支持Netscape插件的浏览器,IE也能识别。

(2)使用object标签:

IE下嵌入:

1
2
3
4
5
<object codeBase="http://fpdownload.macromedia.com/get/Flashplayer/current/swFlash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">
<param name="movie" value = "http://example.com/exp.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>

非IE下嵌入(IE8能成功,本地最新IE11也OK):

1
2
3
4
5
<object type="application/x-shockwave-Flash" data="./exp.swf">
<param name="movie" value = "./exp.swf" />
<param name="allowScriptAccess" value="always" />
<param name="allowNetworking" value="all" />
</object>

object标签用于引入对象,如图像、音频、视频、Java Applets、ActiveX、PDF以及Flash,用于IE系列或其他支持ActiveX控件的浏览器。

(3)使用object+embed标签:

1
2
3
4
5
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="200" height="100">  
<param name="movie" value="filename.swf">
<param name="wmode" value="transparent">
<embed src="filename.swf" width="200" height="100" type="application/x-shockwave-flash" />
</object>

为了确保大多数浏览器能正常显示Flash,建议把embed标签嵌套放在object标签内。

0x02 Flash安全模型

随着Flash功能越来越丰富,使用越来越广泛,导致Flash的安全问题也越来越多,因此就诞生了Flash安全模型,其主要提供以下几个方面的功能:

  • 利用沙箱控制和阻止外部Flash之间的交互和访问;
  • 控制浏览器和Flash之间的交互和访问;
  • 控制其他外部资源的访问;
  • 控制对其他服务器的通信;

Flash安全沙箱

Flash安全模型使用沙箱来定义各个Flash应用程序可以访问的数据以及操作的范围。

看图理解下:

安全域是Flash中最顶级的沙箱,安全域链接到内容的来源域名,比如a.com下的SWF文件包含一个链接到a.com的安全域,而b.com下的SWF文件则有一个链接到b.com的安全域。不同的安全域使得SWF文件在Flash Player中播放时运行在自身的沙箱下;

如果两个SWF文件分别处于不同的安全域,则任何一个SWF中的数据都不可以被另一个SWF获取,如a1.swf只能与同域下的a2.swf文件通信,b1.swf只能与同域下的b2.swf文件通信,若尝试获取其他域的SWF文件则会报错;

若想让两个处于不同安全域下的SWF文件通信,可以通过授权来实现。通过授权后,某个安全域内的文件即可获取另一个域内的文件数据。在AS中,SWF文件的授权是通过Security.allowDomain()函数来设置的,这个方法是应用于swf文件跨域加载swf文件并访问其内部属性、方法、类等的场景。

HTML参数权限机制API

在HTML页面嵌入Flash时,其中的Object和Embed标签都有allowScriptAccess参数和allowNetworking参数,主要是用于在HTML页面调用执行Flash文件的场景。

allowScriptAccess:控制html页面与Flash页面的通讯。

  • always:html和Flash页面的通讯不做任何的限制;
  • samedomain:html和Flash同域的时候可以做通讯【这个值是默认值】;
  • never:html和Flash禁止通讯。

allowNetworking:控制Flash与外部的网络通讯。

  • all:Flash所有的网络API通讯接口都可用;
  • internal:navigateToURL,fscommand,ExternalInterface.call不可用;
  • none:所有的网络API不可用。

allowScriptAccess和allowNetworking实际是Flash权限机制的API,前面提过的Security.allowDomain()函数也是其中的一个。allowScriptAccess和allowNetworking都属于HTML参数权限机制API。

Cross Domain Policy

如图描述:

默认情况下,在浏览器中运行的Flash程序是不允许访问其他域的数据的。为了解决这个问题,唯一方式就是跨域策略文件crossdomain.xml,其是放置在网站的Web根目录下,而该文件的内容必须遵从XML格式,如上图示例。

crossdomain.xml文件主要包含如下几个节点:

  • site-control:通过检查该节点的属性值,确认是否可以允许加载其他策略文件;
  • allow-access-from:通过检查该节点的domain属性值,确认是否为允许访问的域名;
  • allow-access-from-identity:配置跨域访问策略为允许有特定证书的来源跨域访问本域上的资源;
  • allow-http-request-headers-from:授权第三方域的Flash向本域发送用户定义的HTTP头;

常用的节点为allow-access-from,用来指明允许本域资源允许被哪些域名的Flash跨域请求。

默认情况下,Flash不加载除主策略文件之外的其他策略文件,但是设置了permitted-cross-domain-policies的by-content-type相关属性后,黑客就能通过上传文件来定义自己的策略文件。

设置管理器

在本地硬盘运行的SWF文件也有自己的安全域,可以通过Flash Player的设备管理器来设置。设备管理器允许用户为客户端PC上执行的Flash程序制定各种安全性、隐私和资源使用设置。

通过Flash Player设置管理器,可以管理全局保密性设置、存储设置、安全设置和自动通知设置等。

0x03 Flash XSS

Flash XSS主要有以下两种方式:

  • 与JavaScript通信引发的XSS;
  • 加载第三方资源引发的XSS(如SWF文件或XML文件);

具体的原理和攻击利用可参考:Flash型XSS总结

0x04 Flash CSRF

Flash CSRF在于:如果目标站点的crossdomain.xml中domain值为*或者其中某些domain下的站可被攻击者利用来上传Flash文件等,那么攻击者可以诱使受害者用户访问攻击页面,进而通过触发Flash请求某个用户当前浏览器已登录的页面,从中提取出CSRF的token或者页面的其他敏感信息,造成CSRF攻击。

具体的原理和攻击利用可参考:Flash型CSRF总结

0x05 XSF

XSF(Cross Site Flash)跨站Flash攻击,就是使用ActionScript加载第三方的Flash文件时,攻击者能控制这个第三方的Flash文件,这样就有可能造成XSF攻击,情况分为以下两种:

  • 当一个Flash文件调用某个函数如loadMovie()加载其他域的Flash文件时;
  • 当HTML页面使用*Script去加载解析一个Flash文件时;

以下函数如果使用不当就很容易产生XSF问题:

1
2
3
4
5
6
7
8
9
loadVariables()
loadMovie()
loadMovieNum()
FScrollPane.loadScrollContent()
LoadVars.send()
XML.load('URL')
LoadVars.load('url')
Sound.loadSound('url')
NetStream.play('url')

通过这些恶意接口,可以指定URL为我们构造的恶意文件如swf或xml文件,从而在目标网站实现JS攻击。

漏洞示例代码如图,_root是AS2参数传递的关键字,这里loadMovieNum()函数参数可由外部传入,导致可以在URL栏输入参数来加载攻击者的恶意SWF文件,造成XSF攻击:

0x06 FPI

FPI(Flash Parameter Injection)Flash参数型注入攻击,是一种动态注入Flash的全局参数的攻击技巧。

网页中的Flash是直接嵌入到HTML中的,因此不能被URI加载,但由于Flash的一些全局参数是可以通过URI的方式来设置的,因此如果攻击者能访问和控制值Flash的全局参数,就能进行Flash XSS和XSF等攻击了。

反射型FPI

和反射型XSS类似,攻击者可以通过外部输入参数来传入恶意内容,而传入的参数直接拼接到了生成HTML页面的代码中,造成反射型FPI。

在下面的代码中,Flash视频的名称是从请求的表单或URL参数获取的,并且被放在了生成HTML页面中,攻击者可能通过下面的URL覆盖一些Flash全局参数:

附带FlashVars的反射型FPI

这种方式使用FlashVars属性,该属性可以在object标签中指定,用来传递全局Flash参数。在AS2中,FlashVars会被自动导入到Flash程序的变量空间。当FlashVars属性可由外部控制时,存在反射型FPI。

漏洞示例代码如图,其中%26为&的URL编码:

FlashVars注入

当任意的object标签的属性作为参数接收时,都可能会导致这种攻击。

漏洞示例代码如图,width参数未经过过滤,直接传递到输出的HTML页面中,导致了攻击者可以注入FlashVars:

DOM型FPI

当document.location变量被用作Flash参数的时候,会导致此类攻击。

漏洞示例代码如图,这里有两个变量传递给Flash,一个是location、值为http://host/index.htm,另一个是globalVar、值为evil:

0x07 伪造HTTP头

可以使用ActionScript编写伪造HTTP头字段的请求,将该as代码编译成swf文件然后诱使用户访问导致CSRF或攻击者自己某些情况下伪造HTTP头字段进行发包都是OK的:

0x08 Flash钓鱼

这里并非是Flash本身的漏洞利用,而是将Flash作为钓鱼攻击的一种载体进行利用,因此这里不多说,具体可见:https://book.2cto.com/201310/34314.html。

0x09 Flash安全测试工具

OWASP推荐了一款名为SWFIntruder的测试工具,具体可参见OWASP链接:https://www.owasp.org/index.php/Category:SWFIntruder

0x0A 参考

FLASH_Security_OWASP

《XSS跨站脚本攻击剖析与防御》