Session Fix 与 Jboss 4.2.2

Session Fix 会话固定

Session Fix,会话固定,是一个安全漏洞,以 servlet 容器为例。

  • 无状态的HTTP与会话:由于 HTTP 是无状态的服务,容器为了在同一个用户的不同请求之间保持状态,为每个状态维持一个会话,Servlet 容器里一般就是 HttpSession 对象。HTTP 客户端每次请求时,都需要把表示这个 HttpSession 对象的 ID (一般命名为 JSESSIONID)传递过来,JSESSIONID 的传递机制常用的是作为URL 的一部分或放在 Cookie,由于每个 HTTP 请求都会传输 Cookie,所以这是最常见的机制。在第一次请求时,由于没有 JSESSIONID,容器会创建一个 HttpSession 对象,把它的的ID 作为 JSESSIONID 的值设置到 Cookie,HTTP 客户端第二次请求时,把这个 JSESSIONID 的值也传递给了容器,容器就可以找到对应的 HttpSession 对象。

  • 会话固定
    登陆与注销前后,如果这个 JSESSIONID 不会改变,则表示存在会话固定的漏洞。
    登陆前,用户第一次请求容器,容器生成一个 HttpSession 对象,设置 JSESSIONID,但这个JSESSIONID 是未验证的,如果这个 JSESSIONID 被恶意用户获取到,那么用户登录后,这个 JSESSIONID 变为有效的后,恶意用户就可以把用 JSESSIONID 来伪冒合法用户。
    注销后,也需要把合法的 JSESSIONID 作废,以免被恶意用户获取后假冒。

  • 修复方法
    登陆成功后作废登陆前的会话;注销成功后作为之前的合法会话。
    注销后需要调用 HttpSession.invalidate() 方法来作废合法的 HttpSession 对象,要不然还会存在内存泄漏,因为未注销的 HttpSession 对象只有在超时后才会被回收。

Jboss 4.2.2 默认配置导致会话固定

Jboss 4.2.2 的配置 .../deploy/jboss-web.deployer/server.xml 里的默认配置 emptySessionPath="true",这会导致 HttpSession.invalidate() 方法无效,需要修改为 false


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据