Перейти к содержимому

Поиск по платформе

File Upload Bypass через подмену Content-Type

Обработчик загрузки файлов проверяет только расширение (.jpg, .png, .gif), но не реальное содержимое файла. HTML-файл с расширением .jpg будет принят и отдан браузеру.

Автор: Hack & Fix
Освоишь: magic-bytes проверкаrandom filenameвне docroot
Средне+60 XP ~32 мин golang
CWE-434 · A04:2021 Pro
Обложка: File Upload Bypass через подмену Content-Type Обложка: File Upload Bypass через подмену Content-Type
Задача
# Загрузка файлов: обход проверки типа содержимого ## Сценарий Вы проводите аудит сервиса фотопечати **LumenPrint**: клиенты загружают снимки в личный кабинет, а партнёры — баннеры для витрины. Последний релиз добавил загрузку аватаров, и разработчики уверены, что фильтр расширений надёжно отсекает всё, кроме изображений. Поводом для проверки стала жалоба менеджера: после открытия «картинки» из галереи его браузер повёл себя так, будто это была вовсе не картинка. ## Цель 1. Изучите проверку на эндпоинте загрузки: решение о типе файла принимается по расширению имени или по реальному содержимому? 2. Загрузите файл, который сервер примет за изображение, а браузер при прямом открытии проинтерпретирует как документ с исполняемым содержимым. 3. Продемонстрируйте работу этого канала под доменом приложения и добудьте флаг из административной панели. ## Теория Безопасная загрузка файлов требует согласованной проверки трёх независимых вещей: имени файла, реального содержимого и способа отдачи. Если фильтруется только расширение, атакующий называет файл «изображением», а вкладывает внутрь разметку страницы. Окончательное решение тогда принимает браузер: не получив строгого запрета, он может сам определить тип по первым байтам содержимого и запустить HTML-парсер с исполнением встроенных сценариев — это называется MIME sniffing. Заголовок, отключающий такое поведение, на раздаче не выставляется. **Уязвимый паттерн:** ```go ext := strings.ToLower(filepath.Ext(header.Filename)) if !allowedExts[ext] { return } io.Copy(out, file) // содержимое сохраняется без проверки ``` Механика атаки: фильтр доверяет той части имени, которую полностью контролирует клиент, содержимое никто не анализирует, а браузеру разрешено угадывать тип по содержимому. В результате загруженная «картинка» превращается в активную страницу в origin приложения — с доступом к сессии того, кто её открыл. ## Точка входа атаки `POST /api/upload` — multipart-форма с полем `file`; сохранённые файлы открываются напрямую по пути из ответа (`GET /uploads/...`). * **Обычный пользователь:** `demo` / `demo` * **Администратор:** `admin` / `SuperSecret`

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: File Upload Bypass через двойное расширение Обложка лабы: File Upload Bypass через двойное расширение
File Upload

File Upload Bypass через двойное расширение

Обработчик загрузки использует filepath.Ext() для проверки расширения, но эта функция возвращает только последнее расширение. Файл test.html.jpg проходит проверку, а Go http.FileServer может определить Content-Type по первому расширению.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: File Upload: Обход расширений и Path Traversal Обложка лабы: File Upload: Обход расширений и Path Traversal
File Upload

File Upload: Обход расширений и Path Traversal

Сервер принимает файлы с расширением .jpg, но слепо доверяет имени файла из Content-Disposition. Используйте Path Traversal, чтобы подбросить свой токен конфигурации и получить флаг.

+90 XP
Go Pro
Exploit Fix
Обложка лабы: File Upload: Path Traversal в имени файла (Express + busboy) Обложка лабы: File Upload: Path Traversal в имени файла (Express + busboy)
File Upload

File Upload: Path Traversal в имени файла (Express + busboy)

Загрузка аватара без санитизации имени файла позволяет перезаписать серверные шаблоны через path traversal в filename.

+60 XP
Node.js Pro
Exploit Fix
Обложка лабы: File Upload: Content-Type Bypass Обложка лабы: File Upload: Content-Type Bypass
File Upload

File Upload: Content-Type Bypass

Загрузка файлов проверяет только расширение, но не содержимое. Атакующий может загрузить HTML/JS в файле с расширением .jpg.

+60 XP
PHP Pro
Exploit Fix