Введение

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

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

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

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

После загрузки оболочки на веб-сервер злоумышленник использует указанный путь к файлу для доступа к оболочке и выполнения команды. Предположим, файл был сохранен в папке example.com/profile-images/‹filename›.

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

example.com/profile-images/shell.php?command=ls

Уязвимый код выглядит так

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

Если вы хотите узнать больше об эксплуатации, вы можете проверить мой предыдущий блог.



Эксплойт. Существует несколько способов его использования. Веб-приложение обычно иногда накладывает ограничения на

Есть несколько способов обойти ограничение. Такой как:

  • Если веб-приложение проверяет только расширение загружаемого файла, то в этом случае злоумышленник изменяет файл при загрузке файлов. Это легко сделать, перехватив запрос с помощью любого прокси-инструмента, такого как пакет burp, а затем изменив расширение файла. Например, если загруженный файл имеет расширение PHP, то есть «bypass.php», и приложение принимает только расширение файла изображения, такое как png или jpeg. Итак, злоумышленник загружает файл с двойным расширением, например: «bypass.php.jpg». Сделав это, поскольку сопоставляется только расширение, злоумышленник сможет загрузить файл и обойти ограничения. Этот метод обхода известен как метод двойного расширения

  • Иногда приложения проверяют файл на основе заголовка «Content-Type». Изображения имеют тип содержимого image/png, но если вы загрузите файл с расширением php, он будет иметь заголовок этого типа содержимого.

Content-Type: application/octet-stream

Поскольку заголовок типа контента не является изображением, запрос будет отклонен. Таким образом, злоумышленник перехватывает запросы с помощью любого прокси-инструмента, такого как пакет burp, и меняет тип содержимого на «image/png». Обычно это позволяет обойти ограничения заголовка типа контента.

  • Чтобы обойти это ограничение, иногда злоумышленник может вставить символ нулевого байта в имя файла (%00).

Таким образом, обновленное имя файла станет bypass.php%00.jpg. Поэтому все после нулевого байта (%00) будет игнорироваться, приложение будет думать, что загружается файл jpeg, совпадая с расширением, а также с заголовком типа содержимого, и, следовательно, файл будет успешно загружен.

Исправление:

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

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

Заключение

Загрузка файлов является очень распространенным недостатком в безопасности приложений, и его довольно просто использовать, если администратор программы не реализовал процесс проверки эффективно. Серьезность атаки определяется методом эксплуатации или разрешением, предоставленным сервером. Чтобы предотвратить уязвимости загрузки файлов в вашем приложении, внедрите все 10 лучших проверок OWASP и как можно скорее исправьте свое приложение.