目录

「segmentfault问答系列」SESSION固定攻击

Session固定攻击的防御机制分析

问题

攻击者提供包含已知会话ID的链接(例如:<a href='login.php?PHPSESSID=1234'>点击</a>),诱使用户点击该链接。用户点击后可能进行一系列操作,攻击者随后使用该会话ID登录网站,从而劫持用户会话,造成Session固定攻击。

但通常PHP配置中session.use_cookiessession.use_only_cookies均设置为1(即仅通过Cookie传递会话ID),这种情况下是否还能发生Session固定攻击?

分析与解答

Session固定攻击的根本原因

Session固定攻击的发生依赖于以下三个关键条件:

  1. 攻击者获取固定会话ID:攻击者成功获取一个有效的、未使用的会话ID
  2. 被攻击者携带该会话ID请求:被攻击者以获取到的会话ID作为自己的会话ID请求服务端并完成授权操作
  3. 攻击者使用相同会话ID请求:攻击者使用该会话ID请求服务端,获得与被攻击者相同的授权

关键点解析

session.use_only_cookies设置为1的情况下,攻击者仍可实施Session固定攻击,原因如下:

  • 攻击方式转变:虽然不能通过URL参数传递会话ID(因为session.use_only_cookies=1),但攻击者可通过其他方式(如XSS漏洞)修改用户浏览器中的Cookie值
  • 实现路径:攻击者可诱导用户访问包含恶意脚本的页面,该脚本将用户的Cookie值设置为攻击者已知的会话ID
  • 效果等同:当用户后续访问网站时,浏览器会发送该会话ID,服务端将其视为有效会话,攻击者可随后使用相同会话ID登录

防御机制

根本防御方案:在每次授权状态发生改变时(如登录、权限变更),重新生成新的会话ID(Session Regeneration),确保攻击者获取的会话ID失效。

重要提示:仅依赖session.use_only_cookies无法防止Session固定攻击,必须配合会话ID的定期再生机制。

结论

即使PHP配置中session.use_only_cookies=1,Session固定攻击仍可能发生,攻击者可通过XSS等手段修改用户的Cookie值。防御该攻击的核心措施是每次授权状态变更后重新生成会话ID,而非仅依赖会话传输方式的配置。

参考资料:Session固定攻击防御详解
原文来源:SegmentFault问答


安全实践建议

  1. 在用户登录后立即调用session_regenerate_id(true)重新生成会话ID
  2. 在权限变更、角色升级等关键操作后重新生成会话ID
  3. 配合session.use_only_cookies=1session.cookie_httponly=1等安全配置
  4. 通过XSS过滤、内容安全策略(CSP)等手段减少XSS漏洞风险