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

このコマンドを使用してこれを行う方法が見つかりませんでしたが、zipPythonでは簡単です。

ご注意ください、zipファイル形式の仕様セクション 4.4.17.1 では、パス名が "/" で始まらないことが示されているので、その部分については役に立ちません。

Python圧縮ファイルzipアーカイブにファイルを追加すると、モジュールを使用してファイルのパス名をオーバーライドできます。必要な名前をオプションの2番目の引数として渡すだけです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標準に準拠するために、パス名から先行する「/」が削除されます。

おすすめ記事