302 跳转导致 Token 泄露

一、基本情况

  • 漏洞简述:登录劫持,利用登录任意跳转携带 Token 的特性,诱导用户点击恶意登录链接,登录成功后攻击者可获取该用户的 Token 值
  • 漏洞危害:高

二、问题描述

漏洞详情描述及截图

1. 登录任意跳转携带 Token

  • 漏洞机制
    用户点击登录链接后,通过 302 跳转至统一认证登录页面。完成登录后,账户 Token 被绑定并共享至其他关联域名站点,实现单点登录(SSO)。在跳转过程中,redirectUrl 参数未严格校验,导致攻击者可通过构造恶意回调地址窃取 Token。
  • 复现步骤
    1. 选择任意站点,构造以下登录链接:

https://global.test.com/signin?bizSource=Y25fb25lcG9ydGFs&redirectUrl=https%3A%2F%2Fsolution.test.com%2Faccount%2F

  • 正常情况下,用户在 global.test.com 完成统一认证后,获取 Token 并携带 Token 跳转至 redirectUrl 指定的地址。
  1. 构造恶意 Payload,利用 @ 符号绕过限制:

    https://global.test.com/signin?bizSource=Y25fb25lcG9ydGFl&redirectUrl=https%3A%2F%2Fsolution.test.com@www.test.com

  • redirectUrl 后添加 @www.test.com,使浏览器登录成功后携带 Token 访问攻击者控制的域名(如 www.test.com)。

  • 这是浏览器发出的登陆包,返回成功会给用户一个token。

  • 浏览器带上此token去访问绕过后的站点,

查看自己网站的访问日志,收到该用户的token,

1、模拟攻击,让受害者在a点登陆,攻击者通过群发登陆地址等,受害者登陆成功,攻击者获得token,成功登陆受害者账户,

2、

  • 风险点
  • redirectUrl 参数未进行严格的域名白名单校验,攻击者可利用开放重定向将 Token 发送至任意外部站点。
  • (此处建议附上截图,例如:登录请求包、响应中的 Token、攻击者网站日志中的 Token 记录等。)

2. 模拟攻击场景

  • 攻击流程
  1. 攻击者构造恶意登录链接(如上述 Payload),通过群发邮件、社交平台等方式分发给受害者。
  2. 受害者在诱导下点击链接并登录,完成统一认证后,Token 被泄露至攻击者控制的站点。
  3. 攻击者获取 Token,使用该 Token 冒充受害者登录其账户,接管相关权限。

三、修复建议

  • 禁止非源跳转
  • 在服务器端增加 redirectUrl 的校验逻辑,设置域名白名单,仅允许跳转至本网站或可信关联域名的链接。
  • 示例整改方案:
  1. 检查 redirectUrl 的域名是否属于白名单(如 *.test.com)。
  2. 对非白名单域名直接拒绝跳转,返回错误提示。
  • 这样可有效防止 Token 被恶意重定向至外部站点。