技術實在是有限,講解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驗證。
不忘初心,方得始終。