#23 Bug Bounty v.2 — File Upload
Здравствуйте, дорогие друзья.
Уязвимости при загрузке файлов уже не так распространены, как раньше, но это не значит, что вы не будете сталкиваться с ними время от времени. Как вы знаете, веб-приложения иногда позволяют пользователям загружать файлы на свой сайт. Это может быть изображение профиля, функция загрузки pdf-файлов или что-то еще. Если все сделано неправильно, злоумышленники могут загрузить вредоносные файлы, которые потенциально могут привести к удаленному выполнению кода (RCE). Если есть функция загрузки, вам следует протестировать эту уязвимость.
Загрузка файлов
При тестировании функций загрузки файлов я в первую очередь загружаю простой cmd-бэкдор. В зависимости от языка целевого веб-приложения ваш бэкдор будет выглядеть по-разному, ниже приведены некоторые примеры:
В приведенном ниже примере мы загружаем простую веб-оболочку на PHP в целевую среду. Приложение не имеет никаких ограничений на тип файла, который может быть загружен, поэтому злоумышленник может загрузить PHP-скрипт, и если он находится в веб-каталоге, мы можем перейти к нему, и он будет выполнен.
Обратите внимание, что веб-оболочка загружена, нам нужно выяснить, куда она загружена. Как только вы это выясните, вы можете перейти к бэкдору и выполнить любую команду оболочки, которую вы хотите, как показано ниже:
Как вы можете видеть выше, оболочка успешно загрузилась, и мы смогли выполнить удаленные команды.
Обход типа содержимого
Проверка типа содержимого — это когда сервер проверяет содержимое файла, проверяя MIME-тип файла, который можно найти в http-запросе.
Как мы видим, на изображении выше четко указано, что файл имеет тип содержимого “application/x-php”. Однако, если мы попытаемся загрузить файл, он будет заблокирован, поскольку загрузка этого типа содержимого запрещена. Однако загрузка изображений разрешена. Если сервер доверяет типу контента в HTTP-запросе, злоумышленник может изменить это значение на “image/jpeg”, которое пройдет проверку.
Это позволяет нам пройти проверку на соответствие типу содержимого и загрузить вредоносную программу с полезной нагрузкой PHP.
Обход имени файла
Иногда сервер проверяет имя файла, чтобы узнать, занесен ли он в черный или белый список. Как вы, возможно, знаете по другим уязвимостям, этот подход к защите имеет много недостатков. Проблема с занесением в черный список заключается в том, что если вы забудете хотя бы 1 расширение, злоумышленники могут обойти проверку. Чтобы реализовать эту проверку, большинство разработчиков используют регулярное выражение для проверки расширения файла.
Как показано выше, мы смогли обойти проверку регулярных выражений, изменив расширение на “phpt” и “phtml”. Большинство людей не знают об этих расширениях и о том, что их можно использовать для выполнения PHP-файлов. Разработчику достаточно пропустить только одно расширение при проверке, и мы сможем обойти это.
Резюме
Уязвимости при загрузке файлов, возможно, немного сложнее обнаружить в сети, так как большинство людей знают об этой ошибке, но если вы все-таки обнаружите эту уязвимость, это почти всегда приведет к удаленному выполнению кода (RCE). Только по этой причине вам следует всегда проверять это. Уязвимость возникает всякий раз, когда вы видите возможность загружать файлы в приложение.
На этом все. Всем хорошего дня!