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

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

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

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

Автор: Hack & Fix
Освоишь: magic-bytes проверкаrandom filenameвне docroot
Средне+60 XP ~32 мин python
CWE-434 · A04:2021 Pro
Обложка: File Upload: Path Traversal в имени файла Обложка: File Upload: Path Traversal в имени файла
Задача
# Загрузка файлов: path traversal в имени файла ## Сценарий Вы проводите аудит **CopperCrate** — интернет-магазина на Flask. В профиле каждого покупателя есть загрузка аватара: файл выбирается в форме, отправляется на сервер, сохраняется в каталог статики, и профиль получает новую ссылку. Фронтендер Мила написала обработчик за один вечер и уверена, что «картинка всего лишь кладётся в папку». Поводом для аудита стал инцидент: DevOps нашёл в каталоге серверных шаблонов файл, который туда никто не клал. Причина быстро локализуется: имя, под которым сервер сохраняет файл, берётся из метаданных загрузки — а их полностью контролирует клиент. Дальше имя без очистки попадает в склейку путей и запись на диск. Это открывает классический **path traversal**: путь сохранения выходит за пределы каталога загрузок, и атакующий получает возможность перезаписывать файлы в дереве приложения. ## Цель 1. Авторизуйтесь как обычный пользователь, найдите форму загрузки аватара и определите, в какой каталог сервер кладёт файлы в штатном сценарии. 2. Подтвердите, что имя из метаданных загрузки попадает в путь сохранения без очистки: подайте имя с последовательностями перехода вверх по дереву каталогов и проверьте, где реально оказался файл. 3. Перезапишите один из стандартных шаблонов фреймворка — страницу ошибки — и подтвердите подмену: запрос несуществующего адреса должен отдать ваше содержимое. 4. Заберите флаг через встроенный сценарий магазина: войдите привилегированной учётной записью, купите товар **CTF Flag** — значение появится в профиле. ## Теория При загрузке файла браузер сам формирует метаданные части multipart-запроса, включая имя файла. HTTP-клиент атакующего формирует их так же свободно, как любой другой ввод. Если сервер использует это имя в пути записи, каталог сохранения перестаёт быть границей: последовательности перехода вверх, вставленные в имя, приводят итоговый путь в любую точку файлового дерева с правами серверного процесса. Проверка расширения здесь не помогает — она смотрит на конец той же контролируемой строки. **Уязвимый паттерн:** ```python filename = file.filename file.save(os.path.join(UPLOAD_DIR, filename)) ``` Имя из метаданных загрузки без очистки участвует в построении пути записи на диск. ## Точка входа атаки `POST /profile/upload-avatar` — multipart-форма с полем файла `avatar` и CSRF-токеном страницы профиля. * **Обычный пользователь:** `demo` / `demo` * **Привилегированная учётная запись (финальный шаг):** `admin` / `SuperSecret`

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

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

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

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

+30 XP
Python 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