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

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

File Upload: Content-Type Bypass

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

Автор: Hack & Fix
Освоишь: magic-bytes проверкаrandom filenameвне docroot
Средне+60 XP ~32 мин php
CWE-434 · A04:2021 Pro
Обложка: File Upload: Content-Type Bypass Обложка: File Upload: Content-Type Bypass
Задача
# Небезопасная загрузка файлов: подмена типа содержимого ## Сценарий Вы проводите аудит фотосообщества «Фотополка» (нативный PHP, Apache) перед открытием публичной регистрации. Пользователи загружают снимки в профиль, загрузчик закрыт белым списком расширений изображений, и разработчик уверен, что этого достаточно. Модератор пожаловался на «странный файл с расширением картинки», который открылся как страница, — вам поручили проверить загрузчик до запуска. ## Цель 1. Изучите проверки загрузчика: что валидируется — имя файла или содержимое? Загрузите файл, который проходит фильтр, но изображением не является. 2. Откройте прямую ссылку на загруженный файл так, чтобы браузер исполнил его как разметку домена приложения, и подтвердите выполнение внедрённого кода. 3. Смоделируйте последствия кражи сессии: войдите привилегированной учётной записью, купите товар «CTF Flag» и заберите флаг со страницы профиля. ## Теория Имя файла и его содержимое — независимые вещи: расширение полностью контролируется клиентом. В этой лабе сервер проверяет только расширение, а при отдаче файла объявляет тип ответа по тому же расширению и не запрещает браузеру самостоятельно определять содержимое. **Уязвимый паттерн:** ```php $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp'], true)) { /* отклоняем */ } // ...при отдаче файла: ini_set('default_mimetype', ''); header_remove('Content-Type'); // тип не заявляется вовсе; запрет сниффинга не выставлен ``` Когда ответ не содержит ни заголовка `Content-Type`, ни запрета на определение типа, браузер вынужден анализировать первые байты тела: видит разметку HTML и исполняет её в контексте домена как полноценную страницу. Документ с внедрённым скриптом, сохранённый под видом картинки, становится хранимым XSS на доверенном домене — исполнившись в браузере другого пользователя, скрипт способен украсть его сессию. ## Точка входа атаки `POST /upload` — форма загрузки на странице `/profile`, поле `file` (multipart). Прямая ссылка на сохранённый файл появляется в списке загрузок профиля. * **Обычный пользователь:** `demo` / `demo` * **Привилегированная учётная запись** (для моделирования украденной сессии): `admin` / `SuperSecret` Флаг отображается на `/profile` в карточке «CTF Flag Acquired!» после оформления заказа на товар «CTF Flag».

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

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

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

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

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: .htaccess Upload — RCE через перезапись конфигурации Apache Обложка лабы: .htaccess Upload — RCE через перезапись конфигурации Apache
File Upload

.htaccess Upload — RCE через перезапись конфигурации Apache

Загрузка .htaccess позволяет выполнять PHP-код внутри файлов с произвольным расширением.

+90 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
Обложка лабы: 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