flash xss初探

flash已死,但是flash的xss始终是前端安全中不能绕过的一个环节,本篇为个人的学习笔记,推荐阅读参考文献

flash,actionscript,swf文件…

要想理解 flash 下的 xss 方法,要先理解 flash 在 web 中的应用方式

首先,日常网页中接触最多的是 flash player,用来运行 swf 文件,而 flash 其实可以算一个用来生成 swf 文件的 IDE,而 ActionScript(AS) 则是 flash 平台的语言,最终可以编译成 swf 文件

编译 .as 文件:官网下载 flex sdk,用 bin 目录中的 mxmlc 可以编译,需要32位的 JRE

flash的安全域

flash 会根据 swf 文件的源来划分每个源的安全沙箱,其中源又可以分为远程和本地,对来自远程源的 swf 文件根据目标源的不同分在不同的沙箱中,对来自本地源的文件则会分到4个沙箱中:

只能与远程内容交互的沙箱和只能与本地文件系统内容交互的沙箱之间的通信以及只能与本地文件系统内容交互的沙箱和远程沙箱之间的通信是严格禁止的。运行于 Flash Player 中的应用程序或用户/管理员不能授予允许此类通信的权限。

信任域:

通过 Security.allowDomain 设置,被信任域的数据和代码可以在信任域中获得和运行,但是这种信任是单向的

不可执行文件的信任机制

如何让不同域的 swf 文件获取不可执行文件(图像,文本文件)的数据?可以通过网站根目录下的一个 crossdomain.xml 文件来限制:

如果没有得到跨域策略文件的信任,那么就不能直接访问目标域的文件数据,文本文件甚至不会被加载,但是图像文件等可以被加载的文件仍会显示,只是不能直接访问图像数据。

sharedEvents

用 sharedEvents 方法可以与不同域的 swf 文件共享事件,加载者和被加载者都可以通过这个对象来向对方发送事件。通过 sharedEvents 对象发送的事件在两个域中都是完全受信的,这就使得在两个安全域中传递的任意数据都无需考虑安全问题。

flash xss

最简单的形式:

click参数用户可控,只要传入?click=javascript:alert(1)就会造成 xss,在 AS3 中取消了 getURL,取而代之的是 navigateToURL, 在AS3中取得参数的函数为 loaderInfo.parameters.[args]

还可以用 ExternalInterface.call(func, param) 来执行JS,如果第一个参数可控,就可以传入任意的JS函数

以上代码传入?func=alert即可弹出hello world

ExternalInterface.call 的第二个参数也可以造成XSS

例如

会把 param 包裹在双引号中传递给 console.log , 例如传递?params=hello world就会调用类似console.log("hello world"),具体的调用代码是

当我们在hello world中插入双引号"的时候会被转义为\",但是这里可以用一个反斜杠逃逸, 传入\"));alert(1);}catch(e){}//就会逃逸并执行alert(1)

参考文献

Flash的跨域问题

深入理解Flash Player的安全域

Flash XSS攻击总结

常见flash xss攻击方式