Потенциальные проблемы безопасности с PHP ZipArchive - PullRequest
9 голосов
/ 12 июля 2011

Я хочу разрешить участникам загружать контент, используя zip-файл.После загрузки я хочу использовать PHP-класс ZipArchive, чтобы распаковать содержимое файла zip в каталог, а затем переместить файлы в нашу систему.

Хотя я обеспокоен потенциальными рисками безопасности и могуне найти никакой документации на php.net.Первый (ну, единственный) риск, который приходит на ум, - это создание zip-файла с относительными путями, например "../../etc/passwd" (если они предполагают, что я распаковываю файл в / tmp / somedir).

На самом деле мне трудно создать относительный путь в zip-файле, поэтому я не могу проверить, возможно ли такое.Я также не могу найти способ извлечь содержимое zip-файла с помощью ZipArchive и заставить его игнорировать каталоги (распаковать все файлы, но не создавать структуру каталогов внутри zip-файла).

Можеткто-нибудь подскажет, возможен ли такой эксплойт и / или как игнорировать структуру каталогов в zip-файле с помощью ZipArchive?

Ответы [ 4 ]

3 голосов
/ 03 января 2014

У меня были те же проблемы, и я посмотрел на исходный код PHP 5.3, где я нашел это:

/* Clean/normlize the path and then transform any path (absolute or relative)
         to a path relative to cwd (../../mydir/foo.txt > mydir/foo.txt)
 */
virtual_file_ex(&new_state, file, NULL, CWD_EXPAND TSRMLS_CC);
path_cleaned =  php_zip_make_relative_path(new_state.cwd, new_state.cwd_length);
if(!path_cleaned) {
    return 0;
}

Выглядит хорошо для меня.Проверьте PHP и посмотрите ./ext/zip/php_zip.c для деталей.

2 голосов
/ 12 июля 2011

Интересный вопрос, но я призываю вас пойти другим путем.Я настоятельно рекомендую вам запустить ваш веб-процесс с наименьшими привилегиями в chroot-тюрьме.Если вы сделаете это, самое худшее, что может произойти, это искажение вашего сайта, а затем вы восстанавливаете резервную копию и делаете некоторые экспертизы, чтобы закрыть эту конкретную дыру.Постоянно открываются новые дыры, вам будет очень трудно полностью обезопасить свой сайт, следуя таким догадкам.Минимизация песочницы атакующего действительно имеет большое значение.

1 голос
/ 12 июля 2011

Вы должны убедиться, что извлеченное содержимое не обслуживается непосредственно вашим сервером приложений.Поэтому, если у кого-то есть php-файл в его архиве, он не может выполнить его через ваш веб-сервер.

Другое дело, что вы должны быть защищены от включения в сгенерированный пользователем контент.Но это следует учитывать и без наличия zip-архивов.

0 голосов
/ 12 июля 2011

В конце концов, я собираюсь использовать решение Pekka, заключающееся в использовании утилиты unzip для командной строки. Он предоставляет ключи для игнорирования каталогов в zip-файле. Проблемы, на которые указывают другие, здесь не проблема. После распаковки файлов мы добавляем их в систему, используя тот же процесс, что и при обычной загрузке, что означает, что каждый файл проверяется с использованием мер безопасности, которые у нас уже есть.

...