Bug Bounty, Bug Hunting, File Upload, Уязвимости

#23 Bug Bounty v.2 — File Upload

Здравствуйте, дорогие друзья.

Уязвимости при загрузке файлов уже не так распространены, как раньше, но это не значит, что вы не будете сталкиваться с ними время от времени. Как вы знаете, веб-приложения иногда позволяют пользователям загружать файлы на свой сайт. Это может быть изображение профиля, функция загрузки pdf-файлов или что-то еще. Если все сделано неправильно, злоумышленники могут загрузить вредоносные файлы, которые потенциально могут привести к удаленному выполнению кода (RCE). Если есть функция загрузки, вам следует протестировать эту уязвимость.

Загрузка файлов

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

бэкдор_1
бэкдор_2
бэкдор_3
бэкдор_4

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

php-script

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

shell command

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

Обход типа содержимого

Проверка типа содержимого — это когда сервер проверяет содержимое файла, проверяя MIME-тип файла, который можно найти в http-запросе.

Обход типа содержимого

Как мы видим, на изображении выше четко указано, что файл имеет тип содержимого “application/x-php”. Однако, если мы попытаемся загрузить файл, он будет заблокирован, поскольку загрузка этого типа содержимого запрещена. Однако загрузка изображений разрешена. Если сервер доверяет типу контента в HTTP-запросе, злоумышленник может изменить это значение на “image/jpeg”, которое пройдет проверку.

“image/jpeg”

Это позволяет нам пройти проверку на соответствие типу содержимого и загрузить вредоносную программу с полезной нагрузкой PHP.

Обход имени файла

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

Регулярное выражение для проверки расширения файла

Как показано выше, мы смогли обойти проверку регулярных выражений, изменив расширение на “phpt” и “phtml”. Большинство людей не знают об этих расширениях и о том, что их можно использовать для выполнения PHP-файлов. Разработчику достаточно пропустить только одно расширение при проверке, и мы сможем обойти это.

Резюме

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

На этом все. Всем хорошего дня!

Цикл статей по Bug Bounty.