zip炸弹和跨目录zip文件的构造

前言

在对可上传 zip 文件的上传点进行测试时,除了一般的上传漏洞,我们也要关注其后台代码对 zip 文件解压后的大小和跨目录解压问题的检查。博主在本文中将介绍测试上述两种问题所用到的 zip 文件如何构造。

什么是 zip 炸弹

zip 炸弹就是一个高压缩比的 zip 文件,它本身可能只有几 M 或几十 M 的大小,但是解压缩之后会产生巨大的数据量,会解压到几十 G 的大小甚至更大,这种 zip 文件会对解压缩的系统造成严重的资源负担,影响目标系统业务甚至达到使系统崩溃的结果。

可用于攻击何种系统

zip 炸弹的危害主要在于它解压时消耗的资源和解压后占用的资源,所以主要会对未进行压缩文件解压后大小校验就直接解压的系统造成危害。

如何制作 zip 炸弹

制作 zip 炸弹的方法非常简单,我们可以使用 linux 自带的命令制作。

1. 制造一个较大的 csv 数据文件

如创建一个 1G 的 csv 数据文件

dd if=/dev/zero count=$((1024*1024)) bs=1024 of=bigFile.csv

我们也可以通过更改 count 的值和 bs 的值创建更大的 csv 数据文件
如 10G 的 csv 数据文件

dd if=/dev/zero count=$((1024*1024)) bs=10240 of=bigFile.csv

2. 使用 zip -9 命令压缩

zip -9 bigFile.zip bigFile.csv

可以从图中看到,1G 的 csv 文件被压缩到了 1018K,我们将这个不到 1M 的 zip 文件上传,一般都能通过网站的上传文件大小限制,对自身上传时资源耗费很低,但是服务器解压过程中和解压之后占用的资源就比较多了。

本文中用到的只是一个简单的例子,实际进攻时我们使用的 zip 文件解压后大小会更大,多达几十或上百 TB 级别,而且压缩比也会更高,压缩文件实际大小可能只有十几 MB。会对服务器造成很严重的资源占用。

我们使用这些超高压缩比的 zip 文件时也不需要自己构造,github 中可以找到很多已经打包好的 zip 炸弹。

什么是 zip 跨目录

zip 跨目录与我们常见的跨目录问题类似,都是使用../ 来进行相对路径的目录跨越,zip 文件中携带含有../ 的文件,在解压过程中这些文件名被解析成相对路径,解压后就会将这些文件传递到其他目录。

可用于攻击何种系统

存在对 zip 文件解压的系统,程序实现代码未对携带的../ 等进行过滤,且解压时使用的解压程序没有跨目录的保护机制,这些文件才会被跨目录。

linux 中默认的 unzip,即使正常使用解压了含有../ 的 zip 文件,也是不会被跨目录的,但是加入 -: 参数就会产生这种问题。所以这类问题大多数出现在程序的实现中,程序中调用了某些方法来进行文件解压,但是没有严格判断造成的。

zip 跨目录最典型的攻击手段用于存在上传后缀限制的 web 系统中,如某些接口仅允许上传压缩文件,上传后会自动解压,但是上传路径我们无法访问。这时候攻击者就会构造一个 webshell 文件并添加为携带目录信息的 zip 文件,被自动解压后就会将 webshell 解压到可访问目录,就会造成 getshell。

如何制作跨目录 zip 文件

制作跨目录 zip 文件的方式很方便,我们可以先制作好再上传,也可以在上传的过程中使用 burpsuite 改 zip 文件信息来构造。需要改的信息都是相同的。

1. 使用 notepad++ 修改

首先我们需要创建一个文件名较长的文件,如 1234567890.txt。

然后将其压缩为 zip 格式。

使用 notepad++ 打开 zip 格式的文件,寻找两处很明显的 1234567890.txt 字段,修改成../../7890.txt,保存后重新打开 zip 文件就成功了。

在修改的过程中要确保修改前的文件名和修改后的文件名长度一致,由于一个../ 就占了三个长度,所以在前面才需要文件名较长,文件名越长,可以跨越的目录层数越多。

2. 使用 burpsuite 修改

上传过程中,使用 burpsuite 抓包,直接修改和 notepad++ 中要修改的同样的两处字段提交即可。

文本标题:zip炸弹和跨目录zip文件的构造

文章作者:麻薯

原文地址 uuzdaisuki.com