使用新浪微博开放平台api同步微博内容至自己网站(OAuth2未对微博的access_token导致任意用户登陆这个问题)
优采云 发布时间: 2022-02-27 22:05使用新浪微博开放平台api同步微博内容至自己网站(OAuth2未对微博的access_token导致任意用户登陆这个问题)
显示结果
鉴于这篇文章写的乱七八糟,我真的怕有些同学因为保护视力而不会继续阅读,所以我先把通过后文描述的两种方法发现的一小部分漏洞作为吸引力放出来。
OAuth2授权访问的隐式模式
首先我们来看看OAuth的定义:OAuth(Open Authorization)是一个开放的标准,它允许用户授权第三方网站访问他们存储在另一个服务提供商上的信息,而不需要向Third提供用户名和密码各方网站或共享其数据的所有内容。
在大家测试的过程中,常见的快捷方式登录是授权码模式(authorization_code),即应用(QQ/微博)给出授权码code,服务器将code换成access_token,然后进行下一个请求。
从我们的外部来看,大致流程如下:
访问网站a,选择微博快速登录,跳转到,微博用户点击授权,然后从携带code参数跳转回网站a,我们的应用会在终端获取到code调用第三方提供的api获取uid和access_token,这里参考微博给出的api文档
下一步可以继续通过access_token请求其他第三方API,看一下account/get_uid
如上图所示,通过access_token请求该接口即可返回uid。
上面的描述都是关于授权码模式的。其实隐式模式和授权码模式很相似,只是少了一步code="access_token。第三方会直接提供access_token给开发者使用,不再给出code。
1.微博access_token校验失败,导致任意用户登录
这个问题在多个应用中都出现过,我测试过的应用中大约有10%的应用存在这个问题,如果出现后果可能很严重。此使用方式针对微博快速登录的应用。
应用中的微博快速登录是通过调用微博应用请求,然后获取请求的返回access_token和uid,所以应用中没有微博快速登录的代码,这是我们的第一段。提到的隐式模式。获取access_token的请求如下:
大部分应用会获取返回的access_token,使用微博的api进行操作,但应用只获取uid,没有验证access_token,然后代入数据库查询,存在任意登录的问题。
一个案例:
在这个应用中,点击微博快速登录,然后调出微博应用,注意上面截图中的请求,修改请求返回的uid,释放所有后续请求。
至此,微博绑定的账号已经无权限登录,所有功能都可以使用。
原因如下,注意在应用中的请求中有一个:,
这是最关键的set-cookie请求,其中请求参数open_id是刚刚返回的微博账号的用户uid,也就是我们刚才修改的返回包的值。
微信快速登录也是这种隐式模式,但是这种攻击方式并不适合微信快速登录。首先,微信公众号的open_id不是公开内容。当然,如果你想自己搭建一个第三方登录平台,也可以获取微信用户的信息。open_id 也是不行的,因为同一个微信账号为不同的app生成的open_id是不同的,所以不能使用。我喜欢这里的微信。
这里补充一下如何获取指定微博账号的uid,查看用户页面源码搜索:$CONFIG['oid']
修复方法:
如果一定要使用uid,使用这个接口来验证access_token:
要求获取返回的 uid,不要相信用户输入给您的 uid。
2.微博access_token验证不严格,导致交互后账号被劫持
99%的应用都存在这种问题,这种利用方式只针对微博的快速登录。这种问题的危害没有第一种那么明显。这是一种需要互动的漏洞。我随机提交了几家公司来观察厂商的反应。其中大部分为中风险,少数为高风险。一些制造商的家中有大量应用程序。有了这个问题,打包提交也可以给出高风险的奖励。更多厂商评分,看你的投稿结果~
当应用程序没有第二个问题时,它不一定是完全没有风险的。可以看到每个微博api请求只需要一个access_token凭证,不需要一些appid或者uid信息。
其中有一些非常简单的请求,例如:
如果客户端获取到微博账号的uid和access_token,进行检查。但是,如果我们只是通过这样一个类似的接口通过access_token请求获取uid,然后认为uid就是我们的用户,这是不正确的。
下面我们来看看如何使用它:
我像这样在微博开发者上构建了一个应用程序
Oauth2.0 授权回调页面是攻击者的站点。
这里的快速登录链接是:
%3A%2F%2F%2f&状态=30
登录后会带代码进入百度(其实就是进入攻击者的站点):
从官方手册来看,代码是这样使用的:
此时攻击者获取到用户的access_token和uid
回到第一个exploit方法:
这次如果同时更换access_token和uid,就可以登录别人绑定的账号了。
原因是这次不用同时更换access_token和uid就可以登录别人绑定的账号了。
原因是没通过
获取 a*敏*感*词*ey 以验证 access_token 是否真的由您的应用程序生成。
1.访问攻击者微博快速登录
2.攻击者获取代码->获取access_token和uid
3.其他应用账号被劫持
修复方法:
通过
获取 a*敏*感*词*ey 以验证 access_token 是否真的由您的应用程序生成。
最后
如今,*敏*感*词*几乎每个站点都有第三方快速登录。中国的主流可能是QQ/微博/微信。当然,还有其他的快速登录方式。多种快捷登录漏洞。