开放重定向
漏洞案例
漏洞描述
安全编码
开放重定向漏洞,是指后台服务器在告知浏览器跳转时,未对客户端传入的重定向地址进行合法性校验,导致用户浏览器跳转到钓鱼页面的一种漏洞
出现场景:用户登录、统一身份认证等需要跳转的地方
【必须】避免不可信域名的302跳转 如果对外部传入域名进行302跳转,必须设置可信域名列表并对传入域名进行校验。 为避免校验被绕过,应避免直接对URL进行字符串匹配。应通过通过URL解析函数进行解析,获取host或者domain后和白名单进行比较。
运行
漏洞代码
// 满足参数url可控,且未做限制 public String vul(String url) { return "redirect:" + url; }
运行
漏洞代码
// ModelAndView public ModelAndView vul2(String url) { return new ModelAndView("redirect://" + url); }
运行
漏洞代码
// response.sendRedirect public void vul3(String url, HttpServletResponse response) throws IOException { response.sendRedirect(url); }
运行
安全代码 - 白名单模式
public static boolean isWhite(String url) { List
url_list = new ArrayList
(); url_list.add("baidu.com"); url_list.add("www.baidu.com"); url_list.add("oa.baidu.com"); URI uri = null; try { uri = new URI(url); } catch (URISyntaxException e) { System.out.print(e); } String host = uri.getHost().toLowerCase(); System.out.println(host); return url_list.contains(host); }