当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-017013

漏洞标题:Flash应用安全系列[1]--360反射型跨站

相关厂商:奇虎360

漏洞作者: p.z

提交时间:2013-01-06 22:33

修复时间:2013-02-20 22:34

公开时间:2013-02-20 22:34

漏洞类型:xss跨站脚本攻击

危害等级:低

自评Rank:3

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-01-06: 细节已通知厂商并且等待厂商处理中
2013-01-06: 厂商已经确认,细节仅向厂商公开
2013-01-16: 细节向核心白帽子及相关领域专家公开
2013-01-26: 细节向普通白帽子公开
2013-02-05: 细节向实习白帽子公开
2013-02-20: 细节向公众公开

简要描述:

360某处Flash应用存在漏洞,可能导致跨站脚本攻击。

详细说明:

在一切开始之前,我们先来说明几个基本的问题。
1.SWF如何被嵌入HTML页面的
此处所说的嵌入,就是指当你打开一个网页,这个网页中包含着SWF媒体文件,通常是embed或者object标签的形式。SWF嵌入HTML时,embed或者object标签通常还含有几个特定的属性,关键的有allowScriptAccess以及allowNetworking。
allowScriptAccess控制着SWF文件与HTML页面通信的级别,这里所说的通信,包括但不仅限于让SWF执行JS,还囊括了从JS调用SWF里预留出的api接口。
allowScriptAccess有以下三个值:

always 		允许任意SWF文件与HTML页面通信。
never 禁止任意SWF文件与HTML页面通信。
samedomain 只有在SWF文件来自与HTML页相同的域时才允许通信。
当未指定allowScriptAccess时,samedomain为默认值。


allowNetworking控制着SWF文件与WEB通信的级别,这里所说的通信,基本上就是发送、读取网络上的资源文件,以及控制浏览器的页面导航。
allowNetworking有以下三个值:

all 		无任何限制。
internal 禁止控制浏览器页面导航的函数。
none 禁止任何网络通信。
当未指定allowNetworking时,all为默认值。


2.我直接打开SWF文件时发生了什么
如果你在直接打开SWF文件时,使用IE开发者工具或者Firebug查看DOM源码就会发现,其实你打开的还是一个HTML页面,页面的内容只有一行代码:

<embed type="application/x-shockwave-flash" src="[SWF URL]" name="plugin" height="100%" width="100%">


前面我们已经讲了两个基本的属性,这里都没有指定,那么Flash Player自动取其默认值:allowScriptAccess=samedomain & allowNetworking=all.

在明白了上面两点之后,我们就能下面几个容易让人混淆的问题作出解答:

- a.com 的html页面 embed 了一个 b.com 的xss.swf,脚本执行域是哪个域?
- a.com 因为swf并不能执行JS,我们见到的他所执行的JS,其实是flash player通过调用承载他的html页面的js来实现的,所以是a.com。


- a.com 的html页面 iframe 了一个 b.com 的xss.swf,脚本执行域是哪个域?
- b.com 因为iframe了一个swf,其实是iframe了一个只有一行代码的HTML页面,html页面的域是b.com,故脚本的执行域也是b.com。


- a.com/load.swf能够加载任意的swf,我直接打开http://a.com/load.swf?url=http://b.com/xss.swf,能不能执行脚本?
- 不能,因为直接打开一个swf,他的allowScriptAccess是samedomain,而xss.swf的域是b.com,所以不能执行JS。


Flash里能执行JS的脚本函数有以下:

getURL(AS2) / navigateToURL (AS3)
flash.external.ExternalInterface.call(methodName:String, [parameter1:Object])



我们只需要搜索getURL/navigateToURL/ExternalInterface.call等关键字,然后在逆溯变量是否可控,就可以找到一些最基本的XSS漏洞。
以360的这个swf为例,
搜索ExternalInterface.call,我们发现了下面的代码。

public static function initLanguage() : void
{
var _loc_1:* = null;
Param.language = {};
if (ExternalInterface.available)
{
_loc_1 = ExternalInterface.call(Param.jsLang);
if (_loc_1 != null)
{
Param.language["CX0189"] = _loc_1["CX0189"];
Param.language["CX0193"] = _loc_1["CX0193"];
_loc_1 = null;
}
}
return;
}


回溯Param.jsLang

this.parameter = this.loaderInfo.parameters;
...
Param.jsFunc = this.parameter["jsfunc"];
...
Param.initLanguage()


这里的loaderInfo.parameters就是接受外部以flashvars或者类似a.swf?a=va&b=vb形式传入的变量和值。
这里我们打开 http://wan.360.cn/swf/avatar.swf?jslang=alert(1)

360.png


这里我们也许还有一个疑问,在官方的帮助文档里,flash.external.ExternalInterface.call可以接受两个参数,第一个是methodName,第二个是要传入的变量,那么对于上面的poc,正确的调用方法应该是flash.external.ExternalInterface.call("alert","1")才是,为什么flash.external.ExternalInterface.call("alert(1)")也能成功。
我们打开ie的调试工具,借用80vul.com上的demo,看看swf执行js时候发生了什么。
首先打开的是http://www.80vul.com/xss.swf?a=alert&b=1

debug1.png


try { __flash__toXML(alert("1")) ; } catch (e) { "<undefined/>"; }


__flash__toXML是将函数执行的结果进行编码后传回SWF的函数,外面再嵌套了一层容错语句,看来一切和预想的一样
再打开http://www.80vul.com/xss.swf?a=alert(2)&b=1

debug2.png


try { __flash__toXML(alert(2)("1")) ; } catch (e) { "<undefined/>"; }


JS先执行了alert(2),弹出对话框。
再单步进入

debug3.png


alert函数没有返回值,alert(2)("1")出错,所以跳到了catch语句
这样一来,就能解释为什么即使不按adobe的文档说明的方法进行调用,也能执行js了,再多说一句,由于这样会引起出错导致SWF接收不到JS返回的值,所以在某些特定的情况下,我们要对插入的函数进行进一步的变化,比如
http://www.80vul.com/xss.swf?a=(function(_a){alert(_a);return function(_z){prompt(2,3)};return 5})(1)&b=4
这样,SWF就可以接收到我们可以任意构造的返回值 5 了。
原始SWF下载:http://swfpoc.appspot.com/vul/wan.360.cn_swf_avatar.swf

漏洞证明:

修复方案:

正则匹配下,只允许[a-zA-Z\.]

版权声明:转载请注明来源 p.z@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2013-01-06 22:39

厂商回复:

感谢您精心准备的详细的漏洞说明,该问题已经确定,我们已经通知业务部门对swf文件做一次批量处理。thx

最新状态:

暂无


漏洞评价:

评论

  1. 2013-01-06 22:54 | 3King ( 普通白帽子 | Rank:1129 漏洞数:92 | 【study at HNUST】非常感谢大家的关注~ 大...)

    前排搞基~

  2. 2013-01-06 23:01 | se55i0n ( 普通白帽子 | Rank:1567 漏洞数:173 )

    围观大牛!

  3. 2013-01-07 10:36 | Rookie ( 普通白帽子 | Rank:288 漏洞数:78 | 123)

    目测要连载啊

  4. 2013-01-07 10:42 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    围观改变世界

  5. 2013-01-08 20:09 | 黑色的屌丝 ( 路人 | Rank:27 漏洞数:5 | →_→→_→)

    连载让世界更精彩

  6. 2013-02-07 02:51 | 专业查水表 ( 路人 | Rank:1 漏洞数:5 | "><script>alert(/我是"J.L"的大号/);</scr...)

    连载出书的绝对要火。。。我是来帮忙盖楼的

  7. 2013-02-21 00:43 | saber ( 路人 | Rank:8 漏洞数:2 | 我只是一个人走了太久,久到习惯了一个人。)

    目测要火啊。。

  8. 2013-02-21 01:31 | lsh4ck ( 实习白帽子 | Rank:81 漏洞数:14 | 不是黑客!但是黑客手段都要会?)

    大牛!

  9. 2013-02-21 08:13 | x1aoh4i ( 普通白帽子 | Rank:403 漏洞数:62 )

    目测要火,是连载的话,采用

  10. 2013-02-21 09:49 | NiceWorm ( 普通白帽子 | Rank:179 漏洞数:38 )

    学习了

  11. 2013-02-21 10:54 | blast ( 普通白帽子 | Rank:348 漏洞数:57 | 五仁委员会)

    围观学习

  12. 2013-03-09 06:45 | 苏南同学 ( 实习白帽子 | Rank:41 漏洞数:5 | 苏南同学,就是苏南同学~~~)

    学习