关于第三方登陆我们还能做些什么
字数 1199 2025-08-20 18:17:07
第三方登录安全风险与防护措施详解
1. JavaScript跳转导致的XSS攻击
攻击原理
- 在第三方登录流程中,部分厂商使用JavaScript进行跳转而非HTTP 302重定向
- 跳转目标URL参数未经过严格过滤,导致XSS漏洞
- 此类XSS通常位于登录域名下,危害更大(可访问核心cookie)
典型攻击场景
- 登录流程示例:
https://passport.aaa.com/login?type=QQ&u=https://www.aaa.com/xianzhitest - 认证成功后回调:
https://passport.aaa.com/auth?code=565B415BD1DE9&state=1583668657 - 通过JavaScript跳转回原始URL参数
漏洞利用方式
- 直接注入:当回调URL参数未过滤时,可注入恶意脚本
var callbackUrl = "javascript://%0aalert(1)"; window.location.href = callbackUrl; - 跨域cookie设置:通过控制
clearSsoUrls数组中的URL,可窃取ticketvar clearSsoUrls = [["https://store.aaa.com/xman/user/ac-set-img-sso-cookie?ticket=c66428aec0", "http://www.bbb.com/setssocookieac.php?ticket=c66428aec0"]];
防护措施
- 对输出在script标签中的内容进行严格转义:
\、/、'、" - 对输出在属性中的内容,防范伪协议利用
- 如输出点在HTML标签中,进行HTML实体转义
- 优先使用302跳转而非JavaScript跳转(注意防范CRLF注入)
2. 微博快捷登录域名配置错误
攻击原理
- 微博OAuth未强制校验回调地址,仅依赖开发者配置
- 攻击者可修改
redirect_uri参数指向可控子域名
典型攻击场景
- 原始微博登录链接:
https://api.weibo.com/oauth2/authorize?client_id=2512457640&response_type=code&redirect_uri=https%3A%2F%2Fpassport.baidu.com%2Fphoenix%2Faccount%2Fafterauth - 修改
redirect_uri为攻击者可控的子域名:redirect_uri=https%3A%2F%2Fevil.baidu.com%2Fattack
漏洞利用方式
- 在可控子域名下放置可接收referer的资源(如图片)
- 通过referer获取用户的认证code和state
防护措施
- 在微博开发者中心严格设置允许的回调域名
- 实现服务端校验,确保回调地址与预设值一致
3. 绑定接管的攻击
攻击原理
- 首次使用第三方账号登录后,系统要求绑定现有账号
- 绑定链接可被共享且无足够安全提示,导致账号被接管
典型攻击场景
- 首次第三方登录后的绑定链接:
https://passport.aaa.com/account/sina?code=0e563372a36017 - 攻击者诱骗受害者访问此链接并绑定账号
常见防护措施及绕过方法
-
加强页面提醒(显示第三方账号昵称和头像)
- 绕过:攻击者可修改第三方账号信息(如使用目标网站logo作为头像)
-
一次性code(访问后失效)
- 绕过:攻击者获取code后不自行访问,直接发给受害者
-
Referer校验
- 绕过:使用跳转结合方式绕过referer检查
有效防护措施
- 在跳转至第三方登录时设置随机token cookie
Set-Cookie: third=random_value - 回调时验证URL参数中的token与cookie中的值是否匹配
- 避免强制绑定,改为让用户在个人中心自行绑定账号
总结与最佳实践
-
跳转安全
- 优先使用HTTP 302跳转而非JavaScript跳转
- 对所有跳转参数进行严格过滤和编码
-
OAuth配置
- 严格限制回调域名
- 实现服务端回调地址验证
-
账号绑定流程
- 使用一次性token验证机制
- 提供清晰的绑定提示(包括第三方账号详细信息)
- 考虑延迟绑定策略,不强制首次登录时绑定
-
防御深度
- 实施多层防御措施,避免单一防护被绕过
- 定期审计第三方登录实现的安全性
通过实施这些措施,可有效降低第三方登录带来的安全风险,保护用户账号安全。