跳转到主要内容

会话劫持

本文约需 2 分钟阅读

会话劫持 (Session Hijacking) 是指攻击者窃取用户的会话 ID,冒充该用户访问服务的攻击。会话 ID 是登录后由服务器签发的标识符,一旦被夺取,即使不知道密码也能在已认证的状态下使用服务。在 OWASP 的调查中,会话管理不当被列为 Web 应用程序的主要漏洞之一。

权限变化的瞬间不沿用同一识别码

在许多实现中,为了在多次请求之间保留显示设置或尚未提交的输入内容,早在登录之前的浏览阶段就已为每位访问者分配了识别码。如果认证完成后仍继续沿用同一个值,改变的只是该值所指向的状态,值本身并没有改变。于是,事先就能得知该值的人,在正当用户完成登录的那一刻,手中握着的便是一个指向已具备权限状态的值。能否事先得知这个值,并不取决于攻击一方的技巧,而取决于应用是否还留有把外部给出的值直接当作会话接受的余地。这与每隔一定时间更换识别码是两个不同的问题。按时间更换可以缩短同一个值处于暴露状态的时长,却无法处理同一个值被跨过权限变化这一节点继续沿用的情形。真正作用于该节点的做法,是在改变权限的操作之后立即签发新的值,并同时使旧值失效。核查方式同样简单:比较认证前后的值是否发生了变化。这类缺失不会在通常的功能确认中显现,因为无论采用哪种做法,登录都会成功。常见的疏漏是签发了新值却让旧值继续有效,于是两个识别码指向同一个状态,切换也就失去了意义。

会话窃取的流程

用户登录
签发会话 ID
攻击者窃取 ID
冒充访问

攻击手法

包括利用 XSS (跨站脚本) 从 Cookie 中窃取会话 ID、拦截网络通信窃取会话 ID,以及通过会话固定攻击让用户使用事先准备好的会话 ID 等方法。

具体的受害场景

一个常见的误解是“只要登出就安全了”。实际上,如果登出处理没有在服务器端使会话失效,已被窃取的会话 ID 可能仍然有效。例如,在咖啡馆的公共 Wi-Fi 上登录网上银行时,若会话 ID 被中间人攻击拦截,攻击者就能利用该会话进行余额查询或转账操作。此外,浏览器中保存的 Cookie 被恶意软件窃取,攻击者从其他设备以已登录状态访问的“Cookie 窃取”也在增加。

对策

基本的对策包括使用 HTTPS、为 Cookie 设置 Secure 属性和 HttpOnly 属性,以及定期重新生成会话 ID。为每个服务设置独有的强密码,并启用两步验证,那么即使会话被劫持,重要操作仍会要求额外认证,从而减轻损失。

相关术语

这篇文章对您有帮助吗?