File Upload и его подводные камни

Всем привет. Сегодня хочу затронуть тему File Upload и то, почему этот функционал почти всегда является одним из самых чувствительных в приложении с точки зрения ИБ.

━━━━━━━━━━ Что такое File Upload ━━━━━━━━━━

File Upload — это механизм, при котором клиент отправляет файл на сервер, чаще всего через multipart/form-data. Сам по себе этот формат нормальный и стандартный, но важно понимать: поля вроде filename и Content-Type приходят от клиента, а значит доверять им “как есть” нельзя.

Где это встречается: • загрузка аватарки • загрузка изображения к посту • загрузка PDF или DOCX в поддержку • импорт CSV/Excel

━━━━━━━━━━ Почему это опасно ━━━━━━━━━━

File Upload опасен тем, что приложение начинает работать с чужим объектом, формат, содержимое и даже имя которого контролирует атакующий.

А дальше всё упирается в реализацию: • как проверяется расширение • как определяется MIME type • анализируется ли реальное содержимое файла • где файл хранится • можно ли его потом открыть напрямую • обрабатывается ли он сторонними библиотеками • есть ли лимиты по размеру и количеству

Если хотя бы одна из этих частей сделана слабо, дальше уже начинаются уязвимости.

━━━━━━━━━━ Основные риски File Upload ━━━━━━━━━━

RCE / загрузка исполняемого файла Самый известный и самый опасный сценарий. Если сервер позволяет загрузить файл, который потом может быть интерпретирован как скрипт или выполнен через backend-компонент, это уже прямой путь к компрометации.

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

XSS / XXE / parser-based атаки Опасность не только в “web shell”. Даже изображение, SVG, XML или офисный файл могут стать носителем другой атаки, если backend или frontend потом небезопасно его обрабатывает, парсит или отображает.

DoS Слишком большие файлы, огромное количество загрузок, архивные бомбы, тяжёлая обработка изображений и файловых форматов — всё это легко превращается в отказ в обслуживании, если нет лимитов и контроля ресурсов.

Path Traversal / overwrite Если имя файла используется небезопасно, можно получить перезапись существующих файлов или запись в неожиданные директории. Особенно опасно, когда приложение работает с путями “как пришло от клиента”.

IDOR / утечки доступа Даже если сама загрузка реализована нормально, проблема часто всплывает дальше — на этапе хранения и выдачи. Файл может быть приватным, но отдаваться по предсказуемому ID, URL или имени без нормальной авторизации. Это уже ведёт к утечкам.

━━━━━━━━━━ Как обезопасить File Upload ━━━━━━━━━━

• строгий allowlist допустимых расширений и типов • серверная проверка MIME и сигнатуры файла, а не доверие к заголовкам клиента • переименование файла на стороне сервера • хранение вне web root • запрет прямого исполнения загруженных файлов • лимиты по размеру, количеству и частоте загрузок • отдельная проверка архивов, SVG, XML, PDF и офисных форматов • антивирусное или sandbox-сканирование там, где это уместно • выдача файлов только через контролируемый слой доступа • обязательная авторизация на скачивание приватных файлов • логирование и алерты на аномальные загрузки

━━━━━━━━━━ Итог ━━━━━━━━━━

File Upload — это не “мелкий технический endpoint”.

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

Именно поэтому безопасный File Upload — это всегда не одна проверка, а цепочка защит: • валидация • изоляция • безопасное хранение • контроль доступа • безопасная обработка

#AppSec #pentest #cybersecurity #backend

File Upload и его подводные камни | Сетка — социальная сеть от hh.ru