深入理解 Cookie:属性、风险与安全防御策略

-- 第一方Cookie与第三方Cookie --

  • 区分第一方cookie:用户当前访问的网站所使用的cookie 第三方cookie:用户当前访问的网站所嵌入/跨站访问的第三方网站所使用的cookie(跨站与跨域不同)
  • 区别: 浏览器会接受/第一方cookie,但会根据不同的隐私策略(如SameSite)阻止部分第三方cookie的接收/发送

-- Cookie属性 --

Domain

  • 作用: 指定Cookie在哪些域名中生效, 即在访问哪些域名时浏览器会发送这个Cookie以及哪些域名的网页可以通过js访问这个Cookie
  • 设置限制 若不指定Domain, 生效范围仅限于当前域名 若指定,则对指定的域名及其所有子域名生效 (可指定为当前域名或当前域名的父域名, 但不能指定为当前域名的子域名(否则浏览器拒绝写入)
  • 风险: 显式的指定Domain会导致指定的域名的子域名也可访问, 且Domain属性不包含端口信息, 即其它子域名的应用或其它端口可访问该cookie, 也能写入特定名称的Cookie, 从而干扰当前应用, 让它读到错误的Cookie(比如固定会话攻击)

Path

  • 作用: 指定Cookie的生效路径, 即访问这个路径及其子路径时, 浏览器才会发送cookie以及js可以访问cookie, 若不设置, 则默认值为当前路径
  • 风险: 同域名的页面1若用<iframe>嵌入页面2, 则可在页面1访问path为页面2的cookie, 所以用path来隔离cookie也存在风险, 更安全的做法是将不同应用部署到不同域名或子域名下, 这样就无法相互访问彼此的cookie 解决方案将不同的应用部署在不同的网站, 防止一个应用的漏洞威胁另一个应用

Expires

  • 作用: 指定Cookie的有效期(时间戳)
  • 特点: 若没有设置Expires或设置为0(临时Cookie), 则默认关闭浏览器后自动删除 (可有些浏览器拥有打开上一次浏览的网页功能, 为保持流畅可能不会删除临时cookie, 而实际上变为永久cookie)(待定)
  • 风险:
    1. 即使设置有效期, 浏览器并不能保证它在有效期之内不会被删除, 因为浏览器对每个站点有最大cookie数量的限制, 若超过会删除旧cookie, 所以若存在可向受害者植入cookie的漏洞(如csrf), 攻击者可植入多个cookie, 挤掉受害者的正常的cookie
    2. 即使设置有效期, 访问者也可任意修改expires属性, 并不能依赖expires属性来设置会话的有效期 应在服务端在时间到期后删除session数据 或 标记一个SessionID无效

HttpOnly

  • 作用: 让Cookie只能用于http/https传输, 而前端js无法读取, 一定程度上防御了xss(也无法通过前端js设置httponly的)
  • xss绕过:

    1. 某些框架的调试信息或报错信息会展示HTTP请求头内容(如phpinfo()), 若配合xss漏洞, 还是可以获得HttpOnly属性的Cookie
    2. XST, 即通过XMLHttpRequest想服务端发起TRACE请求, 即可获取Cookie内容, 然后再配合xss漏洞(现在很难奏效, 因为新版本浏览器基本都不支持XMLHttpRequest中使用TRACE方法, 而且支持TRACE方法的服务器也不多)
    3. 中间件漏洞: Apache 2.2.x http请求头长度超过所允许的最大值时, 会返回400页面并包含所有请求头信息, 通过xss生成一个超长的cookie, 再通过XMLHttpRequest访问服务器, 即可读取httponly的cookie
    • 总结: xss读取httponly的cookie要借助服务器的其它漏洞 输出相关cookie内容到前端

Secure

  • 作用: 让Cookie只在HTTPS请求中发送给服务器, 确保了不会以明文传输 (也无法用前端js和http设置secure, 可通过前端js读取)

SameSite

  • 作用: 指示是否可在跨站请求中发送该cookie(即作为第三方cookie时是否会被拦截), 一定程度上防御了csrf
  • 选项
    1. None: 不拦截(使用该选项时, 会要求必须带上Secure属性)
    2. LAX(默认): 部分拦截
    3. Strict: 全部拦截 (由于过于严格, 真实网站很少使用)
---
链接 <a href="..."></a> 发送 Cookie 发送 Cookie 不发送
预加载 <link rel="prerender" href="..."/> 发送 Cookie 发送 Cookie 不发送
GET 表单 <form method="GET" action="..."> 发送 Cookie 发送 Cookie 不发送
POST 表单 <form method="POST" action="..."> 发送 Cookie 不发送 不发送
iframe <iframe src="..."></iframe> 发送 Cookie 不发送 不发送
AJAX $.get("...") 发送 Cookie 不发送 不发送
Image <img src="..."> 发送 Cookie 不发送 不发送

SameParty

  • 使用场景:若一个企业有多个不同站点,那么使用Lax也仍过于严格
  • 作用:服务端可将多个网站定义成一个可信站点集合(定义在 /.well-known/集合名 文件中),当集合之间站点跨站访问时会带上有SameParty属性的第三方cookie(不论SameSite的值是什么)
  • 特点: 暂时只有chrome支持
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇