账号安全-OAuth 2.0

OAuth 2.0 概述

OAuth 2.0(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。和直接使用账号密码相比,OAuth 2.0 规避了在各个安全能力参差不齐的第三方站点上直接输入账号密码的风险,而是授权给一个受信任的应用(例如 微信、微博、QQ),让用户可以获得被允许范围内的用户信息;
和SSO单点登录相比,OAuth 2.0是不同公司间遵循的一种授权方案/协议,被授权的第三方应用可以不属于同一个信任范围。

白话版的原理可以看看这篇《OAuth 2.0 的一个简单解释》

OAuth 2.0的四种实现类型

  • 授权码(authorization-code)
    安全性最高的一种方式,第三方应用先申请授权码code,通过code来获得token令牌;适用于有后端的应用,前端传输code,token在后端传输避免泄露。
  • 隐藏式(implicit)
    token通过url携带,安全系数不高,因为没有『授权码』这个环节,故称为『隐藏式』;适用于无后端的仅前端应用,在前端传输token。
  • 密码式(password)
    通过向鉴权平台输入账号密码取令牌,存在账号密码被泄露的安全风险;
  • 客户端凭证(client credentials)
    通过第三方应用id和密钥获取令牌,适用于没有前端的命令行应用,即在命令行下请求令牌;

详细的说明可以看 OAuth 2.0 的四种方式,出于安全性考虑,这里只讨论使用较为广泛的 授权码类型。

授权码类型

授权码模式的实现流程


1、第三方应用向认证服务器请求授权码code;
2、认证服务器返回授权码;
3、第三方应用凭借授权码向认证服务器请求token令牌;
4、认证服务器在校验通过后向第三方引用返回令牌;
5、第三方通过带API的令牌访问到用户信息。

抓包

我们可以抓一个包来看看是如果实现的,以第三方账号微信登录某平台为例:
1、请求微信OAuth2.0授权登录

GET /connect/qrconnect?appid=wx27b8c0c4f91ca795&redirect_uri=https://www.xxx.com/xxx_callback/weixin&response_type=code&scope=snsapi_login&state=301bd1b6bd3af1fa468b62bb4e919cb7 HTTP/1.1
Host: open.weixin.qq.com

response_type参数为code表示需要此处需要返回code;
client_id是第三方应用的id,让认证服务器知道是来自哪个应用(开发者在认证服务器申请接入并成功获取到appid和AppSecret,并配置回调域名)的请求;
redirect_uri参数是认证服务器接受或拒绝请求后的跳转网址(第三方应用),code授权码会随着这个回调地址返回,如果此处校验不当会导致code泄露甚至是账号被劫持;
scope参数表示要求的授权范围;
state用于用于保持请求和回调的状态,授权请求后原样带回给第三方,用于防止csrf攻击、账号劫持等;

2、返回授权码
用户同意授权给第三方站点后,认证服务器会通过redirect_uri中的回调地址返回这个授权码code;

3、请求令牌
客户端收到授权码后向认证服务器申请令牌,这一步是在客户端的后台的服务器上完成的,对用户不可见。

服务器端请求示例如下:

https://api.weixin.qq.com/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

返回token示例:

{
    "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE",
    "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

第三方应用拿到token后,会依据client_id、code、state等信息去向认证服务器请求token,通过获得的token第三方应用就可以去访问用户的昵称、头像、性别等信息了。

安全风险

关于OAuth2.0流程中的几个常见安全风险点:

  • 重定向url:建议从头到尾完全匹配
    • url跳转:校验不当导致返回的code被第三方恶意劫持或窃取
    • 回调地址存在xss
  • state参数缺失或校验不当引发的csrf,可导致账号被劫持、用户信息泄露
  • code的一次有效性
    若code的时效性设置过长,可通过诱导用户点击回调地址redirect_uri=http://xxxyy.com/index.php窃取用户code
  • token防止泄露
    • https传输
    • 客户端后台处理token,防止泄露
    • token不可预测

参考:
你可能不知道的挖洞小技巧系列之OAuth 2.0
中通统一认证 (SSO) 系统安全实践

posted @ 2020-04-07 15:14  人间修行  阅读(295)  评论(0编辑  收藏  举报