如果网站的 Cookie 超过 4K,会发生什么情况?

往期热门文章:

1、如何优雅的实现在线人数统计功能?2、JetBrains再出手,这波秀翻了。。3、FullGC 40次/天到10天1次,真牛B!!4、不服不行,这才是后端API接口应该有的样子!5、一个强大的分布式锁框架——Lock4j

来源:www.xttblog.com/?p=5000

有没有想过,如果网站的 Cookie 特别多特别大,会发生什么情况?
不多说,马上来试验一下:
for (i = 0; i < 20; i++)
    document.cookie = i + '=' + 'X'.repeat(2000)
什么,网站居然报错了?

众所周知,Cookie 是塞在请求头里的。如果 Cookie 太多,显然整个 HTTP 头也会被撑大。然而现实中,几乎所有的服务器都会对请求头长度做限制,避免畸形封包消耗服务器资源。那么有趣的事就来了 —— Cookie 是可以长期储存的,所以只要不过期,对应的站点就一直无法访问!为什么会这样!因为博客园是支持自定义装扮的,用户可以嵌入自己的脚本。于是,一旦执行了恶作剧脚本,站点 Cookie 被污染,导致整个网站都无法访问了!

进阶

根据这个原理,我们继续挖掘 Cookie 的相关属性,让攻击效果变得更好。

expires

Cookie 之所以能被持久储存,完全得益于 expires 这个过期值。理论上,Cookie 的过期时间可以足够长。不过鉴于实际情况,最多也就几个月的时间。但对于互联网来说,这也非常长了,谁能容忍一个网站几个月没法用?所以,我们可以设置足够久的过期时间 —— 只要用户不主动清空 Cookie,相应的站点就一直没法访问!

domain

例如博客园,所有用户都在 www.cnblogs.com 下。除了这个主站,能否将其他的子站服务也一起破坏呢?答案是可以!因为 Cookie 具有一个特殊的属性 domain,它允许子站设置上级站点的 Cookie。甚至可以是根域!于是 www.cnblogs.com 的页面,就能写入超大 Cookie 到 cnblogs.com 域下了。
未来,只要用户访问 *.cnblogs.com 的资源,统统变成 400 了。

这个特征可被利用到 XSS 攻击上:
只要某网站任何一个子站能够运行跨站脚本,攻击者就可以对该网站进行全站屏蔽了!(GFW:比我还狠~)

path

不过太霸道也是不好的。尤其是这年头大家都懂些网络知识,清缓存这样简单的事,不少小白用户都会尝试下。所以,为了低调起见,我们不对页面进行屏蔽,以免被过早被用户发现。我们只屏蔽特殊的 URL,例如 AJAX 请求接口。这样,页面仍能正常打开,只是后期的一些操作总是提示失败 —— 于是,用户大多会认为是网站出问题了,而不会怀疑是自己的原因。为了能更精确的控制 Cookie 粒度,path 属性得利用起来。例如,我们只污染博客园的 /mvc/vote/VoteComment.aspx 页面:
for (i = 0; i < 20; i++)
  document.cookie = i + '=' + 'X'.repeat(2000) + ';domain=cnblogs.com; path=/mvc/vote/VoteComment.aspx'
这样,页面仍能正常浏览,只是把『点赞』功能给屏蔽了:

是不是很有趣:)这种局部屏蔽的效果,显然有更好的迷惑性。

协议

仔细回顾一遍 Cookie 属性,除了 secure,再没和 URL Scheme 相关的属性了。
这意味着,HTTP 和 HTTPS 的 Cookie 默认都是共享的。因此,我们可以在 HTTP 下屏蔽 HTTPS 站点了!
不过 XSS 也不是也想有就能有的,但在特殊的条件下,任何站点都可以有 XSS —— 那就是流量被劫持的时候。当用户流量被劫持时,中间人可以模拟出任何 HTTP 站点,因此就能对任意站点设置 Cookie:


当用户打开任意 HTTP 页面时,往其中注入脚本。接着悄悄创建目标站点的隐藏框架页,中间人返回特定的页面内容,其中的脚本即可修改目标站点 Cookie 了。
下面就来尝试一下吧。
通过代理,我们模拟流量被劫持的场景。当打开任意页面时,开始对目标站点释放 DeBuff:

主页面的实现:

目标框架页实现:

通过一堆框架页,即可批量对目标站点的 Cookie 进行修改。最后,切换回正常网络 —— 发现邪恶光环仍在生效:

更杯具的是,连加密传输的 HTTPS 站点也未能幸免:

中间人缓存攻击,又多了一种新玩法!

用途

或许你要说了,这除了恶作剧恶搞之外,有实际意义吗?不过,只要充分发挥想象,还是能玩出一些有趣的效果。例如配合 XSS:
  • 屏蔽资料修改页面,阻止用户改密码
  • 屏蔽注销接口,保持用户会话不过期
  • 屏蔽管理后台,让管理员暂时无法操作(XSS 盲打时,对管理员造成眩晕效果,持续时间视管理员 IQ 而定)
或者流量劫持的场合:
  • 屏蔽前端检测脚本,降低用户安全性
  • 屏蔽程序、补丁的更新站点,等等

小结

当然,这种所谓的『拒绝服务』,只是本地自欺欺人而已,对真实服务器并没什么影响。虽然效果不及传统攻击,但这种方式显得更文明一些。只对部分人、甚至部分功能实施攻击,而完全不妨碍其他用户。
往期热门文章:

1、Stream很好,Map很酷,但答应我别用toMap()2、你合并代码用 merge 还是用 rebase ?3、99%的时间里只使用这14个Git命令就够了!!!4、再见 Navicat ?不好意思,它免费了!5、@Transactional(readOnly=true)真的是提高性能的灵丹妙药吗?6、8种方案解决重复提交问题!7、教你用三种方式模拟两个线程抢票8、MySQL中varchar(50)和varchar(500)区别是什么?9、顶级Javaer都在使用的类库,真香!10、最适合程序员的画图工具?

相关推荐

  • 上手 Day.js 日期处理库
  • 飞书一键复制网页内容为图片原理
  • 大脑一片空白:难倒 90% 前端的 Vue 面试题!
  • 万万没想到,用浏览器打开终端竟这么容易实现
  • 萝卜快写、萝卜快画来了?自动写小说、自动画漫画,两个最新的开源项目
  • 高手必知的Linux三剑客 (grep、sed、awk)
  • 列表是怎么实现的?解密列表的数据结构
  • 一文读懂数据血缘分析原理与建设方法
  • 橙单,一个免费的代码生成神器
  • Git版本管理工具,每个工程师都应该知道的基础操作!
  • Obsidian插件:Make.md为你量身打造一个完美的个人系统。
  • 从零预训练LLAMA3的完整指南:一个文件,探索Scaling Law
  • 开源仅 1 天就斩获近万星!超越 RAG、让大模型拥有超强记忆力的 Mem0 火了!
  • 拿下NeurIPS 2024金牌。
  • 博士申请 | 香港理工大学石杰明老师招收大数据/机器学习方向全奖博士/博后
  • 文末送书 | 连续25年美国统计类教材排名第一,这本统计学神书中文版来啦!
  • ICML 2024 | 图上的泛化挑战:从不变性到因果性
  • 转行跳槽做量化一定要注意的几个大坑。
  • 超强图解 Pandas 18 招!
  • 不是付费订阅用不起,而是“开源平替”更有性价比