是否可以使用 zip 伪造目标目录路径?

是否可以使用 zip 伪造目标目录路径?

给定当前目录中的一堆文件,我希望能够对它们进行压缩,以便在提取时将它们放置在某些给定的目录中。例如,假设我有这些$PWD

ls
fsck
xz
chroot

当我运行时unzip foo.zip,它们都会被提取到这些目录中:

/bin
/sbin
/usr/bin
/usr/sbin

我能找到的最接近的是这些文件必须已经存在于我想要将文件提取到的任何目录路径中(用作$PWD根目录):

$ zip foo.zip bin/ls sbin/fsck usr/bin/xz usr/sbin/chroot

然后,在我希望进行提取的系统上,我必须:

$ cd /
$ sudo unzip foo.zip

答案1

我没有找到使用该zip命令执行此操作的方法,但在 python 中很容易。

请注意,zip 文件格式规范,第 4.4.17.1 节,说路径名不能以“/”开头,所以我无法帮助解决该部分。

蟒蛇压缩文件当您将文件添加到 zip 存档时,模块将允许您覆盖文件的路径名;只需将所需的名称作为可选的第二个参数传递给ZipFile.write

ZipFile.write(filename[, arcname[, compress_type]])
将名为 filename 的文件写入存档,并为其指定存档名称 arcname (默认情况下,这与 filename 相同,但没有驱动器号并带有前导路径分隔符已删除)。如果给定, compress_type 会覆盖为新条目的构造函数提供的压缩参数的值。
注意:存档名称应相对于存档根目录,即它们不应以路径分隔符开头。

这是一个例子:

$ touch 1 2 3
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import zipfile
>>> with zipfile.ZipFile('bundle.zip', 'w') as bundle:
...   bundle.write('1', '/bin/1')
...   bundle.write('2', '/sbin/2')
...   bundle.write('3', '/usr/bin/3')
... 
>>> 
$ unzip -l bundle
Archive:  bundle.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2014-08-11 13:00   bin/1
        0  2014-08-11 13:00   sbin/2
        0  2014-08-11 13:00   usr/bin/3
---------                     -------
        0                     3 files

请注意,zipfile.write将从路径名中删除任何前导“/”,以符合标准。

相关内容