会话固定是什么
会话固定(Session Fixation)指攻击者预先获得或设定一个会话标识,诱导受害者携带它完成登录;如果登录后服务端没有重新生成标识,攻击者手里的旧标识就直接变成已认证会话。检查要点是标识的生命周期:登录成功、权限提升、修改密码、切换身份这四类状态变化之后,标识是否轮换且旧值立即失效。
基本信息
| 适用平台 | 所有基于会话的 Web 与 App 后端(Cookie、Token 形态均适用) |
|---|---|
| 观察对象 | Cookie 值、Authorization 令牌、移动端 session 字段 |
| 期望行为 | 敏感状态变化后重新签发标识并作废旧标识 |
| 验证方式 | 对比同一浏览器登录前后的标识值,并用旧值重放只读请求 |
典型使用场景
- 登录功能改造后回归验证会话轮换是否生效
- 排查自助注册到登录链路中标识未重建的问题
- 核查 SSO 单点登录回跳过程是否固定了标识
- 验证改密、换绑手机号后的旧会话是否被强制失效
- 移动端评估中确认 Token 在重新认证后是否重新签发
验证步骤
验证步骤
curl -isS -c jar.txt https://app.example.com/login | grep -i 'set-cookie' # 匿名访问获取初始标识
curl -isS -b jar.txt -c jar.txt -d 'user=test&pass=***' https://app.example.com/login | grep -i 'set-cookie' # 登录后看标识是否更换
curl -isS -b jar.txt https://app.example.com/api/me # 用新标识确认登录态
# 再用登录前的旧标识值重放一次只读请求:应被拒绝,而不是返回 200状态变化与期望
| 状态变化 | 期望行为 | 常见问题 |
|---|---|---|
| 匿名到登录 | 重新签发会话标识 | 沿用匿名时期标识 |
| 普通用户提权 | 重新签发并作废旧标识 | 仅更新权限标志位 |
| 修改密码 | 作废其他设备会话 | 旧会话仍可用直至过期 |
| 注销 | 服务端使标识失效 | 仅清前端 Cookie |
| 重新认证 | 签发新令牌 | 旧令牌在有效期内继续可用 |
会话标识必须由服务端生成且不可预测:允许客户端传入自定义标识(如 ?sid= 参数)的实现在这类检查中通常直接命中。
验证时只使用自有测试账号,并且不要对他人会话做重放;发现旧标识仍可用时立即记录并报告,避免影响真实用户的会话。