ActionScript的XSS黑客文化

作者:ycosxhack
来源:余弦函数

XSS即Cross-Site Scripting跨站脚本,提到XSS,我们首先会想到作为web客户端逻辑控制的脚本语言JavaScript,不过我认为XSS不应该就是 JavaScript的专利。随着Flash与Flex的壮大,随着RIA应用的普及,ActionScript脚本语言带来了全新的XSS威胁!这样的威胁可以分为两类:
1)、AS的inline-XSS即内嵌跨站脚本,这类跨站发生在flash运行环境内。
2)、ASJS通信盒子,这最终还是要借助JavaScript。AS3对安全性能要求苛刻,相比JavaScript,AS是神秘的、新鲜的。
其实ActionScript与VBScript、服务端编程一样都可以作为跨站攻击的一种辅助手段。不过随着Flex在RIA应用中的猛烈发展, ActionScript将不仅仅作为JavaScript跨站攻击的辅助。ActionScript会形成自己的XSS黑客文化。
—————————————————————————————————————————–
以上文字摘自Cos Thought(就是我自己的思维片段了,值得商榷)2008.02.05凌晨
学习AS3真不容易,处处碰壁!AS2到AS3的变化幅度太大,不过我已经彻底适应过来了。这次再来说说ASJS通信盒子,上次的ASJS通信盒子之百度空间相册就当作是AS2与JS通信的一次探索性试验吧。AS3的安全性能提高了很多,通过这几天的研究,我还未发现可以XSS的思路,不过总感觉会有的。
一、getURL()与navigateToURL()
先说说这两个函数,getURL()在AS3中已经不被支持,在AS2中支持,并且getURL()与flash player的版本无关,都是兼容的,所以只要我们使用AS2来写getURL(),那么还是可以XSS的,我们可以这样XSS:
getURL("http://hi.baidu.com/ycosxhack", "_blank"); //弹出目标网页,还可以如下这样
getURL("javascript:var xss='hello cos';alert(xss)"); //直接在AS2中执行js代码,很好
在AS3中,我们可以使用navigateToURL()来代替getURL(),如下代码:
var url:String = "http://hi.baidu.com/ycosxhack";
var request:URLRequest = new URLRequest(url);
//这居然就要使用URLRequest类,注意了:URLRequest 实例包含单个HTTP请求的所有信息,在AS通信中扮演着重要的角色

try {
navigateToURL(request); //不过遗憾的是,我们不能在其中像getURL那样直接执行js代码
}
catch (e:Error) {
// handle error here
}
举例这两个函数,我是要说明,getURL的XSS思路是100%行得通的,只是它不在AS3中使用而已,与flash player版本无关,并且AS3中的navigateToURL至少也可以弹出新窗口吧?虽然这样窗口会被浏览器的某些拦截工具条拦截。不过使用这样的 XSS手段是下下策,就像那些挂马的人使用内嵌框架一样。
二、Flash cookie
是不是第一次听说?cookie大家都不陌生,是一个存储在浏览器目录的文本文件,最大信息量为4K。Flash cookie类似于浏览器cookie的功能,也是存储在客户端的文件,其信息量能有多大呢?我曾经在饭否上记录了这段文字:“Flash使得AJAX RIA能在客户端存储10MB的数据,Cookies只能存储4KB。”这段文字也许能说明些什么。下面代码的核心是共享对象SharedObject的使用,Flash cookie正是基于此对象:
var so:SharedObject = SharedObject.getLocal("cos");
if (so.size == 0)
{
// 共享对象不存在时。

trace("created…");
so.data.now = new Date().time;
//向Flash cookie中写数值……
so.data.words = "hello cos";
//向Flash cookie中写数值……
}
var ageMS:Number = new Date().time – so.data.now;
trace("SharedObject was created " + Number(ageMS / 1000 / 60).toPrecision(2) + " minutes ago");
trace("SharedObject is speaking:" + so.data.words);
trace("SharedObject is " + so.size + " bytes");
//以上四行代码读取FLash cookie的值
so.flush();
上面这段代码第一次运行结果如下:
created…
SharedObject was created 0.00 minutes ago
SharedObject is speaking:hello cos
SharedObject is 57 bytes
第二次运行结果如下:
SharedObject was created 0.70 minutes ago
SharedObject is speaking:hello cos
SharedObject is 57 bytes
这个Flash cookie于ASJS通信盒子有什么关系?其实是有间接关系的,此文开头我就说了:“ActionScript会形成自己的XSS黑客文化。”从 Flash cookie的这个例子中就可以感受得到,是不是总感觉处处有JavaScript的影子?Flash cookie必然会丰富我们的XSS!
三、AS的网络与通信
上面介绍的都属于AS的网络与通信范畴。这块内容非常的丰富、有趣。可以包括:从外部文件或服务器脚本中加载数据、将数据发送到服务器脚本、与其它本地SWF文件通信、处理二进制套接字连接、与XML套接字通信、存储永久本地数据、将文件上载到服务器、将文件从服务器下载到用户计算机(来自AS3的帮助文档)。
我肯定不会每个都去介绍(有的我还不熟),下面分别简单介绍AS3与服务端的通信、SWF文件之间的通信:
1)、AS3与服务端的通信
主要使用的类为URLLoader与URLVariables,AS2中风光无限的LoadVars类在AS3已经被抛弃了,而上面提到的URLRequest则作为重要的辅助通信类。要具体了解,可以查看我转载来的这篇文章as3与后台通讯。在这我就不罗列对本文无意义的通信代码了。其实我想说AS3与服务端的通信过程可以无声无息,就像AJAX,在后台默默执行。又有JavaScript的影子,完毕。
2)、SWF文件之间的通信
通过LocalConnection类,SWF文件之间可以直接通信(不用经过JavaScript这一层)。在AS各版本中都得到支持。可以使用 LocalConnection类中的allowDomain()或allowInsecureDomain()方法进行跨域通信(这点非常重要)。还没遇到什么网站采用了这样的通信模式。不过其支持跨域通信,这点就足够吸引人了!
四、Flash的安全因素
以上讨论的仅是Flash安全因素的冰山一角而已。还有所谓的权限控制、安全沙箱、Flash外部API、全屏模式安全性、跨脚本访问等等都没在本文的讨论范围内或仅仅是一笔带过。研究的越深刻,认识的就越深刻,ActionScript的XSS黑客文化就会越来越有趣。
Flash外部API实际上是Flash与其容器应用程序(比如:Web浏览器和包含Flash Player内容的HTML页)通信的一个接口,比如AS与JS的直接通信(这个有趣吧?)会使用AS的ExternalInterface类。等我将这个API研究透了,估计会有新的XSS思路!我现在好困……
最后补充一下:AS代码一般都被藏匿在flash 的标准输出文件(以.swf为后缀的文件)中,大多数情况下反编译出源码是一件很容易的事,使用硕思闪客精灵即可。现在AS3可以将AS代码作为一个外部包文件(.as后缀)导入使用,这个包文件是可以直接下载下来的(如果你发现的话)。恩,这又有JavaScript的影子了。百度空间的flash文件应该都使用AS2编码。

相关日志

发表评论