不安全的会话固定(Session Fixation)漏洞与防护
字数 1308 2025-11-16 06:05:24

不安全的会话固定(Session Fixation)漏洞与防护

1. 漏洞描述

会话固定(Session Fixation)是一种会话管理漏洞,攻击者通过强制用户使用已知的会话标识符(Session ID)来劫持用户会话。具体流程如下:

  1. 攻击者先获取一个有效的 Session ID(例如通过正常登录或伪造请求)。
  2. 诱使目标用户使用该 Session ID 访问应用(例如通过钓鱼链接包含固定 Session ID)。
  3. 用户登录后,Session ID 不变,攻击者即可利用该 Session ID 冒充用户身份。

漏洞根源在于:应用在用户登录后未重新生成 Session ID,导致登录前后会话状态未隔离。


2. 漏洞原理详解

2.1 会话管理基础

  • 会话机制:用户首次访问应用时,服务端生成唯一 Session ID 并通过 Cookie(如 Set-Cookie: JSESSIONID=abc123)返回给浏览器。
  • 身份绑定:登录后,服务端将 Session ID 与用户身份(如用户名、权限)绑定,后续请求通过 Session ID 验证身份。

2.2 攻击场景举例

假设应用登录流程如下:

  1. 用户访问 https://example.com/login,服务端生成 Session ID=attacker_sid
  2. 攻击者将登录链接 https://example.com/login;jsessionid=attacker_sid 发送给用户。
  3. 用户点击链接,使用 attacker_sid 登录。
  4. 服务端未重新生成 Session ID,直接绑定身份到 attacker_sid
  5. 攻击者使用 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 附加防护措施

  1. Cookie 属性加固

    • 设置 HttpOnly 防止 XSS 窃取 Session ID。
    • 设置 Secure 强制 HTTPS 传输。
    • 设置 SameSite=Strict 防止 CSRF 攻击。
  2. 会话超时机制

    • 服务端设置会话最大空闲时间(如 15 分钟),超时自动销毁。
  3. IP 绑定验证

    • 登录后记录用户 IP,后续请求校验 IP 一致性(需谨慎,可能误伤动态 IP 用户)。

4. 实战检测方法

  1. 手动测试

    • 使用工具(如 Burp Suite)捕获登录请求前后的 Cookie,检查 Session ID 是否变化。
    • 尝试在登录后使用旧 Session ID 访问受限资源,验证是否仍有效。
  2. 自动化工具

    • 使用 OWASP ZAP 或 Burp Scanner 的会话管理测试模块自动检测。

5. 总结

会话固定漏洞的防护核心是严格区分匿名会话与认证会话。通过登录后重新生成 Session ID,并结合 Cookie 安全属性、超时机制等纵深防御措施,可有效避免会话被劫持。

不安全的会话固定(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): 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 安全属性、超时机制等纵深防御措施,可有效避免会话被劫持。