zoukankan      html  css  js  c++  java
  • 从Java的角度修复CSRF漏洞

          漏洞挖掘中,说实话挖过最多的漏洞就属CSRF漏洞了,提交CSRF漏洞很多次,绕过CSRF防御进行攻击也有很多次。CSRF漏洞是一个很容易引发的问题,今天我从Java的角度来说下这个安全漏洞的修复方案。

      这里不谈挖掘方式,只谈修复方案。

      很多时候你很熟悉一种安全漏洞,但是涉及到的修复方案你只能大概讲下,具体到代码层你就束手无策了,这不是个优秀的白帽子行为。

        CSRF一般有两种修复方案

          1.加随机性token或者是sign (足够随机,不可解密)  

          2.验证Referer!

          今晚我的修复方案从2.验证Referer说起,很多时候修复referer是可以被绕过的,有三种绕过方案:

              1.Referer为空

              2.通过伪造域名绕过   example:1.目标地址.随机字符.com 2.目标地址.com.随机字符.com 3.自定义域名地址/目标地址.com

              3.利用@绕过,听说过但没遇到过

          这里从Java的角度浅谈CSRF漏洞的修复,其实解决Referer就能彻底的根治CSRF漏洞,但是很多时候由于开发的疏忽往往Referer过滤不严就能绕过,这里我写了一个验证Referer的方案,仅作为自己学习Java一些记录吧:

        首先随便准备一个简单的视图页面:

            test.html:

                  

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <a href="/WEB15/referer">点我,看看能不能防止referer</a>
    </body>
    </html>

        未写功能点就是测试下安全问题的解决方案:

        修复方案:

          refererServlet.java

          

    package referer;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class RefererServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            String header = request.getHeader("Referer");
            //String domainName = null;
            String[] domain = { "localhost", "test.localhost", "admin.localhost" };
            boolean key=false;
            for (int i = 0; i < domain.length; i++) {
                if (header != null && header.startsWith("http://" + domain[i]) && header.endsWith(domain[i])) {
                    key=true;
                } 
            }
            if(key==true) {
                response.getWriter().write("成功读到打到数据");
            }else{
                response.getWriter().write("非法请求");
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    String[] domain = { referer可接受的信任域名 };  

      我们来使用Burp测试绕过看看能否绕过:

        输入正常的程序指定的referer地址正常:

          

         正常

        

        正常

          

      尝试绕过Referer进行攻击  

          使用绕过方案1发现无法绕过

    使用绕过方案2发现无法绕过

    使用绕过方案3发现无法绕过

     

    那么此次CSRF的修复还是比较完整的用这种方式!

        不忘初心,方得始终。

        

         

         

              

      

  • 相关阅读:
    对数值计算numpy的一些总结,感兴趣的朋友可以看看
    mysql基础语法(部分)
    python_内建结构
    07_go语言基础
    06_go语言基础
    05_go语言基础常量
    04_go语言基础
    03_go语言基础
    02_go语言基础
    01_go语言基础
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/9074522.html
Copyright © 2011-2022 走看看