前言

老洞新谈,重复造属于自己的轮子。

什么是OAuth2.0协议

在OAuth协议还没有产生之前,如果我们想要登录一个网站,而这个网站又支持第三方登录,例如QQ登录。那么我们就只能在这个网站上输入QQ账号和密码,这个网站同时也就知道了我们的账号和密码,这势必会产生一些安全问题,而OAuth协议就是为了解决这些安全问题而产生的,Oauth2.0是Oauth协议的升级版。总的来说,OAuth2.0就是客户端和认证服务器之间由于相互不信任而产生的一个授权协议。

本篇文章不过多说OAuth协议的原理等,贴个原理地址,Oauth原理

协议四种模式:

  • 授权码模式(authorization code)

  • 简化模式(implicit)

  • 密码模式(resource owner password credentials)

  • 客户端模式(client credentials)

安全性我们主要关注四个参数。

  • redirect_url:回调域名

  • client:必须与域名绑定

  • state:防止CSRF

  • scope:权限范围

配置不当所产生的危害

CSRF

漏洞产生原因在于State参数未添加或者未起作用。

复现步骤:

1:第三方网站请求登录客户端。

2:输入QQ账号密码,https://XXX.com/back/qq?code=35072F11AEE413B87553B32F6168B5DA&state=TCHmIyWrvP

3:删去state参数,把请求发给受害者。

4:受害者点击后,登录我的账号。

Scope越权

例如URL里的原本参数是这样的。Scope:read。我截取这个请求然后修改一下为Scope:write。如果我们可以修改文件,就说把原本可读的权限越权修改成了可写的权限。

Redirect参数未严格限制

这里以QQ的OAuth2.0接口为例,假如地址是这样的:

https://graph.qq.com/oauth2.0/show?client_id=10086&redirect_uri=https://XXX/back/qq&state=TCHmIyWrvP)

当我们登录成功后,会把codestate拼接到redirect_uri之后,如果这个redirect_uri可以是任何值,那么我们的code是不是就遭到了泄露?但是这里的client_id就破灭了你的这个想法,服务器会验证client_id是否和redirect_uri规定的域一致,如果不一致则无法登陆。这里就又有了个新的攻击手法,如何在redirect_uri规定的域中有一个open redirect,我们就可以从referer中看到token,达到一样的攻击效果。

下面来一点Open Redirect Bypass:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
///www.bywalks.com/%2f%2e%2e
///www.bywalks.com/%2f%2e%2e/
/https:/%5cbywalks.com/
//www.bywalks.com/%2f%2e%2e
//www.bywalks.com
/www.bywalks.com
https://www.google.com/www.bywalks.com
/%2Fbywalks%252Ecom
http://www.google.com\.bywalks.com
http://www.google.com\@bywalks.com
http://www.google.com\#bywalks.com
http://www.google.com\?bywalks.com
http://www.google.com\\bywalks.com
http://www.google.com\bywalks.com

如何修复

1:做好Scope的权限验证。

2:state参数一次验证后失效。

3:redirect_uri严格控制。