网络安全防护:URL跳转漏洞
目录
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%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"]
更多推荐



所有评论(0)