当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(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标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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开始,到移动端结束。需善意的欺骗,有接口的提权。需要些技巧,整套做下来,感觉很有缘…
有一天帮网友二哥查些资料,翻到了微博的这个页面

http://open.weibo.com/wiki/Weibo-JS_V2#JS_widget.E8.AF.B4.E6.98.8E.E5.8F.8A.E7.A4.BA.E4.BE.8B


1.png


你看这个页面的布局,还有色彩的搭配,又因为有微博LOGO。直觉告诉我,这里可能有问题
然后就看到了微博开放平台的JS SDK for OAuth2.0,具体的url地址是这个

http://tjs.sjs.sinajs.cn/open/api/js/wb.js?appkey=YOUR%20APPKEY&debug=true


2.png


分析这段代码你会得到这样的地址,应该是用于jssdk来进行授权登录的

https://api.weibo.com/oauth2/authorize?client_id=3063806388 &transport=html5&scope=&response_type=token&display=js&referer=http://weibo.com


上面的client_id填一个你授权过的微博应用,比如知乎的是3063806388。这个很容易在知乎的授权请求里面翻到
如果你已经授权过这个应用,比如知乎,你再访问这个请求,就会得到如下返回

3.png


以上这段代码,翻译成中文的意思就是,有漏洞
有问题的代码如下
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参数也没有任何校验作用
这样我们就可以做一个页面来偷此跨域传输的授权信息了

4.png


那么,当用户在登陆态下点击了我的链接后,我就可以拿到用户在某个应用的授权code或access_token,有如下两个风险
拿到用户的授权code了,就代表用户曾经用他的微博绑定过这个网站,那我们就可以用这个授权码登录这个网站了,就是说我可以进你的知乎了。利用方式很简单,你只需要用自己的微博去授权登录下,然后把微博返回的code换成你偷来的别人的就好了
拿到access_token,就代表可以用来发微博了,以及所有用户和微博授给这个appkey的权限,比如读写微博、发评论等。但不可以读私信或修改个人资料。权限有限

5.png


但是,大多浏览器的机制都不允许页面A加载的时候自动打开那个授权页面页面,除非是一些老的不规范的IE。所以可能需要我们做一个欺骗的中间页来要求用户点一下,比如下面这个页面,不管他点页面的哪个地方,都会触发打开微博那个授权页面

6.jpg


所以我标题中说了需要用户点啊点,要点两次用户才会中招
2、提权
如果一个漏洞就到上面就结束了,那是普通网友的行为
我总觉得这样不过瘾,我还想看用户的私信或者更多的权限该怎么办
我出去走了走,路过了一天桥,看到个算命的大爷。我跟他说了此事,大爷说,要论对微博的了解,朝阳区你能排第八
有了大爷的鼓励,我想起了我曾经发的一个微博

6.png


就是说weico作为一个第三方应用,却有着超过了官方api接口的各种权限。说明他有超能力,理应得到我们的关注
我就猜那么会不会有个合作方用的api接口可以换取用户的身份认证信息呢,运气不错,我猜对了
我扶了扶镜框,发现了一个这样的接口

http://api.weibo.cn/2/account/login?access_token=2.00IxtkOsdfsdfsdfsdf65fb27VVoD&source=7501641714&i=


这个接口返回了这样的数据,里面包含了gsid

7.png


熟悉m端页面相关漏洞的同学应该熟悉,gsid自古以来就是一个很牛逼的东西,一般用于用户的身份认证
在weibo.cn和m.weibo.cn那里,可以在url上加个参数就是登陆态的了

8.png


但是再点就不可以了,因为跳转的页面没有再传递gsid
我就猜程序员会不会这么写呢,从整个request里取gsid。于是我把gsid放cookie里,果然就可以方便的以用户登陆身份访问全站了

9.png


10.png


还可以进m.weibo.cn,这就进用户的微博账号了

11.png


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

厂商回复:

感谢关注新浪安全,问题修复中。

最新状态:

暂无


漏洞评价:

评价

  1. 2016-05-11 15:39 | DNS ( 普通白帽子 | Rank:803 漏洞数:85 | root@qisec.com)

    前排mark

  2. 2016-05-11 15:42 | 爱上平顶山 认证白帽子 ( 核心白帽子 | Rank:3144 漏洞数:625 | [不戴帽子]异乡过客.曾就职于天朝某机构.IT...)

    666666

  3. 2016-05-11 15:49 | 随风的风 ( 普通白帽子 | Rank:259 漏洞数:96 | 微信公众号:233sec 不定期分享各种漏洞思...)

    6666666

  4. 2016-05-11 15:54 | Weiy、 ( 普通白帽子 | Rank:203 漏洞数:39 | 为了梦想我会一直前行、)

    666666666666666666666666666666666

  5. 2016-05-11 15:58 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)

    我以为提权俩字写错了,看完发现果真是web应用权限提权案例!

  6. 2016-05-11 16:02 | just_joker ( 普通白帽子 | Rank:124 漏洞数:22 | ..........)

    打雷了,收衣服喽

  7. 2016-05-11 16:03 | scanf ( 核心白帽子 | Rank:1694 漏洞数:238 | 。)

    呆神好久不见

  8. 2016-05-11 16:09 | j14n ( 普通白帽子 | Rank:2226 漏洞数:400 )

    这就是 你微博上说的那个测试吧。。

  9. 2016-05-11 16:10 | Vinc ( 普通白帽子 | Rank:383 漏洞数:58 | 提莫队长正在待命!)

    6

  10. 2016-05-11 16:19 | Hex ( 实习白帽子 | Rank:33 漏洞数:14 | 安全圈小学生)

    思路真牛逼,学习了

  11. 2016-05-11 16:21 | 脚本菜菜 ( 路人 | Rank:10 漏洞数:4 | ~)

    [b]make[/b]

  12. 2016-05-11 16:31 | 弥生 ( 路人 | Rank:27 漏洞数:5 | w)

    不明觉厉 先mark

  13. 2016-05-11 16:32 | 狗胜 认证白帽子 ( 路人 | Rank:11 漏洞数:1 | ../../../../../../../../../../../../../....)

    “点击我就上了你”系列

  14. 2016-05-11 16:39 | 山鹰 ( 普通白帽子 | Rank:110 漏洞数:28 | 拒绝搞基,啊哈)

    强势围观

  15. 2016-05-11 16:46 | f4ckbaidu ( 普通白帽子 | Rank:265 漏洞数:33 | 开发真是日了狗了)

    66666666666

  16. 2016-05-11 16:50 | 雷锋 ( 路人 | Rank:12 漏洞数:2 )

    @狗胜 这是哪位大侠!!

  17. 2016-05-11 16:59 | s3xy ( 普通白帽子 | Rank:994 漏洞数:131 | 相濡以沫,不如相忘于江湖)

    mark

  18. 2016-05-11 17:14 | Hax0rs ( 实习白帽子 | Rank:65 漏洞数:13 | Hax0rs)

    @狗胜 这是哪位大侠!!

  19. 2016-05-11 17:18 | 康智冬 ( 路人 | Rank:4 漏洞数:1 | 不进则退,不拼则废。)

    强大,佩服

  20. 2016-05-11 17:22 | Dotaer ( 路人 | Rank:28 漏洞数:8 | 多学习,多挖洞!)

    打雷啦,下雨了。回家日站了

  21. 2016-05-11 18:16 | Mark0smith ( 普通白帽子 | Rank:176 漏洞数:71 )

    mark

  22. 2016-05-11 18:29 | zhchbin ( 普通白帽子 | Rank:173 漏洞数:33 )

    该怎么扶一扶我的眼镜。

  23. 2016-05-11 18:52 | 孤梦° ( 普通白帽子 | Rank:149 漏洞数:51 )

    mark

  24. 2016-05-11 19:03 | adminss ( 路人 | Rank:24 漏洞数:19 | 攒攒漏洞,冲击普通白帽)

    厉害!

  25. 2016-05-11 20:03 | Rand0m ( 实习白帽子 | Rank:42 漏洞数:11 | 竟然还有人冒充我,醉了,骗子QQ:44569754...)

    这波给满分

  26. 2016-05-11 21:41 | qhwlpg ( 普通白帽子 | Rank:260 漏洞数:64 | http://sec.tuniu.com)

    666

  27. 2016-05-12 09:29 | Sai、 ( 路人 | Rank:14 漏洞数:4 | for fun……)

    呆子哥屌啊

  28. 2016-05-12 17:53 | 卡卡 ( 普通白帽子 | Rank:468 漏洞数:57 | <script>alert('安全团队长期招人')</scrip...)

    标题自带喜感~

  29. 2016-05-13 10:50 | 围剿 ( 路人 | Rank:17 漏洞数:5 | Evil decimal)

    666

  30. 2016-05-22 00:54 | 呆子不开口 ( 普通白帽子 | Rank:408 漏洞数:36 | 求各种兼职)

    大意了,里面有一处走了点弯路,明明自己已经绕过了

  31. 2016-06-01 13:11 | luwikes ( 普通白帽子 | Rank:552 漏洞数:83 | 潜心学习~~~)

    我出去走了走,路过了一天桥,看到个算命的大爷。我跟他说了此事,大爷说,要论对微博的了解,朝阳区你能排第八

  32. 2016-06-01 13:36 | 美食家L ( 实习白帽子 | Rank:65 漏洞数:10 | http://404.so 安静的坚持自己的原则)

    厉害。

  33. 2016-06-01 13:49 | 大师兄 ( 实习白帽子 | Rank:31 漏洞数:8 | 每日必关注乌云)

    http://www.wooyun.org/images/blood.png 新增这个是什么鬼?

  34. 2016-06-01 14:34 | 呆子不开口 ( 普通白帽子 | Rank:408 漏洞数:36 | 求各种兼职)

    这个漏洞可以不用二次点击,利用起来应该更方便。是我多虑了