结论:开放重定向指应用根据用户可控参数(?next=http://evil.com)无校验地跳转。单独看危害有限,但它是钓鱼和 OAuth 令牌窃取的放大器:链接域名是可信的(银行/大平台),用户检查后放心点击,落地却是钓鱼站;在 OAuth 流程中可导致授权码/token 被送往攻击者域名。
展开:三类实战危害:1)钓鱼——伪造登录过期页,从正规域名 302 到仿冒登录页,配合 punycode 域名肉眼难辨,安全培训里"检查域名"的建议被直接瓦解;2)OAuth/OIDC 链条——redirect_uri 校验若允许子路径/子域通配,open redirect 端点可把 ?code=xxx 接力转发到攻击者服务器,code 换 token 完成账号接管;3)绕过安全控制——某些基于来源域名的白名单(SSRF 过滤、CORS 配置)被 redirect 跳板绕过。修复:跳转目标走相对路径白名单或域名白名单精确匹配(注意 evil-trusted.com、trusted.com.evil.com、trusted.com@evil.com 三类绕过变体,解析后比较 host 而非字符串前缀);业务确需跳外网时加中间确认页。易错点://evil.com(协议相对)和 %2f%2fevil.com 编码绕过,校验前要完整 URL 解析归一化。
from urllib.parse import urlparse
def safe_next(url, fallback="/"):
u = urlparse(url)
if u.scheme or u.netloc: # 只允许站内相对路径
return fallback
return url
追问方向:开放重定向在 bug bounty 中为何常被评级提升(chain 价值)、postMessage 目标校验缺失与它的相似性。