我使用 Zip Bombs 来保护我的服务器
我使用 Zip Bombs 来保护我的服务器
警告机器人 By Ibrahim Diallo Published Apr 17 2025 ~ 5 分钟阅读
网络上的大部分流量都来自机器人。 大多数情况下,这些机器人用于发现新的内容。 这些包括 RSS Feed 阅读器,搜索爬虫引擎,或者现在为 LLMs 提供动力的 AI 机器人。 但也有恶意机器人,它们来自垃圾邮件发送者、内容抓取者或黑客。 在我以前的雇主那里,一个机器人发现了一个 WordPress 漏洞,并将一个恶意脚本插入到我们的服务器中。 然后它把这台机器变成了一个用于 DDOS 的僵尸网络。 我的第一个网站完全被 Google 搜索除名,原因是机器人生成垃圾邮件。 在某个时候,我不得不找到一种方法来保护自己免受这些机器人的侵害。 那时我开始使用 zip bombs。
Zip Bomb 是一个相对较小的压缩文件,可以扩展成一个非常大的文件,从而压垮一台机器。
网络早期开发的一个特性是使用 Gzip 进行压缩。 由于互联网速度慢且信息密集,因此想法是在通过线路传输数据之前尽可能将数据压缩到最小。 因此,由文本组成的 50 KB HTML 文件可以被压缩到 10K,从而节省您 40KB 的传输量。 在拨号上网的情况下,这意味着在 3 秒而不是 12 秒内下载页面。
同样的压缩也可以用于提供 CSS、JavaScript,甚至是图像。 Gzip 速度快、简单,并大大改善了浏览体验。 当浏览器发出 Web 请求时,它会包含标头,指示目标服务器它可以支持压缩。 如果服务器也支持它,它将返回期望数据的压缩版本。
Accept-Encoding: gzip, deflate
抓取网络的机器人也支持此功能。 尤其是因为他们的工作是从整个网络提取数据,他们通过使用压缩来最大化他们的带宽。 我们可以充分利用这个特性。
在这个博客上,我经常遇到扫描安全漏洞的机器人,在大多数情况下我都忽略了。 但是,当我检测到它们正在尝试注入恶意攻击,或者正在探测响应时,我会返回 200 OK 响应,并向它们提供 Gzip 响应。 我使用的文件大小从 1MB 到 10MB 不等,它们很乐意接收。 在大多数情况下,当他们这样做时,我再也没有收到他们的消息。 为什么? 嗯,那是因为它们在接收文件后立即崩溃。
Content-Encoding: deflate, gzip
发生的情况是,它们接收文件,读取指示它们这是一个压缩文件的标头。 因此,它们尝试解压缩 1MB 的文件,以找到它们正在寻找的任何内容。 但是文件扩展,扩展,再扩展,直到它们耗尽内存并且它们的服务器崩溃。 1MB 的文件解压缩为 1GB。 这足以破坏大多数机器人。 但是,对于那些不会停止的讨厌的脚本,我向它们提供 10MB 的文件。 这个文件解压缩为 10GB,并立即杀死该脚本。
在我告诉你如何创建 zip bomb 之前,我必须警告你,你可能会崩溃和损坏你自己的设备。 请自行承担风险继续。 这是我们如何创建 zip bomb 的方法:
dd if=/dev/zero bs=1G count=10 | gzip -c > 10GB.gz
以下是命令的作用:
dd
:dd
命令用于复制或转换数据。if
: 输入文件,指定/dev/zero
,这是一个产生无限零字节流的特殊文件。bs
: 块大小,将块大小设置为 1 GB (1G),这意味着dd
将一次读取和写入 1 GB 的数据块。count=10
: 这告诉dd
处理 10 个块,每个块大小为 1 GB。 因此,这将生成 10 GB 的归零数据。
然后,我们将命令的输出传递给 Gzip,Gzip 会将输出压缩到文件 10GB.gz
中。 在这种情况下,生成的文件大小为 10MB。
在我的服务器上,我添加了一个中间件,用于检查当前请求是否是恶意的。 我有一个黑名单 IP 列表,它们会尝试重复扫描整个网站。 我还有其他启发式方法来检测垃圾邮件发送者。 许多垃圾邮件发送者试图垃圾邮件发送页面,然后返回以查看垃圾邮件是否已发布到页面。 我使用这种模式来检测它们。 看起来像这样:
if (ipIsBlackListed() || isMalicious()) {
header("Content-Encoding: deflate, gzip");
header("Content-Length: "+ filesize(ZIP_BOMB_FILE_10G)); // 10 MB
readfile(ZIP_BOMB_FILE_10G);
exit;
}
这就是所需要的一切。 我唯一付出的代价是,现在有时我会提供一个 10MB 的文件。 如果我有一篇文章正在疯传,我会将其减少到 1MB 的文件,这同样有效。
还有一件事,zip bomb 并非万无一失。 它可以很容易地被检测到和规避。 毕竟,你可以部分读取内容。 但是,对于那些盲目地抓取网络并破坏服务器的不复杂的机器人来说,这是一个保护服务器的好工具。
你可以在我的服务器日志的这个重放中看到它的实际效果。
你喜欢这篇文章吗? 你可以请我喝咖啡。 在这里分享你富有洞察力的评论。
注册新闻通讯。 Name: Email: Subscribe
Next: Part 9: Launch & Post-Deployment Monitoring Previous: Part 8: Deployment Planning & Infrastructure Setup