zip炸弹保护服务器被机器攻击

34 阅读2分钟

背景

爬虫是一直存在的一个行为,为了避免机器的爬取导致的服务器压力,可以考虑采用 zipbomb【你爬取我网站,那我就攻击你】。

zip 炸弹是一个相对较小的压缩文件,可以扩展成一个非常大的文件,这可能会使机器不堪重负。

通过利用 Web 的 gzip压缩功能来实现。一般为了压缩最大化带宽,抓取Web的机器人一般都支持 gzip。当检测到恶意攻击或网络爬虫时,返回 200响应,并提供 gzip响应。

Content-Encoding: deflate,gzip

发生的情况是,他们收到文件,读取 Headers,告诉他们这是一个压缩文件。因此,他们尝试解压缩 1MB 文件以查找他们正在寻找的任何内容。但是文件会不断扩展,再扩展,直到内存耗尽并且服务器崩溃。1MB 文件解压缩为 1GB。这足以破坏大多数机器人。但是,对于那些不会停止的讨厌的脚本,我会为它们提供 10MB 的文件。这个解压缩为 10GB 并立即杀死脚本。

创建 zip炸弹的方法

dd if=/dev/zero bs=1G count=10 | gzip -c > 10GB.gz

别轻易尝试,解压出来会特别大哦,10GB的文件大小。 解释一下:

1. dd if=/dev/zero bs=1G count=10

  • dd:数据复制工具,常用于底层数据操作。
  • if=/dev/zero:从 /dev/zero 设备读取数据(该设备会无限生成二进制零 0x00)。
  • bs=1G:每次读取/写入的块大小为 1GB。
  • count=10:总共处理 10 个块。
  • 效果:生成 10GB 的零数据流(10 块 × 1GB/块)。

2. |(管道)

  • 将 dd 的输出(10GB 零数据流)传递给 gzip -c

3. gzip -c

  • gzip:压缩工具,默认使用 gzip 算法。
  • -c:将压缩结果输出到标准输出(而非直接写入文件)。
  • 效果:将 10GB 的零数据压缩为极小的数据流(零的重复性极高,压缩率接近 100%)。

4. > 10GB.gz

  • >:重定向操作符,将左侧命令的输出写入右侧文件。
  • 效果:将压缩后的数据保存到 10GB.gz 文件中。

实际结果

  1. 文件内容:全零数据(0x00)的压缩版本。
  2. 文件大小
    • 原始数据:10GB(未压缩)。
    • 压缩后:约 10MB 以下(实际测试约为 10-20KB,具体取决于压缩算法实现)

使用

if (ipIsBlackListed() || isMalicious()) {
    header("Content-Encoding: deflate, gzip");
    header("Content-Length: "+ filesize(ZIP_BOMB_FILE_10G)); // 10 MB
    readfile(ZIP_BOMB_FILE_10G);
    exit;
}

解释: 因为全零流数据,所以10GB文件仅有 10MB大小,而爬虫机器人会依赖任务直接解压。从而你懂得,一般的机器也就崩了。

参考:

I use Zip Bombs to Protect my Server