漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2016-0207504
漏洞标题:QQ上你点啊点/H5拿你的授权/微博oauth有点弱/提权进了你微博
相关厂商:新浪微博
漏洞作者: 呆子不开口
提交时间:2016-05-11 15:37
修复时间:2016-06-25 17:30
公开时间:2016-06-25 17:30
漏洞类型:设计缺陷/逻辑错误
危害等级:高
自评Rank:20
漏洞状态:厂商已经确认
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2016-05-11: 细节已通知厂商并且等待厂商处理中
2016-05-11: 厂商已经确认,细节仅向厂商公开
2016-05-21: 细节向核心白帽子及相关领域专家公开
2016-05-31: 细节向普通白帽子公开
2016-06-10: 细节向实习白帽子公开
2016-06-25: 细节向公众公开
简要描述:
QQ上你点啊点,H5拿你的授权。微博oauth有点弱,提权进了你微博。此洞从h5开始,到移动端结束。需善意的欺骗,有接口的提权。需要些技巧,整套做下来,感觉很有缘…管理员如果觉得太长的话,可以直接看后面的演示视频
详细说明:
QQ上你点啊点,H5拿你的授权。微博oauth有点弱,提权进你的微博。此洞从h5开始,到移动端结束。需善意的欺骗,有接口的提权。需要些技巧,整套做下来,感觉很有缘…
有一天帮网友二哥查些资料,翻到了微博的这个页面
你看这个页面的布局,还有色彩的搭配,又因为有微博LOGO。直觉告诉我,这里可能有问题
然后就看到了微博开放平台的JS SDK for OAuth2.0,具体的url地址是这个
分析这段代码你会得到这样的地址,应该是用于jssdk来进行授权登录的
上面的client_id填一个你授权过的微博应用,比如知乎的是3063806388。这个很容易在知乎的授权请求里面翻到
如果你已经授权过这个应用,比如知乎,你再访问这个请求,就会得到如下返回
以上这段代码,翻译成中文的意思就是,有漏洞
有问题的代码如下
var message = {"access_token":"2.00IxtkOBExxxxxxxxxxxxxxx4nutC","remind_in":"688841","expires_in":688841,"uid":"1134179710"};message = jsonToQuery(message);message = escape(message);window.opener.postMessage(message, '*');}
如果上面url的参数response_type改成code,会返回授权码
var message = {"code":"1ad1bf03000000000081b901a"};message = jsonToQuery(message);message = escape(message);window.opener.postMessage(message, '*');}
postMessage是h5的一个跨域传输信息的机制,具体技术我就不介绍了。上面这段代码的意思是,如果你从页面A打开了这个页面,那么这个页面就会把message信息传给页面A。这种打开方式可以使a标签链接,也可以是window.open
漏洞的核心就是,未对postmessage的目标页面做白名单域名限制,以及参数中的referer参数也没有任何校验作用
这样我们就可以做一个页面来偷此跨域传输的授权信息了
那么,当用户在登陆态下点击了我的链接后,我就可以拿到用户在某个应用的授权code或access_token,有如下两个风险
拿到用户的授权code了,就代表用户曾经用他的微博绑定过这个网站,那我们就可以用这个授权码登录这个网站了,就是说我可以进你的知乎了。利用方式很简单,你只需要用自己的微博去授权登录下,然后把微博返回的code换成你偷来的别人的就好了
拿到access_token,就代表可以用来发微博了,以及所有用户和微博授给这个appkey的权限,比如读写微博、发评论等。但不可以读私信或修改个人资料。权限有限
但是,大多浏览器的机制都不允许页面A加载的时候自动打开那个授权页面页面,除非是一些老的不规范的IE。所以可能需要我们做一个欺骗的中间页来要求用户点一下,比如下面这个页面,不管他点页面的哪个地方,都会触发打开微博那个授权页面
所以我标题中说了需要用户点啊点,要点两次用户才会中招
2、提权
如果一个漏洞就到上面就结束了,那是普通网友的行为
我总觉得这样不过瘾,我还想看用户的私信或者更多的权限该怎么办
我出去走了走,路过了一天桥,看到个算命的大爷。我跟他说了此事,大爷说,要论对微博的了解,朝阳区你能排第八
有了大爷的鼓励,我想起了我曾经发的一个微博
就是说weico作为一个第三方应用,却有着超过了官方api接口的各种权限。说明他有超能力,理应得到我们的关注
我就猜那么会不会有个合作方用的api接口可以换取用户的身份认证信息呢,运气不错,我猜对了
我扶了扶镜框,发现了一个这样的接口
这个接口返回了这样的数据,里面包含了gsid
熟悉m端页面相关漏洞的同学应该熟悉,gsid自古以来就是一个很牛逼的东西,一般用于用户的身份认证
在weibo.cn和m.weibo.cn那里,可以在url上加个参数就是登陆态的了
但是再点就不可以了,因为跳转的页面没有再传递gsid
我就猜程序员会不会这么写呢,从整个request里取gsid。于是我把gsid放cookie里,果然就可以方便的以用户登陆身份访问全站了
还可以进m.weibo.cn,这就进用户的微博账号了
OK,现在的话,我们发一个链接骗weico的用户去点,就可以进他的微博了
作为一个对微博功能了解排朝阳第八的人,下面就是怎么让这个漏洞的威力能扩大化了
微博的大部分用户都在移动端,而且不一定都是weico的用户。所以上面的攻击影响的用户很少
我们的目标是,所有用户在所有的端都中招
移动端打开微博域的链接,是认证状态的
但微博移动端有个问题,只有一个页面窗口,不能打开多个页面
所以可以在页面里先内嵌一个iframe,然后用window.open的方式把那个授权页在iframe里打开。提示下,这里不要用a链接的方式在iframe里打开,a标签打开的方式,window.opener取不到,所以postmessage发不过去
现在移动端支持了,然后就是怎么让更多的用户能被我们攻击了
我就在想,哪个应用是用户必装的
结果发现我的应用列表里有两个牛逼的应用,Android客户端和ios客户端。为什么说他们牛逼呢,因为我从来没有给他们授权过,那应该就是只要你用用户名密码的方式在客户端登陆过,那么就自动授权了
所以上面的POC中,只要安卓用户打开,我们就用安卓的appkey,ios的用户打开就用ios的appkey就可以了
接下来就是找他们的appkey了,这个有点麻烦了。他们不是一个网站,没法去抓包看他的appkey。网上也搜不到泄露的
我就在想,程序员会不会在这个应用相关操作里面使用了appkey作为参数
我扶了扶镜框,发现了一个,在取消授权功能那里直接传了appkey
然后不出所料,果然也是特权的appkey,可以拿到用户的gsid
这样就很完美了,基本通杀所有的用户了,只要在私信或评论里给他发个攻击链接就可以了
我又想一想,攻击面可不可以再扩大点呢,比如当这个人没有在用微博时,我在别的地方给他发个链接让他中招有没有可能呢,比如在qq里打开这个链接
那我就猜,我在qq里点链接可不可以加载微博客户端去自动打开我们的poc链接呢
找了下,微博是支持url scheme的,类似于sinaweibo://
简单的反编译了下微博客户端,进入搜了下browser,果然有这样的url
sinaweibo://browser/
我报着试一试的心态访问了下这个,sinaweibo://browser/?url=http://www.baidu.com
跟前面一样顺利,成功了
所以在qq里发一个链接,比如http://sdadsadasdasd.com/302.php。这个请求会302跳转到sinaweibo://browser/?url=http://www.shangmiandepocurl.com
这种方式在我的版本的qq内嵌浏览器是支持的,如果不支持,可以试试欺骗用户去点击这样的链接,sinaweibo://browser/?url=http://www.shangmiandepocurl.com
当然不止是qq里面,其他浏览器,或者其他应用的内嵌浏览器,很多也是支持这样的伪协议打开的。攻击面可以更广
到这里就差不多了,发给表妹,她中招了
但她在得知我并不知道她密码后,她还是改了密码
漏洞证明:
附上演示视频
修复方案:
在各个环节对可信域做白名单
版权声明:转载请注明来源 呆子不开口@乌云
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:15
确认时间:2016-05-11 17:20
厂商回复:
感谢关注新浪安全,问题修复中。
最新状态:
暂无