开放重定向是什么
当跳转类参数(redirect、next、return_url、callback 等)未做白名单校验时,攻击者可构造链接把用户从可信域名导向外部站点。它本身不直接窃取数据,但常与钓鱼、OAuth 授权码劫持、SSO 回调滥用结合,借可信域名降低受害者的警惕,因此在信任链相关的接口上定级会更高。
基本信息
| 常见入口 | redirect、next、return_url、callback、continue |
|---|---|
| 判定信号 | 响应直接返回 30x 并指向外部域 |
| 影响 | 钓鱼信任滥用、OAuth 与 SSO 回调链路风险 |
| 测试前提 | 准备好自建的无害测试站点作为跳转目标 |
| 边界 | 只做只读验证,不借助跳转投放任何内容 |
典型使用场景
- 登录与登出流程的返回地址参数
- 第三方登录与 SSO 的回调地址校验
- 支付完成后跳回商户页面的跳转参数
- 邮件与通知中的跳转链接参数
- 短链与推广链接重定向服务
验证步骤
验证步骤
# 1. 提交指向自建测试站点的地址,观察是否发生 30x 跳转
curl -si "https://target.example/login?next=https://test.example/a" | grep -i location
# 2. 尝试不同写法,检查校验强度
# - 协议相对写法://test.example/a
# - 多级跳转:先跳本站再跳外部
# - 后缀混淆:把外部域名拼在可信域名之后或之前
# 3. 记录参数名、完整跳转链(Location 序列)
# 4. 登录、登出、支付回调链路都要覆盖写法与信号读法
| 写法 | 意图 | 命中含义 |
|---|---|---|
| 完整外部地址 | 最基础的检测 | 命中即无校验,风险明确 |
| 协议相对地址 | 绕过只匹配 http 前缀的规则 | 命中说明校验不完整 |
| 多级跳转 | 绕过一次性校验 | 说明只校验了第一跳 |
| 后缀混淆 | 绕过结尾匹配的白名单规则 | 命中说明用字符串包含做判断 |
修复视角:只允许站内相对路径,或对域名做严格白名单(含协议与端口);对外链跳转增加中间确认页。
OAuth 场景的 redirect_uri 校验规则更严格,需单独核对:优先精确匹配注册地址,不做前缀或通配放行。