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
漏洞点:
- URL验证仅基于前缀白名单校验
- 未正确处理URL中的认证信息部分
绕过方式
-
认证信息注入:
https://project1/passport/login?redirect_uri=https%3A%2F%2Fproject1:aa@p7x40l87381fczt3bw3zy7m5owuyin.burpcollaborator.netproject1:aa@部分被解释为认证信息- 实际重定向到
burpcollaborator.net
-
子域名绕过:
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 - 两步验证机制:
- 前端请求时服务端验证URL合法性
- 服务端验证参数格式:
{"url":"project2"}(仅host部分)
漏洞分析
验证逻辑特点:
- 严格验证URL格式:
- 允许:
project2 - 拒绝:
project2?a=1,project2:aa@url,project2@url
- 允许:
- 从完整URL提取host的算法:
- 寻找第一个
//并截断 - 然后寻找第一个
/并截断
- 寻找第一个
绕过方式
-
协议滥用:
- 服务端未验证协议类型
- 允许任意协议前缀:
a://project2/
-
双斜杠利用:
a:b@attacker_url%2f%2fproject2%2f- 浏览器将
//解释为/ - 服务端验证时解析为
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完全受控
- 检查敏感参数是否泄漏