zoukankan      html  css  js  c++  java
  • 从Java的角度简单修复Cookie越权漏洞

        技术实在是有限,讲解cookie越权的时候可能有点简单和粗糙。这里就简单记录学习下。

        首先自己写一段存在漏洞的代码code:

          sendCookie.java

              

    package cookie;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class SendCookieServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //服务器端生成set-cookie
            Cookie cookie = new Cookie("name", "admin");
            //设置cookie存活时间为十分钟
            cookie.setMaxAge(60*10);
            //设置会话cookie允许的路径
            //允许整个项目
            cookie.setPath("/");
            //将cookie中存储的信息发送到客户端---头
            response.addCookie(cookie);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

          然后接收cookie中的键值,然后进行判断

          GetCookieServlet代码如下:
    package cookie;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class GetCookieServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 获取cookie的键值
            Cookie[] cookies = request.getCookies();
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            String name=null;
            //判斷cookie不能为空
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    // 获取键
                    cookie.getName();
                    if ("name".equals(cookie.getName())) {
                        name=cookie.getValue();
                    }
                }
            }
            
            if(name.equals("admin")) {
                response.getWriter().write("欢迎admin登陆后台系统");
            }else {
                response.getWriter().write("欢迎xxx登陆后台系统");
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

        先访问sendCookie然后访问getCookie:

          默认是进入admin系统

          

    因为cookie中存储的name=admin,这里修复name=其他值

    就越权进入了另一个系统

          

    这里的问题就是没有使用session进行敏感信息的存储。 

      修复方案:验证session的有效性,session和用户是否匹配,以及用户当前权限

      这里我把cookie的存储方式改成seesion的存储方式:  

      代码如下:

          sendCookie:

            

    package cookie;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class SendCookieServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            HttpSession session = request.getSession();
            session.setAttribute("name", "admin");
            String id = session.getId();
            //服务器端生成set-cookie
            Cookie cookie = new Cookie("JSESSIONID", id);
            //设置cookie存活时间为十分钟
            cookie.setMaxAge(60*10);
            //设置会话cookie允许的路径
            //允许整个项目
            cookie.setPath("/");
            //将cookie中存储的信息发送到客户端---头
            response.addCookie(cookie);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

        getCookie代码如下:

          

    package cookie;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class GetCookieServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            HttpSession session = request.getSession();
            String name = (String) session.getAttribute("name");
            if(name.equals("admin")) {
                response.getWriter().write("欢迎admin登陆后台系统");
            }else {
                response.getWriter().write("欢迎xxx登陆后台系统");
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

      然后访问sendCookie然后再getCookie:

        先正常访问:

        

    修改name=其他内容:

        

    已经无法造成cookie的越权。事实证明使用session存储需要进行操作的数据更安全!

        进行判断的时候不要直接用cookie存储。使用Session验证。

          不忘初心,方得始终。

          

      

        

  • 相关阅读:
    C++ new 解析重载 .
    __cdecl,__fastcall, __stdcall 什么区别? .
    C++构造函数调用顺序
    用gdb调试core dump文件
    placement new(转)
    [精华] 跟我一起写 Makefile
    使用 GDB 调试多进程程序
    第37条:避免对函数中继承得来的默认参数值进行重定义
    程序只运行一个是实例 .
    南通SEO:单页的SEO元素
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/9102704.html
Copyright © 2011-2022 走看看