最新免费网站.棋牌.手游.端游.商业源码下载

游戏源码
当前位置: 主页 > 架设教程 > 网站源码教程

Java代码审计之URL重定向

时间:2022-09-15    来源:admin1    人气:

URLRedirect url重定向漏洞也称之为url任意跳转漏洞,网站信任了用户的输入导致恶意攻击,url重定向主要用来钓鱼,例如url跳转中最常见的跳转在登陆口和支付口,也就是一旦登陆就会跳转自己构造的网站,如果设置成自己的url则会造成钓鱼。

那么url跳转常见的地方是哪里呢?

1. 我认为登陆跳转是最常见的跳转类型,认证完之后会跳转,所以在登陆的时候建议多观察url参数
2. 用户分享、收藏内容过之后
3. 跨站点认证、授权之后
4. 站内点击其它网址链接时
5. 在一些用户交互页面也会出现,如请填写对客服评价,评价成功后跳转主页,填写问卷等等,注意观察url。
6. 业务完成后跳转这可以归结为一类跳转,如修改密码,修改完成后跳转登陆页面,绑定银行卡,绑定后返回银行卡充值转账等页面,或者说给定一个链接办理VIP,但是你需要身份认证才能访问,这个时候通常会给定一个链接,认证之后跳转到刚刚要办理VIP的页面。

url跳转时常用到的参数

redirecturlredirectUrlcallbackreturn_urltoUrlReturnUrlfromUrlredUrlrequestredirect_toredirect_urljumpjump_totargettogotolinklinktodomainoauth_callback

核心代码:

重定向跳转(ViewResolver):

@GetMapping("/redirect")public String redirect(@RequestParam("url") String url) {
   return "redirect:" + url;}

301跳转:

@RequestMapping("/setHeader")@ResponseBodypublic static void setHeader(HttpServletRequest request, HttpServletResponse response) {
   String url = request.getParameter("url");
   response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); // 301 redirect    response.setHeader("Location", url);}

302跳转:

@RequestMapping("/sendRedirect")@ResponseBodypublic static void sendRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
   String url = request.getParameter("url");
   response.sendRedirect(url); // 302 redirect}

修复方式:


转发(前往),服务器内部的重定向,在Servlet中通过RequestDispatcher转发给另一个程序处理请求,请求的数据还在,所以forward相当于客户端向服务器发送一次请求,服务器处理两次,请求数据不会消失且URL地址只变化一次。

只能内部跳转

@RequestMapping("/forward")@ResponseBodypublic static void forward(HttpServletRequest request, HttpServletResponse response) {
   String url = request.getParameter("url");
   RequestDispatcher rd = request.getRequestDispatcher(url);
   try {
       rd.forward(request, response);
   } catch (Exception e) {
       e.printStackTrace();
   }}

通过checkURL去检查输入的参数

    @RequestMapping("/sendRedirect/sec")
   @ResponseBody
   public void sendRedirect_seccode(HttpServletRequest request, HttpServletResponse response)
           throws IOException {
       String url = request.getParameter("url");
       if (SecurityUtil.checkURL(url) == null) {
           response.setStatus(HttpServletResponse.SC_FORBIDDEN);
           response.getWriter().write("url forbidden");
           return;
       }
       response.sendRedirect(url);
   }}

跟进

/** * 同时支持一级域名和多级域名,相关配置在resources目录下url/url_safe_domain.xml文件。 * 优先判断黑名单,如果满足黑名单return null。 * * @param url the url need to check * @return Safe url returns original url; Illegal url returns null; */public static String checkURL(String url) {
   if (null == url){
       return null;
   }
   ArrayList<String> safeDomains = WebConfig.getSafeDomains();
   ArrayList<String> blockDomains = WebConfig.getBlockDomains();
   try {
       String host = gethost(url);
       // 必须http/https        if (!isHttp(url)) {
           return null;
       }
       // 如果满足黑名单返回null        if (blockDomains.contains(host)){
           return null;
       }
       for(String blockDomain: blockDomains) {
           if(host.endsWith("." + blockDomain)) {
               return null;
           }
       }
       // 支持多级域名        if (safeDomains.contains(host)){
           return url;
       }
       // 支持一级域名        for(String safedomain: safeDomains) {
           if(host.endsWith("." + safedomain)) {
               return url;
           }
       }
       return null;
   } catch (NullPointerException e) {
       logger.error(e.toString());
       return null;
   }}

检测相关url是否在自己配置中,若不在则返回NULL。


推荐文章

公众号