oauth重定向之账号劫持(account takeover)
字数 1387 2025-08-26 22:11:40

OAuth重定向漏洞导致的账号劫持分析

漏洞概述

OAuth验证功能中的重定向漏洞可能导致账号凭证泄漏,进而造成账户劫持(Account Takeover)。本文通过两个实际案例详细分析此类漏洞的成因、利用方式及防御措施。

基础知识

OAuth验证流程中常见的重定向漏洞类型:

  • 开放重定向(Open Redirect)
  • 重定向URL验证不严格
  • 重定向URL解析不一致

案例一:基于前缀白名单的绕过

漏洞环境

  • 主站登录使用微信扫码登录(微信端OAuth)
  • 正常流程:点击登录 → 跳转扫码页面 → 扫码 → 请求open.wx OAuth验证 → 返回并跳转

漏洞分析

正常请求格式:

https://project1/passport/login?redirect_uri=https%3A%2F%2Fproject1&client_id=xxx&response_type=code

漏洞点

  1. URL验证仅基于前缀白名单校验
  2. 未正确处理URL中的认证信息部分

绕过方式

  1. 认证信息注入

    https://project1/passport/login?redirect_uri=https%3A%2F%2Fproject1:aa@p7x40l87381fczt3bw3zy7m5owuyin.burpcollaborator.net
    
    • project1:aa@部分被解释为认证信息
    • 实际重定向到burpcollaborator.net
  2. 子域名绕过

    https://project1/passport/login?redirect_uri=https%3A%2F%2Fproject1.attacker.com
    

利用结果

攻击者可获取OAuth code,导致账户劫持。

案例二:复杂URL解析逻辑的绕过

漏洞环境

  • 正常功能URL:
    https://project2/uc/Login.html?THREETYPE=2&BACKURL=https%3a%2f%2fproject2%2f
    
  • 两步验证机制:
    1. 前端请求时服务端验证URL合法性
    2. 服务端验证参数格式:{"url":"project2"}(仅host部分)

漏洞分析

验证逻辑特点

  1. 严格验证URL格式:
    • 允许:project2
    • 拒绝:project2?a=1, project2:aa@url, project2@url
  2. 从完整URL提取host的算法:
    • 寻找第一个//并截断
    • 然后寻找第一个/并截断

绕过方式

  1. 协议滥用

    • 服务端未验证协议类型
    • 允许任意协议前缀:a://project2/
  2. 双斜杠利用

    a:b@attacker_url%2f%2fproject2%2f
    
    • 浏览器将//解释为/
    • 服务端验证时解析为project2(合法)
    • 实际重定向到attacker_url

利用结果

成功绕过验证,将用户重定向到攻击者控制的URL。

漏洞利用链

  1. 构造恶意重定向URL
  2. 诱导用户点击或自动访问
  3. 用户完成OAuth授权
  4. 授权码(code)泄漏到攻击者服务器
  5. 攻击者使用code获取访问令牌
  6. 实现账户劫持

防御措施

  1. 严格的URL验证

    • 完整URL匹配而非前缀匹配
    • 验证协议必须为HTTPS
    • 禁止URL中包含认证信息(user:pass@)
  2. 白名单机制

    • 维护精确的域名白名单
    • 禁止子域名通配(除非明确需要)
  3. URL解析一致性

    • 确保客户端和服务端使用相同的URL解析逻辑
    • 使用标准库解析URL而非自定义逻辑
  4. 其他防护

    • 限制授权码有效期
    • 实施PKCE(Proof Key for Code Exchange)机制
    • 敏感操作需要二次验证

经验总结

  1. 深入理解URL规范和浏览器解析差异
  2. 掌握各种协议的处理方式(如//的特殊性)
  3. 分析验证逻辑时要考虑客户端和服务端的解析差异
  4. 系统化的测试方法比盲目fuzz更有效
  5. 基础知识的深度决定漏洞挖掘的广度

测试方法论

  1. 测试URL验证的严格程度:

    • 修改协议(http/https/其他)
    • 添加认证信息
    • 尝试子域名/相似域名
  2. 分析验证逻辑:

    • 比较请求和响应中的URL处理
    • 观察验证失败时的错误信息
  3. 尝试解析不一致:

    • 客户端和服务端可能对同一URL解释不同
    • 利用特殊字符和编码差异
  4. 验证重定向目标:

    • 确保最终跳转的URL完全受控
    • 检查敏感参数是否泄漏
OAuth重定向漏洞导致的账号劫持分析 漏洞概述 OAuth验证功能中的重定向漏洞可能导致账号凭证泄漏,进而造成账户劫持(Account Takeover)。本文通过两个实际案例详细分析此类漏洞的成因、利用方式及防御措施。 基础知识 OAuth验证流程中常见的重定向漏洞类型: 开放重定向(Open Redirect) 重定向URL验证不严格 重定向URL解析不一致 案例一:基于前缀白名单的绕过 漏洞环境 主站登录使用微信扫码登录(微信端OAuth) 正常流程:点击登录 → 跳转扫码页面 → 扫码 → 请求open.wx OAuth验证 → 返回并跳转 漏洞分析 正常请求格式: 漏洞点 : URL验证仅基于前缀白名单校验 未正确处理URL中的认证信息部分 绕过方式 认证信息注入 : project1:aa@ 部分被解释为认证信息 实际重定向到 burpcollaborator.net 子域名绕过 : 利用结果 攻击者可获取OAuth code,导致账户劫持。 案例二:复杂URL解析逻辑的绕过 漏洞环境 正常功能URL: 两步验证机制: 前端请求时服务端验证URL合法性 服务端验证参数格式: {"url":"project2"} (仅host部分) 漏洞分析 验证逻辑特点 : 严格验证URL格式: 允许: project2 拒绝: project2?a=1 , project2:aa@url , project2@url 从完整URL提取host的算法: 寻找第一个 // 并截断 然后寻找第一个 / 并截断 绕过方式 协议滥用 : 服务端未验证协议类型 允许任意协议前缀: a://project2/ 双斜杠利用 : 浏览器将 // 解释为 / 服务端验证时解析为 project2 (合法) 实际重定向到 attacker_url 利用结果 成功绕过验证,将用户重定向到攻击者控制的URL。 漏洞利用链 构造恶意重定向URL 诱导用户点击或自动访问 用户完成OAuth授权 授权码(code)泄漏到攻击者服务器 攻击者使用code获取访问令牌 实现账户劫持 防御措施 严格的URL验证 : 完整URL匹配而非前缀匹配 验证协议必须为HTTPS 禁止URL中包含认证信息( user:pass@ ) 白名单机制 : 维护精确的域名白名单 禁止子域名通配(除非明确需要) URL解析一致性 : 确保客户端和服务端使用相同的URL解析逻辑 使用标准库解析URL而非自定义逻辑 其他防护 : 限制授权码有效期 实施PKCE(Proof Key for Code Exchange)机制 敏感操作需要二次验证 经验总结 深入理解URL规范和浏览器解析差异 掌握各种协议的处理方式(如 // 的特殊性) 分析验证逻辑时要考虑客户端和服务端的解析差异 系统化的测试方法比盲目fuzz更有效 基础知识的深度决定漏洞挖掘的广度 测试方法论 测试URL验证的严格程度: 修改协议(http/https/其他) 添加认证信息 尝试子域名/相似域名 分析验证逻辑: 比较请求和响应中的URL处理 观察验证失败时的错误信息 尝试解析不一致: 客户端和服务端可能对同一URL解释不同 利用特殊字符和编码差异 验证重定向目标: 确保最终跳转的URL完全受控 检查敏感参数是否泄漏