Перейти к содержимому
← Каталог python File Upload

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

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

mediumpythonPro
Задача
# File Upload: path traversal через имя файла ## Сценарий Перед вами Flask-приложение интернет-магазина SecureShop. У авторизованных пользователей есть возможность загрузить аватар в свой профиль: пользователь выбирает файл-картинку через `<input type="file">`, форма отправляет его на сервер, сервер сохраняет файл в директорию со статикой и обновляет ссылку в профиле. Реализация выглядит безобидно, но имеет типовую ошибку обработки загруженных файлов: имя файла, которое сервер использует для сохранения на диск, **берётся из метаданных загрузки клиентского файла** (то есть полностью контролируется атакующим — этот заголовок ставит сам браузер/HTTP-клиент, и в нём может быть **что угодно**), и далее без какой-либо санитизации передаётся в функцию склейки путей и в запись на диск. Это классический канал path traversal: атакующий выбирает имя со специальными последовательностями (`../..`), и итоговый путь сохранения **выходит** за пределы публичной директории статики — записывает файл, например, в директорию серверных шаблонов фреймворка. В Flask по конвенции директория `templates/` — это место, откуда сервер отдаёт контент при рендеринге, в том числе системные шаблоны вроде страницы ошибки 404. Если атакующий перезапишет такой шаблон собственным содержимым (HTML, опционально с динамическими элементами), любой запрос на ненайденный URL будет отдавать этот подложенный контент. ## Цели 1. Найдите форму загрузки аватара в профиле и определите, какой каталог сервер использует для сохранения файлов в штатном (нормальном) сценарии. 2. Подтвердите, что имя загружаемого файла попадает в путь сохранения **без санитизации**: подайте имя файла с traversal-последовательностью и проверьте, **где** реально оказался файл на сервере (или эмпирически — через попытку обратиться к ожидаемому новому пути). 3. Через path traversal в имени загружаемого файла **перезапишите** один из стандартных шаблонов фреймворка (например, шаблон ошибки 404). Подтвердите успех: запросите заведомо несуществующий URL и убедитесь, что сервер отдаёт **ваше** содержимое вместо штатной страницы ошибки. ## Данные | Параметр | Значение | |----------|----------| | Обычный пользователь | `demo` / `demo` |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru