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

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

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

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

Автор: Hack & Fix
Освоишь: magic-bytes проверкаrandom filenameвне docroot
Средне+60 XP ~32 мин nodejs
CWE-434 · A04:2021 Pro
Обложка: File Upload: Path Traversal в имени файла (Express + busboy) Обложка: File Upload: Path Traversal в имени файла (Express + busboy)
Задача
# File Upload: Path Traversal в имени файла ## Сценарий Интернет-магазин **MerchForge** продаёт мерч для IT-конференций: худи, стикеры, значки. Основатель магазина Кирилл сам дописал загрузку аватара в профиле покупателя: форма отправляет выбранную картинку на сервер, тот сохраняет файл в каталог статических изображений и подставляет ссылку в профиль. Внешне всё работает, но подрядчик, обслуживающий магазин, пожаловался: после загрузки «особого» файла страница ошибки магазина стала выглядеть странно. Владелец просит разобраться, как файл из формы покупателя оказался среди серверных шаблонов. ## Цель 1. Войдите покупателем и изучите форму загрузки аватара: куда сервер складывает файлы в штатном сценарии. 2. Докажите, что имя загружаемого файла попадает в путь сохранения без очистки, и заставьте сервер записать ваш файл за пределами каталога загрузки. 3. Перезапишите страницу ошибки 404 собственным содержимым и подтвердите подмену, открыв несуществующий адрес. 4. Получите флаг: войдите администратором магазина и оформите заказ на товар «CTF Flag». ## Теория Path Traversal в загрузке файлов возникает, когда сервер строит путь сохранения из имени, присланного клиентом. Имя файла — часть метаданных multipart-загрузки: их выставляет HTTP-клиент, и там может стоять любая строка, включая сегменты перехода в родительский каталог. Если такую строку склеить с базовым каталогом и не проверить результат, запись уйдёт выше по дереву проекта. **Уязвимый паттерн:** ```js const filename = parsed.file.filename; // имя прислал клиент const savePath = path.join(UPLOAD_DIR, filename); fs.writeFileSync(savePath, parsed.file.buffer); ``` После нормализации путь выходит за пределы каталога загрузки — например, в каталог шаблонов движка рендеринга. Перезаписав шаблон страницы ошибки, атакующий подменяет то, что сервер показывает всем посетителям магазина. ## Точка входа атаки `POST /profile/upload-avatar` — multipart-форма загрузки аватара: поле `csrf_token` (берётся со страницы профиля) и файл в поле `avatar`. * **Покупатель:** `demo` / `demo` * **Администратор:** `admin` / `SuperSecret`

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

другие лабы по этой уязвимости
Обложка лабы: File Upload: обход проверки через подделку Content-Type Обложка лабы: File Upload: обход проверки через подделку Content-Type
File Upload

File Upload: обход проверки через подделку Content-Type

Загрузчик изображений товара доверяет MIME-типу, который пришёл в заголовке Content-Type части multipart-формы. Атакующий подделывает заголовок и загружает HTML с активным контентом, выдавая его за PNG.

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