会话固定是什么
会话固定指攻击者先取得或预置一个会话标识,再诱导受害者在该标识上登录;登录成功后服务端沿用同一标识,攻击者便获得了已认证会话。它的核心不是猜口令,而是『登录后会话 ID 没变』。防护要点很直接:登录成功时轮换会话标识,并在权限变更时一并轮换。
基本信息
| 攻击前提 | 攻击者能预置或获取未认证的会话标识 |
|---|---|
| 核心缺陷 | 登录成功后未轮换会话 ID |
| 防护主招 | 登录成功时重新生成会话标识 |
| 相关场景 | 单点登录回调、权限提升、切换账号 |
| 传输要求 | 会话标识仅经 Cookie 传输,不放 URL |
典型使用场景
- 登录流程:认证成功后立即重新生成会话标识
- 单点登录回调:回调完成时创建新会话,而不是复用请求带来的会话
- 权限提升:管理后台提权或切换角色时同步轮换
- 注销处理:注销即失效服务端会话,不只清 Cookie
- 多端登录:新设备登录后按策略使旧会话失效
防护要点
防护要点
登录成功后轮换:session_regenerate_id(true) # PHP 示例
Java:登录成功后调用 request.changeSessionId()
未登录阶段不分配持久化会话,避免被预置
会话 ID 只经 Cookie 传输,不放在 URL 参数中
设置空闲超时与绝对超时,注销立即失效服务端会话
# 验证方法:登录前后抓取 Cookie,确认会话标识确实发生变化检查点与判据
| 检查点 | 通过的判据 | 常见问题 |
|---|---|---|
| 登录流程 | 登录前后会话 ID 不同 | 登录后沿用原 ID |
| 权限变更 | 提权时再次轮换 | 提权后会话不变 |
| Cookie 属性 | HttpOnly、Secure、SameSite | 缺失导致脚本可读 |
| 注销 | 服务端会话立即失效 | 只删客户端 Cookie |
| URL 携参 | 会话标识不出现在 URL | 为兼容旧系统而透传 |
单点登录场景同样要检查:认证回调完成后应创建新会话,而不是复用请求携带的会话,这一点在自研或老旧集成中经常被遗漏。
会话固定常与开放重定向配合:跳转参数把受害者带到攻击者预置的会话上,因此两处配置要一起评估,单修一处效果有限。