Java中的会话固定

信息安全 爪哇 会话管理 会话固定
2021-09-08 14:36:08

在开发一个易受攻击的基于 jsp/servlet 的应用程序的过程中,我尝试引入会话固定漏洞。

参考文档,我想出了以下代码,当在 servlet 中使用它来创建新会话时,如果存在,则应返回现有的 HTTP 会话,否则应返回 null。在任何情况下都不应创建新会话。

if(obj.checkLogin(username, password))//if credentials are valid
    {
    HttpSession session = request.getSession(false);//return the existing session

    if(session != null)
            response.sendRedirect("LoginSuccess.jsp");
        else
            response.sendRedirect("error.jsp");
    }

为了测试我使用 tomcat 7 部署的代码并测试了会话固定:

  1. 登录页面加载时观察 cookie ( c1)(使用拦截代理)
  2. 在登录表单中输入正确的凭据。身份验证成功,我被重定向到 LoginSuccess.jsp
  3. 验证后观察 cookie ( c2)。

我发现饼干c1c2与众不同。这意味着代码不容易受到会话固定的影响。我无法理解这种行为。为什么认证后原来的cookiec1不存在了?

1个回答

当您调用 request.getSession() 时,您使用的 servlet 引擎安全地处理会话 cookie,并且不易受到固定。

(如评论中所述)这种行为既是故意的,也是正确的。无论调用 getSession()、getSession(true) 还是 getSession(false),服务器都依赖自己的内存来确定是否存在与从客户端接收到的值匹配的有效会话。如果服务器内存中没有这样的会话,则 servlet 引擎会忽略来自客户端的会话 ID。这可以防止会话固定,因为服务器从不允许客户端定义新会话的会话 ID(从内存中没有该会话 ID 的服务器的角度来看是新的。)

您要么需要找到一个旧的、损坏的、易受会话固定的 servlet 引擎,要么需要替换会话管理代码。如果您选择后者,您将需要确定是否可以替换会话生成,或者您是否将编写自己的会话管理代码。

你采取的方法应该反映你试图教的东西。如果你想让人们教...

  • 给你的东西打补丁,然后用坏掉的旧引擎
  • 不要自己写会话管理机制,自己写
  • 不修改现有的会话管理机制,然后修改现有的