Zip

是否可以使用 zip 偽造目標目錄路徑?

  • August 12, 2014

給定目前目錄中的一堆文件,我希望能夠壓縮它們,以便在提取時將它們放置在某些給定目錄中。例如,假設我有這些$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

我看不到使用該zip命令執行此操作的方法,但是在 python 中很容易。

請注意,zip 文件格式規範第 4.4.17.1 節說路徑名不能以“/”開頭,所以我無法幫助解決這部分問題。

當您將文件添加到 zip 存檔時,python zipfile模組將允許您覆蓋文件的路徑名;只需將所需名稱作為可選的第二個參數傳遞給ZipFile.write

ZipFile.write(文件名

$$ , 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將從路徑名中刪除任何前導“/”,以符合標準。

引用自:https://unix.stackexchange.com/questions/149710