【问题标题】:Prevent session from being replicated when JSESSIONID cookie copied防止复制 JSESSIONID cookie 时复制会话
【发布时间】:2016-06-05 09:25:51
【问题描述】:

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

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

POC: 用户打开 chrome 并输入 URL http://localhost:8080/mywebapp/ 并使用 adminpass1234 登录。成功登录主页时会显示http://localhost:8080/mywebapp/home。现在JSESSIONID cookie 被复制并在 FireFox 中设置。用户在 Firefox 中输入 http://localhost:8080/mywebapp/home 并显示主页,而不会询问用户 ID 和密码。

问题:如何防止在多个浏览器上复制同一会话?

【问题讨论】:

  • 截图没有攻击漏洞,完全不用担心。攻击者不会攻击坐在用户旁边的人。攻击者从用户完全不知道的遥远地方进行尝试(就像现实生活中发生的那样)。这是一个不同的主题。

标签: session tomcat servlets jakarta-ee cookies


【解决方案1】:

您所说的称为会话劫持。关于如何预防它有很多很好的答案。

Using same Jsession ID to login into other machine

我们可以使用加密或使用浏览器控件隐藏 JSESSIONID。

谢谢

【讨论】:

    【解决方案2】:

    您无法阻止这种简单地从您自己的浏览器复制 cookie 的特定情况(或通过从 Internet 上某处无知的人发布的 HTTP 有效负载复制粘贴/屏幕截图复制 cookie 值)。您最多可以防止 cookie 被 XSS 或中间人攻击劫持。

    这一切都在 Wikipedia 页面上关于主题 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 以前(大约十年前)只是新闻中的更多内容,因为默认情况下可以在 URL 中传递会话标识符(这样做是为了支持禁用 cookie 的客户端中的 HTTP 会话)。当无知的最终用户复制粘贴带有 JSESSIONID 的完整 URL 以与他人共享链接时,麻烦就开始了。从 Servlet 3.0 开始,您可以通过强制执行仅 cookie 策略来关闭 URL 中的 JSESSIONID。

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

    另见:

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2015-04-10
      • 2012-06-19
      相关资源
      最近更新 更多