İçeriğe geç

Zip slip (ARCH7106)

Anahtar php.security.zip-slip · Önem error · Kategori security · CWE CWE-22

Arşiv giriş yollarını doğrulamadan diske yazmak, ../ içeren giriş adlarıyla hedef dizinin dışına dosya yazılmasına olanak tanır. Her giriş hedefinin çıkarma kökü içinde kaldığı doğrulanmalıdır.

<?php
$zip = new ZipArchive();
$zip->open($_FILES['archive']['tmp_name']);
$zip->extractTo('/var/www/data');
$zip->close();
<?php
$dest = '/var/www/data';
$zip = new ZipArchive();
$zip->open($_FILES['archive']['tmp_name']);
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
$path = realpath($dest) . '/' . $name;
if (str_contains($name, '..') || !str_starts_with($path, realpath($dest) . '/')) {
continue;
}
$zip->extractTo($dest, $name);
}
$zip->close();

Her arşiv girişinin çözümlenmiş hedef yolunun çıkarma dizini içinde kaldığını doğrulayın; .. içeren girişleri atlayın.