Подтвердить что ты не робот

Угрозы безопасности с загрузками

Я разрешаю пользователям загружать файлы на мой сервер. С какими возможными угрозами безопасности я сталкиваюсь и как их устранить?

Скажем, я разрешаю пользователям загружать изображения на мой сервер либо из их системы, либо из сети. Теперь, чтобы проверить размер этих изображений, я должен хранить их в папке /tmp. Разве это не рискованно? Как я могу свести к минимуму риск?

Также скажем, что я использую wget для загрузки изображений из ссылки, которую пользователи загружают в мою форму. Сначала я должен сохранить эти файлы на своем сервере, чтобы проверить, действительно ли они являются изображениями. И что, если шутник дает мне URL-адрес, и я в конечном итоге загружаю весь сайт, полный вредоносного ПО?

4b9b3361

Ответ 1

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

Что вы получаете от пользователя с загрузкой файла:

  • данные файла
  • имя файла
  • тип MIME

Это три основных компонента загрузки файла, и ни одна из них не является надежной.

  • Не доверяйте типу MIME в $_FILES['file']['type']. Это абсолютно произвольное значение, предоставленное пользователем.

  • Не используйте имя файла для чего-либо важного. Это совершенно произвольное, поставленное пользователем значение. Вы не можете доверять расширению файла или имени в целом. Не сохраняйте файл на жестком диске сервера, используя что-то вроде 'dir/' . $_FILES['file']['name']. Если имя '../../../passwd', вы переписываете файлы в других каталогах. Всегда создавайте случайное имя самостоятельно, чтобы сохранить файл как. Если вы хотите, вы можете сохранить исходное имя файла в базе данных в виде метаданных.

  • Никогда не позволяйте никому или чему-либо обращаться к файлу произвольно. Например, если злоумышленник загружает файл malicious.php на ваш сервер и вы храните его в каталоге webroot вашего сайта, пользователь может просто перейти к example.com/uploads/malicious.php, чтобы выполнить этот файл и выполнить произвольный PHP-код на вашем сервере.

    • Никогда не храните произвольные загруженные файлы в любом месте публично, всегда храните их где-нибудь, где только ваше приложение имеет к ним доступ.

    • Разрешать доступ к файлам только определенным процессам. Если он должен быть файлом изображения, разрешите script читать изображения и изменять их размеры для прямого доступа к файлу. Если этот script имеет проблемы с чтением файла, он, вероятно, не является файлом изображения, отметьте его и/или отмените. То же самое касается других типов файлов. Если файл должен быть загружен другими пользователями, создайте script, который загрузит файл для загрузки и ничего не сделает с ним.

    • Если вы не знаете, с каким типом файлов вы сталкиваетесь, определите тип файла MIME самостоятельно и/или попробуйте разрешить определенному процессу открыть файл (например, пусть процесс изменения размера изображения пытается изменить размер предполагаемого изображения). Также будьте осторожны, если есть уязвимость в этом процессе, вредоносный файл может использовать его, что может привести к нарушениям безопасности (наиболее распространенным примером таких атак является Adobe PDF Reader).


Чтобы ответить на ваши конкретные вопросы:

[T] o проверьте размер этих изображений, которые я должен хранить в папке /tmp. Разве это не рискованно?

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

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

Что, если шутник дает мне URL-адрес, и я в конечном итоге загружаю весь сайт, полный вредоносного ПО?

Это вам, что именно вы загружаете. Один URL-адрес приведет к лучшему в одном блоке данных. Если вы разбираете эти данные и загружаете содержимое большего количества URL-адресов на основе этого начального блоба, что ваша проблема. Не делай этого. Но даже если бы вы это сделали, ну, тогда у вас будет каталог temp, полный материалов. Опять же, это не опасно, если вы не делаете ничего опасного в этом случае.

Ответ 2

1 простой сценарий будет: Если вы используете интерфейс загрузки, где нет ограничений на тип файлов, разрешенных для загрузки, злоумышленник может загрузить PHP или файл .NET с помощью вредоносного кода, который может привести к компрометации сервера.

относятся: http://www.acunetix.com/websitesecurity/upload-forms-threat.htm Выше ссылка обсуждает общие проблемы

также относятся: http://php.net/manual/en/features.file-upload.php

Ответ 3

Вот некоторые из них:

  • Когда файл загружается на сервер, PHP устанавливает переменную $_FILES ['uploadedfile] [' type] в тип mime, предоставляемый веб-браузером, который использует клиент. Однако проверка формы загрузки файлов не может зависеть только от этого значения. Злоумышленник может легко загружать файлы с помощью script или какого-либо другого автоматизированного приложения, которое позволяет отправлять HTTP POST-запросы, которые позволяют ему отправлять поддельный mime-тип.

  • Почти невозможно скомпилировать список, содержащий все возможные расширения, которые может использовать злоумышленник. Например. Если код работает в размещенной среде, обычно такие среды допускают большое количество языков сценариев, таких как Perl, Python, Ruby и т.д., И список может быть бесконечным.

    Злоумышленник может легко обойти такую ​​проверку, загрузив файл с именем ".htaccess", который содержит строку кода, аналогичную приведенной ниже: AddType application/x-httpd-php .jpg

Ответ 4

Существуют общие правила, позволяющие избежать общих проблем с загрузкой файлов:

  • Сохраняйте загруженные файлы не в корневой папке вашего сайта, чтобы пользователи не могли перезаписывать ваши файлы приложений и напрямую получать доступ к загружаемым файлам (например, в /var/uploads пока ваше приложение находится в /var/www).
  • Сохранение имен санированных файлов в базе данных и физических файлах дает имя хеш-значения файла (это также устраняет проблему сохранения дубликатов файлов - они будут иметь равные хэши).
  • Чтобы избежать проблем с файловой системой в случае, если в папке /var/uploads слишком много файлов, рассмотрите возможность хранения файлов в дереве папок следующим образом:

    file hash = 234wffqwdedqwdcs → сохранить его в /var/uploads/23/234wffqwdedqwdcs

    общее правило: /var/uploads/<first 2 hash letters>/<hash>

  • установите nginx, если вы еще не сделали его - он служит статическому, как магия, и заголовок X-Accel-Redirect позволит вам подавать файлы с разрешениями, которые сначала проверяются пользовательским script