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

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

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

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

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

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

другие лабы по этой уязвимости
Обложка лабы: 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: Обход расширений и 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