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

前言

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

什么是zip炸弹

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

可用于攻击何种系统

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

如何制作zip炸弹

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

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

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

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

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

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

2.使用zip -9命令压缩

1
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++中要修改的同样的两处字段提交即可。