网易云音乐的接口都用了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来说不是必须的,引用一下新浪的文档:
那么问题就来了,步骤3没有验证回调的state的参数,也没有验证用户是否真的是自己发起了这个请求。在第一步如果有记录用户的状态的话,也是可以验证的。
具体攻击的过程
1. 用户登录了网易云音乐,点击了攻击者的链接
2. 在攻击者的页面中,主要过程是利用新浪微博的登录接口先登录攻击者的微博账号,注:攻击者的微博账号需要先授权给网易云音乐并关注,然后前端偷偷跳转到下面的地址,就可以将攻击者的微博账号绑定到用户的账号中
3. 攻击者利用自己的微博账号即可登录受害者的网易云音乐的账号
测试代码,pip安装一下requests, BeautifuSoup, Flask,改一下下面的微博账号和密码(记得需要先授权),然后访问一下即可: