高级OAuth密钥泄露导致账户接管(ATO)漏洞分析
OAuth基础原理
OAuth是一种委托访问框架,允许第三方应用在不共享密码的情况下代表用户执行操作。OAuth 1.0使用签名机制,而OAuth 2.0通过依赖TLS和承载令牌简化了流程。
OAuth 2.0允许用户使用外部提供商(如Google、Apple、Facebook)登录客户端应用,而无需在客户端输入邮箱或密码,核心在于后台的令牌交换机制。
关键组件
- 授权服务器:认证用户并颁发令牌的提供商(如Google)
- 客户端应用:通过OAuth登录的目标网站
- 授权码:从授权服务器获取的一次性代码,用于交换访问令牌
- 访问令牌:授予受保护资源访问权限的令牌
- 资源服务器:托管用户数据的服务器(如Google API服务器)
OAuth流程示意图
|
|
攻击场景分析
场景一:CSRF攻击(state参数缺失)
state参数在第一步设置,可存储在cookie或本地存储中。授权服务器在多次重定向后验证第一步发送的state令牌是否与第三步一致。
如果应用程序不要求state参数,且授权服务器不进行验证,攻击者可通过CSRF攻击实现账户接管。
场景二:开放重定向(redirect_uri参数)
redirect_uri参数指定服务器重定向用户的URL,是重定向攻击的主要载体。攻击者配置自己的服务器作为redirect_uri,当受害者被重定向时,攻击者即可获取授权码。
现代应用通常会对redirect_uri进行白名单验证,因此攻击者需要利用开放重定向或其他技术窃取授权码。
绕过方法:
- 使用/indexOF: target.com.Attacker.com
- 伪造相对路径://attacker.com
- 使用/?前缀:https://attacker.com@target.com
- 多行正则表达式:attacker.com%0d%0atarget.com
- 参数污染:redirect=https://target.com&redirect=https://attacker.com
场景三:响应模式滥用(response_mode参数)
正常参数值为query,另一种可能值为fragment。当使用fragment模式时,授权码会出现在URL片段中而非查询参数。
如果回调端点只读取查询参数而忽略片段,授权码将暴露但未被使用。结合其他漏洞(如XSS)可导致授权码泄露,进而实现账户接管。
场景四:组合攻击(CSRF + 开放重定向)
通过改变response_mode为fragment,并在redirect_uri中嵌入攻击者代码,授权服务器会将受害者重定向到攻击者URL,受害者的授权码保留在URL片段中。
由于片段在重定向过程中保持不变,攻击者可提取授权码并交换为访问令牌,最终实现账户接管。
漏洞严重性
所有上述漏洞的严重等级均为严重级别,可导致完整的账户接管攻击。
签名:Mado
感谢阅读,希望本文对您有所帮助