在复制JSESSIONID cookie时防止复制会话

时间:2016-02-23 13:47:36

标签: session tomcat servlets java-ee cookies

后台:我在tomcat上部署了一个javaee webapp,它使用基于表单的身份验证。当Web服务器收到登录请求时,它会将请求发送到专用的身份验证服务,该服务验证用户登录(用户ID和密码)。成功验证后,用户的会话将在Web服务器中维护。

问题:我编写了一个简单的webpp source code here来模拟场景。成功登录后,当前HttpSession实例无效并创建新实例。对于后登录页面的每个请求,会话都经过验证。设置了一个新的JSESSIONID cookie,用于在会话期间识别用户,直到会话过期或用户注销。可以在浏览器的开发工具中轻松查看此cookie。如果我复制cookie并通过JavaScript(document.cookie="JSESSIONID=xyzz")在不同的浏览器中设置它,然后尝试访问后登录页面,则服务器将其识别为有效请求并成功验证会话。提供帖子登录页面,用户不会因用户ID和密码而受到质疑。

POC:用户打开Chrome并输入网址http://localhost:8080/mywebapp/,然后使用adminpass1234登录。成功登录后,将显示主页http://localhost:8080/mywebapp/home。现在,在FireFox中复制并设置JSESSIONID cookie。用户在Firefox中输入http://localhost:8080/mywebapp/home并显示主页,而不会受到userId和密码的质疑。

问题:如何通过多个浏览器复制相同的会话,如何防止这种情况发生?

enter image description here

1 个答案:

答案 0 :(得分:7)

您不能阻止这种仅从您自己的浏览器中复制cookie的特定情况(或通过从互联网上某处无知的HTTP有效负载copypaste /屏幕截图中复制cookie值)。您最多可以防止cookie被XSS或中间人攻击劫持。

这一切都在维基百科页面上详细阐述了主题Session Hijacking,其中我剪掉了不相关的部分(已经由Servlet API强制执行,或者在这里根本不适用)。

  

预防

     

防止会话劫持的方法包括:

     
      使用Encryption / SSL在双方之间传递的数据流量
  • TLS;尤其是会话密钥(尽管理想情况下是整个会话的所有流量 [11] )。基于网络的银行和其他电子商务服务广泛依赖这种技术,因为它完全可以防止嗅探式攻击。但是,仍然可以执行其他类型的会话劫持。作为回应,来自Radboud University Nijmegen的科学家在2013年提出了一种通过将应用会话与SSL / TLS凭证 [12]
  •   
  • (剪辑,不相关)
  •   
  • (剪辑,不相关)
  •   
  • 某些服务会根据用户的身份进行二次检查。例如,Web服务器可以检查每个请求,即用户的IP地址与该会话期间最后使用的IP地址匹配。但这并不能阻止共享相同IP地址的人的攻击,并且对于IP地址为liable to change during a browsing session的用户来说可能会令人沮丧。
  •   
  • 或者,某些服务会根据每个请求更改cookie的值。这大大减少了攻击者可以操作的窗口,并且可以轻松识别是否发生了攻击,但是可能导致其他技术问题(例如,来自同一客户端的两个合法,紧密定时的请求可能导致令牌检查服务器上的错误。)
  •   
  • (剪辑,不相关)
  •   

换句话说:

  • 使用HTTPS而不是HTTP来防止中间人攻击。
  • 在登录表单中添加一个“锁定我的IP”复选框,并拒绝来自servlet过滤器中与同一会话关联的不同IP的请求。这仅适用于知道自己拥有固定IP的用户。
  • 更改每个请求的会话cookie。一见钟情,但是当用户在同一个“会话”中的多个浏览器选项卡/窗口中打开相同的网站时会中断。
  • 未提及,但请确保您在任何地方都没有XSS hole,否则很容易窃取Cookie。

最后但并非最不重要的是,我想明确指出,这个问题绝对与Servlet API和JSESSIONID cookie没有特别的关系。所有其他有状态服务器端语言/框架(如PHP(PHPSESSID)和ASP(ASPSESSIONID))也会暴露出完全相同的安全问题。 JSESSIONID以前(十年前orso)在新闻中只有一点点,因为默认情况下可以在URL中传递会话标识符(这是为了支持禁用cookie的客户端中的HTTP会话)。当无知的最终用户使用里面的JSESSIONID复制完整的URL以与他人共享链接时,麻烦就开始了。从Servlet 3.0开始,您可以通过强制执行仅限cookie的策略来关闭URL中的JSESSIONID。

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

另见:

相关问题