【Java代码审计】URL跳转漏洞篇
- 1.URL跳转漏洞概述
- 2.Java中的URL重定向
- 3.URL跳转漏洞修复
1.URL跳转漏洞概述
通俗地说,目前很多的Web应用因为业务需要,需与内部的其他服务或者第三方的服务进行交互,这样就需要重定向的功能,由当前网页跳转到第三方的网页
下面是URL跳转典型的实现代码:通过Header的重定向功能实现URL的跳转:
response.sendRedirect(redirectUrl);
URL跳转漏洞存在于URL跳转功能的业务系统中,若服务端对接收URL跳转的参数没有进行过滤和限制,攻击者就有可能构造一个恶意的URL地址,诱导其他用户访问恶意的网站
因为是从可信站点跳转而来的,故很多用户的安全意识比较薄弱,这样攻击者就可以在用户没有察觉的情况下通过可信站点跳转至事先搭建的钓鱼网站进行钓鱼攻击,URL跳转漏洞的危害很多,除了常见的钓鱼攻击,还能进行绕过聊天工具的检测等一系列操作
一般来讲,对于URL跳转漏洞在黑盒测试时主要的关注点为:注意URL中是否带有return、redirect、url、jump、goto、target、link
等参数值,并注意观察后跟的URL地址的具体格式,再构造相应的payload尝试跳转。在白盒审计中我们则会重点关注可以进行URL跳转的相关方法
2.Java中的URL重定向
1、通过ModelAndView方式
@RequestMapping("/redirect")
public ModelAndView redirect() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("redirect:/home"); // 通过重定向方式跳转到"/home"
return modelAndView;
}
2、通过返回String方式
@RequestMapping("/redirect")
public String redirect() {
return "redirect:/home"; // 通过重定向方式跳转到"/home"
}
3、使用sendRedirect方式
@RequestMapping("/redirect")
public void redirect(HttpServletResponse response) throws IOException {
response.sendRedirect("/home"); // 重定向到"/home"
}
4、使用RedirectAttributes方式
对于一般的URL跳转,使用redirect即可满足要求。如果需要进行参数拼接,则一般使用RedirectAttributes
@RequestMapping("/home")
public String home(RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("name", "John"); // 添加参数
return "redirect:/welcome"; // 重定向到"/welcome",参数会被自动拼接到URL中
}
5、通过设置Header来进行跳转
@RequestMapping("/oldUrl")
public void redirectToNewUrl(HttpServletResponse response) throws IOException {
String newUrl = "/newUrl";
response.setStatus(HttpServletResponse.SC_FOUND); // 设置302状态码
response.setHeader("Location", newUrl); // 设置跳转的URL
}
通过上面这些方法可以总结出URL跳转漏洞一些常见的关键字如下:
3.URL跳转漏洞修复
对于URL跳转漏洞,最有效的防御手段之一是严格控制要跳转的域名。若已知需要跳转URL,则可以直接在源码中写为固定值,例如:
@RequestMapping("/safeRedirect")
public String safeRedirect() {
// 固定的跳转URL
String targetUrl = "https://www.example.com/safe-page";
return "redirect:" + targetUrl;
}
当然,也可以使其只能根据路径跳转,而不是根据其URL跳转:
例如“http://localhost:8080/urlRedirect/forward?url=/urlRedirect/test
”