🔍 URL跳转漏洞审计与渗透分析手册
🧠 一、漏洞原理概述
URL跳转漏洞(Unvalidated Redirects) 发生在服务端根据用户可控输入进行跳转,却未对跳转目标地址进行有效验证。
🔗 典型攻击场景:
https://example.com/go?url=https://evil.com
若后端直接使用:
response.sendRedirect(url);
攻击者即可构造合法页面诱导用户跳转到恶意地址。
🧪 二、常见跳转方式与源码审计点
跳转方式 | 所属层 | 示例代码 | 框架自动校验 |
---|---|---|---|
ModelAndView("redirect:") | Spring MVC | new ModelAndView(" redirect:" + url) | ❌ |
return "redirect:" + url | Spring MVC | return "redirect:" + url | ❌ |
sendRedirect(url) | Servlet | response. sendRedirect(url) | ❌ |
setHeader("Location", url) | Servlet | response.setHeader(" Location", url) | ❌ |
RedirectAttributes | Spring MVC | return "redirect:" + url | ❌ |
🧬 示例:sendRedirect
@RequestMapping("/go")
public void go(@RequestParam String url, HttpServletResponse response) throws IOException {
response.sendRedirect(url); // ⚠️ 高危
}
🛡️ 防御建议:
- 加白名单验证:
if (!url.startsWith("/")) throw new IllegalArgumentException("非法跳转");
- 或使用映射:
if ("home".equals(urlKey)) return "redirect:/home";
🕵️ 三、黑盒渗透实战技巧
🎯 参数枚举策略:
尝试以下参数名:
?redirect=
?url=
?next=
?returnTo=
?dest=
?continue=
?target=
🧪 实战 payload 构造:
类型 | 示例 Payload | 用途说明 |
---|---|---|
标准 URL | https://evil.com | 直接跳转测试 |
协议相对路径 | //evil.com | 绕过协议限制 |
编码绕过 | %2f%2fevil.com | Bypass 路径限制 |
子域钓鱼 | https://example.com.evil.com | 欺骗用户混淆 |
内嵌@欺骗 | https://example.com@evil.com | 用户以为是 example.com |
🧰 Burp Suite 实用插件:
- Autorize:测试跳转是否绕过权限控制
- Turbo Intruder:批量 fuzz 跳转参数
- Redirect Tracker:观察跳转链
- Logger++:记录跳转响应变化
📌 渗透案例:
GET /login?next=https://evil.com HTTP/1.1
Host: secure.example.com
若返回:
HTTP/1.1 302 Found
Location: https://evil.com
即为漏洞点,可用于社工钓鱼、OAuth 劫持、权限绕过。
实例参考:一次点击,令 OAuth 失守!URL 跳转 + Token 劫持攻击链全解析
更多利用:URL 跳转漏洞利用方式详解:不仅仅是钓鱼这么简单!
🛡️ 四、安全加固建议(推荐措施)
- ✅ 跳转目标白名单
List<String> whitelist = List.of("/home", "/dashboard");
if (!whitelist.contains(url)) throw new SecurityException("非法跳转!");
- ✅ 使用 URL 签名机制
- 为跳转参数添加 HMAC 校验
- 防止用户伪造外部跳转地址
- ✅ 中转确认页
- 用户跳转前显示提示页面,引导确认
- 提高用户可感知性
- ✅ 避免用户直接控制 URL
- 可通过枚举跳转目标、绑定 ID 的方式替代动态 URL
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容