如何在登录后刷新JSESSIONID cookie

Nat*_*ach 27 tomcat login jsessionid session-cookies

我工作的产品得到了潜在客户的严格安全审核,他们对Tomcat在认证发生之前设置JSESSIONID cookie感到不安.也就是说,Tomcat在加载无状态登录页面时设置此cookie,但在登录之前.

他们建议以下任何一种:

  1. 登录后发出新的JSESSIONID cookie
  2. 防止在登录页面上首先设置JSESSIONID cookie(即,在身份验证发生之前)

我一直在浏览这个网站上与JSESSIONID相关的所有内容,但却找不到简单的答案.我只是希望有一些想法.我最好的解决方案是:

  1. 在登录后,通过复制所有属性,使旧会话无效,创建新会话,复制值,将其与请求相关联以及希望它起作用来克隆会话(减去id).
  2. 在链的最末端创建一个servlet Filter,在最初加载Login Page之前去除JSESSIONID cookie.然后希望登录请求在没有设置JSESSIONID的情况下运行.

我得睡一觉,但早上会尝试这些.能够比我更聪明的人得到一些反馈或更好的建议真是太棒了 - 就像你一样!

无论如何,我会在这里发布我的结果,因为似乎很多其他人都想做类似的事情.

che*_*vim 40

你不会在之前但之前刷新.首先执行登录操作时:

HttpSession session = request.getSession(false);
if (session!=null && !session.isNew()) {
    session.invalidate();
}
Run Code Online (Sandbox Code Playgroud)

然后做:

HttpSession session = request.getSession(true); // create the session
// do the login (store the user in the session, or whatever)
Run Code Online (Sandbox Code Playgroud)

仅供参考,您使用此技巧解决的问题是http://www.owasp.org/index.php/Session_Fixation

最后,您可以禁用自动会话创建,只在您真正需要时创建会话.如果您使用JSP,则可以通过以下方式执

<%@page contentType="text/html"
        pageEncoding="UTF-8"
        session="false"%>
Run Code Online (Sandbox Code Playgroud)


bha*_*ipu 10

HttpServletRequest.changeSessionId()可用于随时更改会话 ID。


小智 5

由于我的观点不够,我无法评论@cherouvim的回答。应在用户成功登录后“之后”设置新的会话ID,以避免会话固定。我将尝试解释我的推理。

会话固定有效地意味着攻击者以某种方式诱使用户使用了攻击者已知的值。为了简单起见,我们假设攻击者走到用户的办公桌前,使用Firebug并编辑了用户的cookie。现在,当用户登录时,他/她将使用攻击者控制的cookie登录。由于攻击者也知道此值,因此他/她将刷新他们的浏览器,并且映射到该会话ID的资源(受害者的资源)将被提供给他们。那是会话固定。正确?

现在,我们在受害者用户登录之前运行了一个session.invalidate。假设cookie最初的值为abc。在运行session.invalidate时,将从服务器的会话中清除值abc。

现在是我不同意的部分。建议您在用户实际登录之前生成一个新会话(输入用户名和密码,然后单击提交)。毫无疑问,这将导致生成新的cookie,但是它将在用户登录之前在用户的浏览器中显示。因此,如果攻击者可以再次编辑“ prelogin” cookie,则该攻击仍将继续,因为即使用户登录后,仍将使用相同的cookie。

我认为这是正确的流程。

  • 用户执行GET /login.html
  • 返回登录页面,其中包含浏览器中当前存在的任何cookie
  • 用户输入凭据,然后单击提交
  • 应用程序验证凭据
  • 在发现证明是正确的。session.invalidate()运行..destroying旧的cookie。
  • 现在使用request.getSession(true)生成新的cookie

这意味着,即使攻击者设法在登录之前诱骗您使用受控值,您仍然受到保护。因为应用程序在登录后会强制更改该值。

这是关于这个问题的好博客-https: //blog.whitehatsec.com/tag/session-fixation/


小智 5

我按照以下方式从旧会话重新生成新会话。希望您能从中受益。

private void regenerateSession(HttpServletRequest request) {

    HttpSession oldSession = request.getSession();

    Enumeration attrNames = oldSession.getAttributeNames();
    Properties props = new Properties();

    if (attrNames != null) {
        while (attrNames.hasMoreElements()) {
            String key = (String) attrNames.nextElement();
            props.put(key, oldSession.getAttribute(key));
        }

        //Invalidating previous session
        oldSession.invalidate();
        //Generate new session
        HttpSession newSession = request.getSession(true);
        attrNames = props.keys();

        while (attrNames.hasMoreElements()) {
            String key = (String) attrNames.nextElement();
            newSession.setAttribute(key, props.get(key));
        }
    }
Run Code Online (Sandbox Code Playgroud)