Как предотвратить уязвимости при загрузке файлов

  1. Влияние уязвимостей при загрузке файлов
  2. Типы уязвимостей при загрузке файлов
  3. Уязвимость локальной загрузки файлов
  4. Уязвимость удаленной загрузки файлов
  5. Заключение

Уязвимости загрузки файлов являются третьим наиболее распространенным типом уязвимостей, который мы обнаружили в нашем анализе 1599 уязвимостей WordPress за 14 месяцев.

Уязвимости загрузки файлов являются третьим наиболее распространенным типом уязвимостей, который мы обнаружили в нашем анализе 1599 уязвимостей WordPress за 14 месяцев

Влияние уязвимостей при загрузке файлов

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

Типы уязвимостей при загрузке файлов

Существует два основных типа уязвимостей при загрузке файлов. В этой статье мы назовем эти описательные имена, которые вы, возможно, никогда не слышали, но мы считаем, что они описывают разницу между основными типами уязвимостей при загрузке.

Уязвимость локальной загрузки файлов - это уязвимость, при которой приложение позволяет пользователю напрямую загружать вредоносный файл, который затем выполняется.

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

Давайте рассмотрим каждую из этих уязвимостей в деталях, как они создаются и как их избежать.

Уязвимость локальной загрузки файлов

Чтобы изучить эту уязвимость, давайте посмотрим на Уязвимость загрузки файла плагина 'wpshop' сообщалось в начале 2015 года. Вот код, который создал уязвимость:

$ file = $ _FILES ['wpshop_file']; $ tmp_name = $ file ['tmp_name']; $ name = $ file ["name"]; @move_uploaded_file ($ tmp_name, WPSHOP_UPLOAD_DIR. $ name);

Вы можете найти этот код в строке 620 из include / ajax.php в версии 1.3.9.5 плагина ,

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

Ошибка 1: Нет проверки подлинности или проверки авторизации, чтобы убедиться, что пользователь выполнил вход (аутентификация) и имеет доступ для загрузки файла (авторизация). Это позволяет злоумышленнику загрузить файл на веб-сайт без необходимости входа или получения правильных разрешений.

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

if (! current_user_can ('upload_files'))) // Убедитесь, что текущий пользователь может загружать файлы wp_die (__ ('У вас нет прав на загрузку файлов.')); // Процесс загрузки файла

Ошибка 2: нет очистки для имени файла или содержимого. Это позволяет злоумышленнику загрузить файл с расширением .php, который затем может быть доступен злоумышленнику из Интернета и выполнен.

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

wp_check_filetype () проверит, разрешено ли загружать расширение файла, и по умолчанию список допустимых загрузок файлов в WordPress предотвращает загрузку любого исполняемого кода.

$ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name'])); if (! empty ($ fileInfo ['ext'])) {// Этот файл действителен} else {// Неверный файл}

Вы также можете дополнительно ограничить то, что разрешено, указав разрешенные типы пантомимы. Этот список позволяет только изображения.

// Мы разрешаем только изображения $ allowMimes = array ('jpg | jpeg | jpe' => 'image / jpeg', 'gif' => 'image / gif', 'png' => 'image / png',) ; $ fileInfo = wp_check_filetype (базовое имя ($ _ FILES ['wpshop_file'] ['name']), $ allowMimes);

Теперь, когда мы убедились, что имя файла является безопасным, мы обработаем саму загрузку файла. WordPress имеет удобную встроенную функцию для этого: wp_handle_upload ().

$ fileInfo = wp_check_filetype (basename ($ _ FILES ['wpshop_file'] ['name'])); if (! empty ($ fileInfo ['type'])) {$ uploadInfo = wp_handle_upload ($ _ FILES ['wpshop_file']], массив ('test_form' => false, 'mimes' => $ allowMimes,)); }

wp_handle_upload () получает ссылку на один элемент суперглобального $ _FILES и возвращает массив, содержащий URL, полный путь и тип MIME для загрузки.

Проверьте загружаемый контент для дополнительной безопасности

Получая закачку, вы можете избежать загрузки злоумышленниками исполняемого PHP-кода или другого кода, проверив загруженные файлы на предмет содержимого. Например, если вы принимаете загрузки изображений, позвоните PHP getimagesize () функция загруженного файла, чтобы определить, является ли это действительным изображением.

getimagesize () пытается прочитать информацию заголовка изображения и потерпит неудачу на недопустимом изображении. Это еще один метод проверки содержимого, которое вы ожидаете от пользователя.

if (! @getimagesize ($ _ FILES ['wpshop_file'] ['tmp_name'])) wp_die (__ ('Предоставлено неверное изображение.'));

Уязвимость удаленной загрузки файлов

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

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

URL-адрес изображения может быть изменен, чтобы злоумышленник мог указать файл PHP, который был размещен на собственном веб-сайте злоумышленников. Затем TimThumb извлекает этот файл PHP и сохраняет его на веб-сайте жертвы в каталоге, доступном из Интернета. Затем злоумышленник просто получит доступ к этому файлу PHP в своем браузере и сможет выполнить его.

Как избежать уязвимостей при удаленной загрузке файлов

Предотвращение такого рода уязвимости аналогично предотвращению локальной уязвимости загрузки файлов:

  • Разрешить только определенные расширения файлов.
  • Разрешить использование этой функции разрешено только авторизованным и аутентифицированным пользователям.
  • Проверьте любой файл, извлеченный из Интернета для содержания. Убедитесь, что это на самом деле изображение или файл того типа, который вы ожидаете.
  • Служите извлеченные файлы из вашего приложения, а не напрямую через веб-сервер.
  • Храните файлы в закрытом доступном каталоге, если можете.
  • Запишите в файл, когда вы сохраните его, чтобы включить заголовок, который делает его неисполняемым.

Заключение

Как видно из демонстрации видео и приведенного выше контента, уязвимости при загрузке файлов являются серьезными. Их также легко избежать, если разработчик сможет их распознать, и существует несколько эффективных методов предотвращения такого рода уязвимостей, влияющих на ваше приложение WordPress.