引用自维基百科页面:
一个Zip炸弹的例子是45.1.zip文件,它是45.1千字节的压缩数据,包含9层嵌套的ZIP文件,每组中有10个底层存档,每个底层存档都包含一个1.30千兆字节的文件,总共达到1.30艾字节的未压缩数据。
所以,您只需要一个装满零的单一1.3GB文件,将其压缩成一个ZIP文件,复制10份,打包到一个ZIP文件中,然后重复此过程9次。
这样,您将获得一个文件,当完全解压缩时,会产生一些荒谬的数据,而不需要从那么多的数据开始。
另外,嵌套的存档使得像病毒扫描器这样的程序更难聪明地拒绝解压缩“太大”的存档,因为在最后一层之前,总数据量并不大,只有到达该层级别时才能看到底层文件有多大,每个单独的文件不是“太大”,只有巨大的数量是有问题的。
创建一个1.3艾克斯字节大小的零文件。
右键单击>发送到压缩(zipped)文件夹。
使用以下命令可以在Linux下轻松完成此操作:
dd if=/dev/zero bs=1024 count=10000 | zip zipbomb.zip -
将count替换为您要压缩的KB数。上面的示例创建了一个10MiB的zip炸弹(实际上并不是很大,但它展示了整个过程)。
您不需要硬盘空间来存储所有未压缩的数据。
我可能错误了,但它会产生 4^16 (4,294,967,296) 个目录。因为每个目录都需要 N 字节的分配空间,所以最终会变得非常大。最后的 dll 文件大小为 0 字节。\42\lib 0\book 0\chapter 0\doc 0\0.dll
...
\42\lib F\book F\chapter F\doc F\0.dll
\42\lib 0\book 0\chapter 0\doc 0\0.dll
将导致分配出 4GB 的空间。认真的回答:
压缩依赖于发现重复模式,因此zip文件将包含代表类似以下数据的内容
0x100000000000000000000000000000000000
(Repeat this '0' ten trillion times)
要在实际环境中创建一个(即不在你巨大的硬盘上创建1.3 exabyte文件),你可能需要学习二进制级别的文件格式,并编写一些将其转换为所需文件外观的东西,后期进行压缩。
/dev/zero
),你仍然会受到压缩流所需的计算能力的限制。1.zip
。n
(比方说10)个此文件的副本,并将这10个文件添加到压缩档案中(例如2.zip
)。k
次。https://www.bamsoftware.com/hacks/zipbomb/
本文介绍了如何构建一个非递归的压缩炸弹,通过在 zip 容器内部重叠文件来实现高压缩比。 "非递归" 意味着它不依赖于解压缩程序递归地解压缩嵌套在 zip 文件中的 zip 文件:它在一轮解压缩后完全展开。输出大小随输入大小的平方增长,达到超过 2800 万的压缩比(10 MB → 281 TB)在 zip 格式的极限处。使用 64 位扩展可以实现更大的扩展。该构造仅使用最常见的压缩算法 DEFLATE,并且与大多数 zip 解析器兼容。