【发布时间】: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/ 并使用 admin 和 pass1234 登录。成功登录主页时会显示http://localhost:8080/mywebapp/home。现在JSESSIONID cookie 被复制并在 FireFox 中设置。用户在 Firefox 中输入 http://localhost:8080/mywebapp/home 并显示主页,而不会询问用户 ID 和密码。
问题:如何防止在多个浏览器上复制同一会话?
【问题讨论】:
-
截图没有攻击漏洞,完全不用担心。攻击者不会攻击坐在用户旁边的人。攻击者从用户完全不知道的遥远地方进行尝试(就像现实生活中发生的那样)。这是一个不同的主题。
标签: session tomcat servlets jakarta-ee cookies