不安全的会话固定(Session Fixation)漏洞与防护
字数 1308 2025-11-16 06:05:24
不安全的会话固定(Session Fixation)漏洞与防护
1. 漏洞描述
会话固定(Session Fixation)是一种会话管理漏洞,攻击者通过强制用户使用已知的会话标识符(Session ID)来劫持用户会话。具体流程如下:
- 攻击者先获取一个有效的 Session ID(例如通过正常登录或伪造请求)。
- 诱使目标用户使用该 Session ID 访问应用(例如通过钓鱼链接包含固定 Session ID)。
- 用户登录后,Session ID 不变,攻击者即可利用该 Session ID 冒充用户身份。
漏洞根源在于:应用在用户登录后未重新生成 Session ID,导致登录前后会话状态未隔离。
2. 漏洞原理详解
2.1 会话管理基础
- 会话机制:用户首次访问应用时,服务端生成唯一 Session ID 并通过 Cookie(如
Set-Cookie: JSESSIONID=abc123)返回给浏览器。 - 身份绑定:登录后,服务端将 Session ID 与用户身份(如用户名、权限)绑定,后续请求通过 Session ID 验证身份。
2.2 攻击场景举例
假设应用登录流程如下:
- 用户访问
https://example.com/login,服务端生成 Session ID=attacker_sid。 - 攻击者将登录链接
https://example.com/login;jsessionid=attacker_sid发送给用户。 - 用户点击链接,使用
attacker_sid登录。 - 服务端未重新生成 Session ID,直接绑定身份到
attacker_sid。 - 攻击者使用
attacker_sid即可完全控制用户会话。
3. 防护方案
3.1 核心原则:登录后重新生成 Session ID
- 用户登录成功后,服务端应销毁旧会话,生成新 Session ID,并更新浏览器 Cookie。
- 代码示例(Java):
HttpSession oldSession = request.getSession(false); if (oldSession != null) { oldSession.invalidate(); // 销毁旧会话 } HttpSession newSession = request.getSession(true); // 生成新 Session ID newSession.setAttribute("user", authenticatedUser);
3.2 附加防护措施
-
Cookie 属性加固:
- 设置
HttpOnly防止 XSS 窃取 Session ID。 - 设置
Secure强制 HTTPS 传输。 - 设置
SameSite=Strict防止 CSRF 攻击。
- 设置
-
会话超时机制:
- 服务端设置会话最大空闲时间(如 15 分钟),超时自动销毁。
-
IP 绑定验证:
- 登录后记录用户 IP,后续请求校验 IP 一致性(需谨慎,可能误伤动态 IP 用户)。
4. 实战检测方法
-
手动测试:
- 使用工具(如 Burp Suite)捕获登录请求前后的 Cookie,检查 Session ID 是否变化。
- 尝试在登录后使用旧 Session ID 访问受限资源,验证是否仍有效。
-
自动化工具:
- 使用 OWASP ZAP 或 Burp Scanner 的会话管理测试模块自动检测。
5. 总结
会话固定漏洞的防护核心是严格区分匿名会话与认证会话。通过登录后重新生成 Session ID,并结合 Cookie 安全属性、超时机制等纵深防御措施,可有效避免会话被劫持。