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

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

File Upload: обход проверки расширения через Content-Type

Загрузчик изображений проверяет расширение файла, но не его содержимое. HTML-файл, переименованный в .jpg, загружается и исполняется в браузере.

Автор: Hack & Fix
Освоишь: magic-bytes проверкаrandom filenameвне docroot
Легко+30 XP ~17 мин python
CWE-434 · A04:2021 Pro
Обложка: File Upload: обход проверки расширения через Content-Type Обложка: File Upload: обход проверки расширения через Content-Type
Задача
# Загрузка файлов: обход проверки по имени файла ## Сценарий Вы проводите аудит **AmberDepot** — интернет-магазина на Flask. Маркетинг попросил добавить к отзывам картинки, и разработчик Гоша с душой подошёл к безопасности: загрузчик принимает только изображения — перечень разрешённых форматов явно перечислен в коде. Гоша даже написал проверку отдельно и гордится ей на код-ревью. Магазин собрался на аудит перед подключением платёжного агрегатора. Проверка опирается на свойство файла, которое целиком контролирует клиент — на имя и его расширение. Содержимое при этом не проверяется, а при выдаче сервер не запрещает браузеру самостоятельно угадывать тип. Эти два зазора складываются в канал: «изображение», которое на самом деле веб-страница, сохраняется на доверенном домене и исполняется в браузере посетителя. ## Цель 1. Авторизуйтесь как обычный пользователь и найдите форму загрузки изображения на странице товара. 2. Изучите, что именно проверяет сервер: какому свойству файла он доверяет и что игнорирует. 3. Сформируйте файл, который проходит фильтр под видом изображения, но при открытии ссылки в браузере интерпретируется как веб-страница с исполняемой клиентской логикой. 4. Заберите флаг через встроенный сценарий магазина: выполнив код в браузере, войдите привилегированной учётной записью (имитация перехваченной сессии), купите товар **CTF Flag** — значение появится в профиле. ## Теория Расширение в имени файла — это заявление клиента о содержимом, а не факт. Фильтр, разрешающий загрузку по расширению, пропускает любой контент с «правильным» названием. Вторая половина проблемы — на выдаче: если сервер не запретил браузеру определять тип содержимого самостоятельно, браузер смотрит не на расширение и не на заявленный тип, а на фактические байты. Текст с разметкой он обрабатывает как страницу — и исполняет её код уже на доверенном домене магазина. **Уязвимый паттерн:** ```python ext = os.path.splitext(filename)[1].lower() return ext in ALLOWED_EXTENSIONS ``` Решение о сохранении принимается исключительно по расширению присланного имени; содержимое файла не проверяется. ## Точка входа атаки `POST /product/<id>/upload` — multipart-форма с полем файла `image` и CSRF-токеном страницы товара. Загруженные файлы открываются по адресу вида `GET /uploads/<имя_файла>`. * **Обычный пользователь:** `demo` / `demo` * **Привилегированная учётная запись (финальный шаг):** `admin` / `SuperSecret`

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

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

File Upload: Path Traversal в имени файла

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

+60 XP
Python Pro
Exploit Fix
Обложка лабы: File Upload: Webshell через загрузку в templates/ Обложка лабы: File Upload: Webshell через загрузку в templates/
File Upload

File Upload: Webshell через загрузку в templates/

Загрузка документов сохраняет файлы в директорию templates/ без проверки содержимого. Просмотр файлов через render_template() позволяет выполнить Jinja2 SSTI.

+60 XP
Python Pro
Exploit Fix
Обложка лабы: File Upload: Path Traversal через имя файла Обложка лабы: File Upload: Path Traversal через имя файла
File Upload

File Upload: Path Traversal через имя файла

Загрузка аватара использует оригинальное имя файла без санитизации. Подмени filename в multipart-запросе для перезаписи шаблона и получения RCE.

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: File Upload Bypass через подмену Content-Type Обложка лабы: File Upload Bypass через подмену Content-Type
File Upload

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

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

+60 XP
Go Pro
Exploit Fix