OAuth 2.0 认证的安全问题

参考文章:https://www.yuque.com/pmiaowu/web_security_1/oauth
作者:PHPoop

关于OAuth2.0协议的授权流程可以参考下面的流程图:

1、Client指第三方应用
2、Resource Owner指用户
3、Authorization Server是我们的授权服务器
4、Resource Server是API服务器

认证流程:

整个过程分为 A~F 六个步骤:
A:Client向Resource Owner发出认证请求。
B:Resource Owner对Client的请求给予授权,并给Client颁发一个授权令 牌Authorization Code。
C:Client携带Authorization Code对Authorization Server发起授权请求。
D:Authorization Server对Client的请求给予授权,并给Client颁发一个授权令牌Access Token。
E:Client携带Access Token向Resource Server请求用户信息资源。
F:Resource Server验证Access Token合法后将用户信息资源发回给Client。


自己抓包的过程

用户请求第三方网站接口,说明 要以微博登陆方式进行登陆

GET /api/callback/wb/2 HTTP/1.1
Host: passport.A.com.cn

第三方网站允许以微博方式进行登陆,并且302跳转到微博API服务器 让用户进行授权去获取微博的个人用户数据,在请求的过程中会携带state参数,该参数的值是一个随机数,作用是防止CSRF中间人攻击

HTTP/1.1 302 Moved Temporarily
Set-Cookie: connect_state=bced289017a64b36b655c823df191637; Max-Age=600000; Expires=Thu, 23-Apr-2020 03:52:52 GMT; Path=/
Location: https://api.weibo.com/oauth2/authorize?client_id=2529799849&redirect_uri=https://passport.A.com.cn/api/callback/wb/A&response_type=code&state=bced289017a64b36b655c823df191637

client_id用来识别哪个第三方网站需要进行授权,redirect_uri表示验证之后成功/失败后返回的网站,response_type表示要求返回授权码,state验证随机数

GET /oauth2/authorize?client_id=2529799849&redirect_uri=https://passport.A.com.cn/api/callback/wb/A&response_type=code&state=9e17b9931b0f43498e2382362425a51b HTTP/1.1
Host: api.weibo.com

当用户进行验证成功了之后,微博接口会返回一个code作为授权码返回给之前的redirect_uri指向的站点

HTTP/1.1 302 Found
Location: https://passport.A.com.cn/api/callback/wb/A?state=9e17b9931b0f43498e2382362425a51b&code=9578dfa3d685f82485f9874c340b2c53

在之后第三方网站要获取用户的个人数据的时候,都会带上这个授权码code来进行请求

GET /api/callback/wb/A?state=9e17b9931b0f43498e2382362425a51b&code=984476766e4539dfeb73aa19fbe8649e HTTP/1.1
Host: passport.A.com.cn

如果自己这样看起来的话 好像code就是token吗?是这样理解的吗?

OAUTH中可能存在的安全问题:

自己总结一下可能有的问题,详细的参考上面的人写的文章

1、当没有进行类似state进行验证的时候,可能会出现CSRF劫持漏洞,又或者可以尝试去发现是否可以跨域资源共享寻找是否可以先得到参数的值,然后就去请求

2、可能会出现的redirect_uri劫持漏洞,同样的是没有对验证的时候回调网址redirect_uri的验证,如果验证了也可以尝试fuzz逃逸,或者只是白名单寻找该父域下的子站点,前提需要类似一个url跳转漏洞!

OAUTH机制参考文章:http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

一般网站认证的方式都是采用:授权码的方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌,其他三种方式参考OAUTH机制文章!

原文地址:https://www.cnblogs.com/zpchcbd/p/11784045.html