安全技術研究-Broken Session Management(JAVA代碼)

漏洞代碼示例(JAVA servlets)

認證成功後,當前會話不會失效:

public void doAction(HttpServletRequest request, HttpServletResponse response) {
    String pwd = request.getParameter("j_password");
    String usr = request.getParameter("j_username");
    SessionUser user = persistenceController.loginUser(usr, pwd);
    String msg = "";
    try {
        if (user != null) {

            // XXX session not invalidated!

            request.getSession().setAttribute(Constants.USER, user);
            msg = messageGenerator.RedirectMessage("/ok.html");
        } else {
            msg = messageGenerator.redirectMessage("/error.html");
        }

        PrintWriter out;
        out = response.getWriter();
        out.print(msg);
        out.flush();
    } catch (IOException e) {
        // ...
    }
}

解決方案是使當前會話無效,然後為新登錄的用戶創建一個新的會話:

request.getSession().invalidate();
request.getSession(true);

另一個漏洞代碼示例


在本例中,註銷時會話不會失效。cookie的值只在用戶的瀏覽器中被清除:

@Override
public void doAction(HttpServletRequest request, HttpServletResponse response) {
    Cookie cookie = new Cookie("JSESSIONID","LOGOFF");
    response.addCookie(cookie);

    // XXX session not invalidated!

    response.sendRedirect("/");
}

解決方案是使會話失效:

request.getSession().invalidate();

如何防護

對於會話固定的問題,在用戶身份驗證成功後調用HttpSession類的invalidate方法。然後通過將true傳遞給HttpServletRequest類的getSession方法來創建一個新的會話。

第三方框架可能已經集成了處理會話管理的解決方案;一定要通過閱讀第三方框架的幫助文檔了解如何使會話失效。

確保在註銷時通過調用HttpSession類的invalidate方法使會話失效。