开放重定向:看起来无害,实际是钓鱼的跳板

Web安全 · 2 分钟阅读· 417 次阅读

「登录后跳回你刚才的页面」是个好体验,实现方式通常是 ?next=xxx。如果没有白名单,攻击者可以让你跳去任意站点。

危害不只是钓鱼:OAuth 流程里,回调地址校验不严会导致授权码被带到攻击者服务器。

先说结论

只允许站内相对路径,或对域名做严格白名单。 不要用「包含本站域名」这种判断。

  • 跳转参数只接受以 / 开头且非 // 的路径
  • 需要外跳时用固定映射表,不接受任意 URL
  • OAuth 回调地址必须精确匹配注册值
  • 跳转前给用户提示(可选)

漏洞是怎么产生的

常见的错误校验是「字符串里包含本站域名」,于是 evil.com/?x=本站域名 也能通过。

正确做法是解析 URL 后比较 host,或者干脆只允许相对路径。

修复与验证

修复不是改一行代码,而是四件事一起做:

  • 找出所有跳转参数:登录、登出、支付回跳、短链
  • 限制为站内相对路径,拒绝 // 与协议头
  • 必须外跳时用白名单映射(key → 目标地址)
  • OAuth 回调做精确匹配,不做前缀匹配
  • 记录异常跳转尝试,作为攻击迹象

攻击面与检测点

按影响面排序,先修影响最大的:

校验方式 是否可靠 原因
包含域名 不可靠 子串匹配可绕
前缀匹配 不可靠 evil.com/本站 可绕
host 相等 可靠 需注意端口与协议
相对路径 最可靠 无法跳出站

开放重定向

几个容易踩的坑

下面这些是最常见的错误做法:

  • 用 startswith('http') 判断:任意外链都通过
  • 正则匹配不严谨:换行与 @ 可绕
  • OAuth 回调前缀匹配:子路径可被利用
  • 忘记 URL 解码:编码后的 // 依然危险

写在最后

跳转是最容易被忽视的「小功能」,但它经常是钓鱼链条的第一跳。

安全不是一次加固,是持续的假设:假设输入不可信、假设边界会破、假设有人会看错。

评论 (3)

半
半箱油

修复清单比漏洞描述有用多了,很多文章只讲怎么打不讲怎么防。

白
白帽小林

白名单那条永远是最有效的,正则黑名单迟早绕过。

运
运维老张

建议再补一条:把这类检查加到 CI 里,靠人记必然漏。

发表评论

验证码

提交后需站长审核,通过后才会显示。