《白帽子讲Web安全》学习:深入解析Cookie与会话安全

目录

导言

[一、Cookie 的原理与作用](#一、Cookie 的原理与作用)

[二、Cookie 面临的安全风险](#二、Cookie 面临的安全风险)

三、Cookie的核心安全属性

[1.Domain 属性](#1.Domain 属性)

[2.Path 属性](#2.Path 属性)

[3.Expires 属性](#3.Expires 属性)

[4.HttpOnly 属性](#4.HttpOnly 属性)

[5.Secure 属性](#5.Secure 属性)

[6.SameSite 属性](#6.SameSite 属性)

[7.SameParty 属性](#7.SameParty 属性)

四、安全使用Cookie

1.正确设置Cookie属性值

2.Cookie前缀

3.保密性和完整性

五、会话安全

1.会话管理

(1)会话ID的随机性:

(2)过期和失效:

(3)绑定客户端:

(4)安全传输:

(5)客户端存储会话:

2.固定会话攻击

[(1)攻击者获取Session ID:](#(1)攻击者获取Session ID:)

[(2)强制用户使用该Session ID:](#(2)强制用户使用该Session ID:)

[(3)劫持用户会话(Session Hijacking):](#(3)劫持用户会话(Session Hijacking):)


导言

最近在学习吴翰清老师的《白帽子讲Web安全》,书中对Web安全的核心问题进行了系统梳理。其中Cookie与会话安全作为Web安全的基石之一,让我深刻认识到:一个看似简单的Cookie,背后可能隐藏着巨大的安全风险。本文结合书中内容和个人实践,总结Cookie与会话安全的核心知识点,并探讨如何在实际开发中规避常见漏洞。


一、Cookie 的原理与作用

首先书中先介绍了何为Cookie:Cookie 是服务器发给用户浏览器上的一小段数据,浏览器会存储这些数据,用于识别用户身份、记录用户偏好等,并在后续发往服务器的请求中带上Cookie。它就像一个随身携带的 "小账本",在用户浏览网页的过程中,帮助服务器 "记住" 用户的相关信息,从而提供更个性化的服务。比如,当我们再次访问常逛的购物网站时,页面能自动显示我们的历史浏览记录和收藏商品,这背后离不开 Cookie 的作用。


二、Cookie 面临的安全风险

Cookie是Web应用实现用户状态管理的关键技术,常用于存储会话标识(Session ID)、用户偏好等信息。但是Cookie 的广泛应用也带来了诸多安全风险。攻击者可以通过各种手段窃取用户的 Cookie,进而伪装成用户身份,获取敏感信息或进行恶意操作。

如:

  • 跨站脚本攻击(XSS):攻击者能注入恶意脚本,在用户不知情的情况下获取其 Cookie。
  • Cookie 窃听:在不安全的网络环境中,如公共 Wi-Fi,攻击者可以监听并截获 Cookie 数据。

Cookie的以下特性也使其成为攻击者的重点目标:

  1. 客户端存储:Cookie存储在浏览器端,可能被篡改或窃取。
  2. 自动携带:浏览器会在每次请求中自动附加Cookie,易被中间人劫持。
  3. 明文传输:未加密的Cookie可能被网络嗅探工具捕获。

三、Cookie的核心安全属性

书中介绍了cookie的一些重要属性,通过合理设置Cookie属性,可显著提升安全性:

1.Domain 属性

定义:指定了 Cookie 可以被哪些域名访问。只有当浏览器请求的域名与 Cookie 的 Domain 属性匹配时,浏览器才会在请求中包含该 Cookie。

作用 :用于实现跨子域共享 Cookie。例如,设置Domain=.example.com,那么www.example.comblog.example.com等子域都可以访问该 Cookie,方便在同一域名的不同子域之间共享用户信息等。

2.Path 属性

定义:指定了 Cookie 在服务器上的路径。只有当请求的 URL 路径与 Cookie 的 Path 属性匹配时,浏览器才会发送该 Cookie。

作用 :可以限制 Cookie 的访问范围。比如,设置Path=/admin,那么只有在访问/admin路径下的页面时,浏览器才会发送该 Cookie,有助于提高 Cookie 的安全性和管理效率,避免不必要的 Cookie 在不相关的路径中被发送。

3.Expires 属性

定义:指定了 Cookie 的过期时间,是一个具体的日期和时间。当浏览器到达这个时间点后,就会自动删除该 Cookie。

作用 :用于控制 Cookie 的生命周期。例如,设置Expires=Thu, 01 Jan 2030 00:00:00 GMT,表示 Cookie 在 2030 年 1 月 1 日过期。如果不设置该属性,Cookie 通常在浏览器关闭时就会被删除,即成为会话 Cookie。

4.HttpOnly 属性

定义:设置了该属性的 Cookie 不能被客户端脚本(如 JavaScript)访问,只能通过 HTTP 协议由服务器进行读写操作。

作用 :主要用于防止跨站脚本攻击(XSS)。攻击者无法通过脚本获取带有HttpOnly属性的 Cookie,从而降低了 Cookie 被窃取和利用的风险,提高了 Cookie 的安全性。

5.Secure 属性

定义 :标记为Secure的 Cookie 只会在使用 HTTPS 协议加密的连接中发送到服务器,在 HTTP 连接中不会被发送。

作用 :确保 Cookie 在传输过程中的保密性和完整性,防止 Cookie 在网络传输过程中被窃取或篡改。因为 HTTPS 对数据进行了加密,所以可以有效保护Secure属性的 Cookie 安全。

6.SameSite 属性

定义 :用于限制第三方 Cookie,它有三个可选值:StrictLaxNone

作用Strict模式下,Cookie 仅在同站请求时发送,跨站请求不会携带 Cookie,安全性最高;Lax模式相对宽松,允许一些安全的跨站导航请求携带 Cookie,如链接跳转等;None则允许跨站请求发送 Cookie,但需要同时设置Secure属性。该属性主要用于防止跨站请求伪造(CSRF)攻击和用户跟踪等问题。

7.SameParty 属性

定义 :该属性用来标识 Cookie 是否属于同一 "party"。具有相同SameParty属性值的 Cookie 可以在跨站点的情况下共享,前提是符合相关的浏览器策略和安全机制。

作用 :在一些复杂的跨站点交互场景中,比如在不同站点但属于同一组织或关联业务之间,需要共享某些用户状态或数据时,SameParty属性可以提供一种相对安全和可控的方式来实现 Cookie 的共享,同时也有助于减少跨站跟踪的风险,增强用户隐私保护。

属性名称 属性值 描述 作用
Domain 域名 指定 Cookie 可以被哪些域名访问 用于实现跨子域共享 Cookie
Path 路径 指定 Cookie 在服务器上的路径 限制 Cookie 的访问范围
Expires 日期时间 指定 Cookie 的过期时间 控制 Cookie 的生命周期
HttpOnly 无(布尔值) 设置该属性的 Cookie 不能被客户端脚本访问 防止跨站脚本攻击(XSS)
Secure 无(布尔值) 标记为 Secure 的 Cookie 只会在 HTTPS 连接中发送 确保 Cookie 传输安全,防止被窃取或篡改
SameSite Strict/Lax/None 限制第三方 Cookie 的发送规则 防止跨站请求伪造(CSRF)攻击和用户跟踪
SameParty 字符串值 标识 Cookie 是否属于同一 "party" 在跨站点场景下实现安全可控的 Cookie 共享,增强隐私保护

四、安全使用Cookie

书中还给出了如何安全使用Cookie的分析:

1.正确设置Cookie属性值

在Web应用中安全使用Cookie时正确设置属性值十分重要,包括:

  • 关键Cookie应设置Secure属性以确保在加密网络中传输;
  • 若无需子域名读取Cookie,植入时可不设Domain属性,若要与子域名网站共享状态需评估安全性;
  • 重要Cookie应设置HttpOnly属性,减少被客户端JavaScript读取的风险;
  • 与会话有关且不被其他站点引用的Cookie,建议设置SameSite属性为LAX,且不能依赖浏览器默认值,应在应用中显式指定 。

2.Cookie前缀

存在子域名的网站中,每个站点都可以写入一个让所有子域名都可见的Cookie,以至于每个站点都无法确定一个Cookie是不是自己写入的,如果其中的一个子域名站点存在安全漏洞,就会影响到其他的子域名站点,由此,浏览器给出了"为Cookie名称添加特定的前缀"的解决方案。

  • __Host前缀:若Cookie名称含此前缀,由服务端通过Set - Cookie头或前端脚本设置时,需满足带有Secure属性、不包含Domain属性、Path属性为"/"且当前为HTTPS连接这4个条件,浏览器才会接受。它将Cookie跟域名绑定,仅限当前域名植入,对子域名无效。
  • __Secure前缀:含此前缀的Cookie,只有在带Secure属性且当前连接为HTTPS时,浏览器才会接受 ,是约束更少的弱化版本,能确保在安全连接环境下写入。主流浏览器(除IE外)支持Cookie前缀特性,为保证Cookie在安全环境传输,可加"__Secure-"前缀;子域名多且安全不受控时,关键Cookie建议加"__Host-"前缀 。

3.保密性和完整性

由于Cookie对用户是完全公开的,使用浏览器的开发者工具可以查看到,这就意味着Web服务端不能将自身的机密性数据写入Cookie。


五、会话安全

Web应用中,Cookie的本质是标识不同的访问者,并记录状态,攻击者如果窃取到一个合法的会话标识或者伪造会话标识,都相当于盗取了一个账号的身份,如果服务端管理不当,有可能造成数据泄露等问题。

1.会话管理

书中从几个方面介绍了会话的安全管理:

(1)会话ID的随机性:

会话ID(Session ID)是会话管理的核心,用于标识用户的会话状态。如果会话ID可预测或重复使用,攻击者可能通过猜测或重放攻击劫持用户会话,必须使用强随机数(如CSPRNG),避免可预测性,避免使用时间戳或用户ID拼接生成Session ID。

(2)过期和失效:

会话的过期和失效机制是防止会话固定攻击和会话劫持的关键。如果会话长期有效,攻击者可能利用泄露的Session ID劫持用户会话。

(3)绑定客户端:

绑定客户端信息(如IP地址、User-Agent)可以增加会话的安全性,防止攻击者通过窃取的Session ID在其他设备上使用。

(4)安全传输:

会话数据在传输过程中可能被窃取或篡改,因此必须确保其安全传输。

(5)客户端存储会话:

客户端存储会话数据(如JWT)可以减少服务器端的存储压力,但也带来了安全风险,服务端会话数据应存储在安全位置(如Redis、数据库),而非客户端。

2.固定会话攻击

固定会话攻击:攻击者诱导用户使用攻击者指定的Session ID,当受害者登录成功后,这个Session ID就关联了受害者的身份,相当于攻击者拥有了受害者在目标网站的身份。攻击者实现固定会话攻击的方式多种多样:

(1)攻击者获取Session ID

攻击者通过某种方式(如诱导用户访问恶意链接)获取一个有效的Session ID。

防御措施:登录成功后重新生成Session ID。

(2)强制用户使用该Session ID

攻击者诱导用户使用该Session ID登录系统。

(3)劫持用户会话(Session Hijacking):

通过XSS或网络嗅探窃取Session ID,用户登录后,攻击者利用已知的Session ID冒充用户,访问其账户。

防御:

  • 设置`HttpOnly`和`Secure`属性。
  • 使用HTTPS加密通信。
  • 定期轮换Session ID。

六、总结思考

Cookie作为Web应用中用户身份验证和状态管理的核心机制,其安全性直接影响系统的整体安全。书中指出,Cookie的客户端存储特性使其容易受到XSS、CSRF等攻击,因此必须通过设置HttpOnlySecureSameSite等属性来增强安全性。此外,会话管理中的Session ID生成、过期机制、客户端绑定和安全传输也是防御会话劫持和固定攻击的关键。通过合理配置Cookie属性、使用强随机数生成Session ID、绑定客户端信息以及强制HTTPS传输,可以有效提升Web应用的安全性。书中还强调了持续关注安全标准和团队培训的重要性,以确保开发实践符合最新的安全要求。


欢迎在评论区交流你的Cookie安全实践心得!

相关推荐
Doris Liu.2 小时前
如何检测代码注入(Part 2)
windows·python·安全·网络安全·网络攻击模型
白夜易寒3 小时前
Docker学习之私有仓库(day10)
学习·docker·容器
淮北4943 小时前
ros调试工具foxglove使用指南三:在3d空间写写画画(Panel->3D ->Scene entity)
python·学习·3d·机器人
iOS技术狂热者3 小时前
使用抓包大师(sniff master)进行手机端iOS抓包的配置步骤
websocket·网络协议·tcp/ip·http·网络安全·https·udp
秋说4 小时前
【区块链安全 | 第八篇】多签机制及恶意多签
安全·区块链
山河君5 小时前
音频进阶学习二十四——IIR滤波器设计方法
学习·算法·音视频·信号处理
68岁扶墙肾透5 小时前
Java安全-FastJson反序列化分析
java·安全·web安全·网络安全·网络攻击模型·安全架构·fastjson
Vic·Tory5 小时前
Go语言学习笔记
笔记·学习·golang
吴梓穆5 小时前
UE5学习笔记 FPS游戏制作28 显式玩家子弹数
笔记·学习·ue4
梧六柒6 小时前
1.1-站点差异\源码差异\数据存储差异\MVC模型
网络安全