目录
1、概念
URL跳转漏洞(也称为开放重定向漏洞)是一种常见的Web安全漏洞,攻击者利用此漏洞诱使用户访问恶意网站,从而实施钓鱼攻击、恶意软件传播或窃取敏感信息。
2、原理
当Web应用将用户请求重定向到另一个URL时,若目标地址未经验证或未严格限制,攻击者可构造恶意URL,使应用将用户重定向至钓鱼网站或恶意页面。
关键点:
-
应用使用参数动态生成跳转目标(如
?url=https://target.com
)。 -
跳转目标未校验来源或合法性(如未验证域名、协议)。
3、漏洞类型与示例
3.1 服务端跳转
302重定向:服务器返回302 Found
+ Location: 目标URL
。
GET /redirect?url=http://evil.com HTTP/1.1
Host: victim.com
服务器显示:
HTTP/1.1 302 Found
Location: http://evil.com
3.2 客户端跳转
JavaScript跳转:前端通过window.location
或<meta>
标签跳转。
<script>
window.location = "http://evil.com";
</script>
3.3 伪协议跳转
利用javascript:
或data:
协议执行恶意代码(需用户交互)。
https://victim.com/redirect?url=javascript:alert(document.cookie)
4、攻击场景与危害
攻击类型 | 危害描述 |
---|---|
钓鱼攻击 | 伪造登录页面窃取账号密码(如伪装成银行、邮箱登录页)。 |
恶意软件分发 | 重定向至挂马页面,触发浏览器漏洞下载木马。 |
绕过安全策略 | 利用受信任域名跳转至恶意站点,规避浏览器安全警告。 |
OAuth/SSO劫持 | 在OAuth回调中注入恶意redirect_uri ,窃取授权码或Token。 |
组合漏洞利用 | 与XSS/CSRF结合,扩大攻击面(如通过跳转触发CSRF)。 |
使用场景举例:
1> 登陆功能跳转
比如用户正在访问http://www.aaa.com/detail?sku=123456的商品,添加购物车时触发登录操作,跳转到统一登陆认证页面进行登录,这时的访问链接为http://login.aaa.com?returnUrl=http://www.aaa.com/detail?sku=123456,认证成功之后浏览器继续返回商品详情页面方便用户进行购买操作。若login.aaa.com对returnUrl参数检查不严格甚至未检查,通过该链接可跳转至任意网站。
常见的跳转场景:
1. 用户登录、统一身份认证处,认证完后会跳转
2. 用户分享、收藏内容过后,会跳转
3. 跨站点认证、授权后,会跳转
4. 站内点击其它网址链接时,会跳转
5. 业务完成后跳转
比如修改密码,修改完成后跳转登陆页面,绑定银行卡,绑定成功后返回银行卡充值等页面
比如评价系统,填写完问卷调查、客服评价等业务操作后跳转页面
2> 钓鱼链接
如果 aaa.com 下的某个 web 应用程序存在这个漏洞,恶意攻击者可以发送给用户一个 aaa.com 的链接,但是用户打开后,却来到钓鱼网站页面,将会导致用户被钓鱼攻击,账号被盗,或账号相关财产被盗。
5、漏洞利用步骤
5.1 发现跳转点
-
查找包含
redirect
、url
、next
、return
等参数的URL。 -
测试参数值修改为外部域名(如
?url=http://attacker.com
)。
高频跳转参数:
参数名 | 典型出现场景 | 示例 |
---|---|---|
redirect | 登录/退出后跳转 | ?redirect=https://evil.com |
url | 通用跳转参数 | ?url=//attacker.com |
next | 操作完成后跳转(如登录、支付) | ?next=/attacker-path |
return | 返回原页面或指定页 | ?return_url=http://phish.com |
target | 指定跳转目标 | ?target=javascript:alert(1) |
to | 短路径跳转指示 | ?to=https%3A%2F%2F2.zoppoz.workers.dev%3A443%2Fhttps%2Fevil.com |
rurl | Redirect URL缩写 | &rurl=data:text/html,<h1>Malicious</h1> |
易被忽略的隐藏参数:
参数名 | 特点 | 绕过技巧 |
---|---|---|
r | 缩写形式(常见于框架) | ?r=\\evil.com@victim.com |
forward | 内部转发参数 | ?forward=https:attacker.com |
dest | Destination缩写 | ?dest=%0d%0aLocation:http://evil.com |
go | 短指令跳转 | ?go=//evil.com/%23victim.com |
jump | 前端跳转相关 | ?jump=javascript:fetch('/steal-cookie') |
5.2 绕过防御机制
# 域名白名单绕过
https://victim.com/redirect?url=https://attacker.com.victim.com // 子域名欺骗
http://www.abc.com?returnUrl=http://www.evil.com/www.abc.com
http://www.aaa.com?returnUrl=http://www.evil.com?www.aaa.com //利用问号?
http://www.aaa.com?returnUrl=http://www.evil.com\www.aaa.com //利用反斜线
http://www.aaa.com?returnUrl=http://www.aaa.com@www.evil.com //利用@符号
http://www.aaa.com?returnUrl=http://www.evil.com#www.aaa.com //利用井号#
# 缺失协议
https://victim.com/redirect?url=//attacker.com
http://www.aaa.com?returnUrl=/www.evil.com
# 编码混淆
https://victim.com/redirect?url=%68%74%74%70%3a%2f%2f%65%76%69%6c%2e%63%6f%6d // Hex编码
# 多次次跳转,即aaa公司信任ccc公司,ccc公司同样存在漏洞或者提供跳转服务
http://www.aaa.com?returnUrl=http://www.ccc.com?jumpto=http://www.evil.com
6、防御措施
6.1 严格校验跳转目标
-
白名单机制:仅允许跳转至预定义的信任域名列表。
-
拒绝外部域名:禁止重定向到非当前域名及其子域名。
6.2 固定跳转路径
-
使用映射ID代替完整URL(如
?page_id=2
→ 映射到/home
)。
6.3 用户确认提示
-
跳转前显示警告(如“您将离开本站,继续访问 http://external.com 吗?”)。
6.4 技术层防护:白名单校验
// Java示例:白名单校验
private static final List<String> ALLOWED_DOMAINS = Arrays.asList("trusted.com", "victim.com");
public String safeRedirect(String url) {
URI uri = new URI(url);
if (!ALLOWED_DOMAINS.contains(uri.getHost())) {
return "/error"; // 默认安全页面
}
return url;
}
6.5 其他建议
-
避免前端跳转参数暴露(如通过Session存储目标URL)。
-
使用
Content-Security-Policy: frame-ancestors 'self'
防止嵌套恶意页面。
7、漏洞检测方法
-
手动测试:
-
修改跳转参数值为外部域名,观察是否成功跳转。
-
尝试
%00
、%0d%0a
等特殊字符绕过校验。
-
TOP 3 危险参数:
redirect
、url
、next
(占漏洞报告的70%+)最易忽略参数:
r
、jump
、dest
(常见于老旧系统)最高危值类型:
javascript:
、data:
、//外部域名
(可直接触发攻击)
-
自动化工具:
-
使用Burp Suite、ZAP扫描包含跳转参数的请求。
-
编写脚本批量测试参数(如使用
ffuf
或golang
工具)。
-
使用工具(如 Burp Intruder)对以下列表进行爆破:
["redirect", "url", "next", "return", "target", "rurl", "callback", "jump", "forward", "go", "to", "uri", "path", "page", "checkout_url", "success_path"]