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笔记,可以更及时回复你的讨论。