Path traversal и небезопасная загрузка файлов: как распознать и предотвратить
Коротко: При path traversal злоумышленник подмешивает в запрос файла части пути вроде ../, чтобы прочитать файлы вне разрешённой папки; небезопасные загрузки позволяют внести вредоносные файлы.
Подробнее: Веб-приложения часто читают или сохраняют файлы по вводу пользователя (/download?file=report.pdf). Если ввод без проверки встраивается в путь, file=../../etc/passwd может раскрыть системные файлы. Статья объясняет понимание и защиту для собственных приложений.
Подробности
Path traversal (обход каталогов)
../ поднимается вверх по дереву каталогов. Пример: база /var/www/files/ + ввод ../../../etc/passwd → /etc/passwd. Варианты: URL-кодирование (%2e%2e%2f), двойное кодирование, обратные слэши (..\) в Windows, абсолютные пути, нулевые байты, символические ссылки. Последствия: чтение конфигураций, ключей, исходного кода, учётных данных БД; при праве записи — даже выполнение кода.
Типичные места: эндпоинты загрузки/изображений/шаблонов, распаковка ZIP (Zip Slip: запись ../../evil), просмотрщики логов, выбор шаблона.
Защита
- Не использовать имена файлов из ввода пользователя, а ID (запись в БД → сохранённый путь) или белый список.
- Нормализовать и проверять путь: построить разрешённый путь (
Path.resolve(),realpath) и убедиться, что он начинается с базовой папки.
base = Path("/var/www/files").resolve()
target = (base / user_input).resolve()
if not target.is_relative_to(base):
abort(400)- Минимизировать права (процесс читает только свою папку), chroot/контейнер, файловые системы только для чтения.
- Использовать функции фреймворков (
send_from_directory), проверять записи ZIP. - Сообщения об ошибках без путей.
Небезопасная загрузка файлов
Риски: исполняемые файлы (веб-шелл PHP/JSP) в корне веба, перезапись других файлов, огромные файлы (DoS), форматы изображений и документов с вредоносным кодом (SVG со скриптом → XSS, макросы PDF/Office, полиглот-файлы), неверные типы (расширение ≠ содержимое), путь в имени файла. Защита:
- Проверять тип (magic bytes/содержимое, а не только расширение/
Content-Type), белый список форматов. - Переименовывать (случайный ID), исходное имя — только как метаданные.
- Хранить вне корня веба или отдавать через объектное хранилище (S3), без исполнения (
noexec, заголовокX-Content-Type-Options: nosniff,Content-Disposition: attachment). - Ограничение размера, ограничение частоты, антивирусная проверка, перекодирование изображений (удаляет метаданные/полезную нагрузку).
- Очищать или запрещать SVG, отдавать с отдельного домена (отдельные cookie/origin).
Тестирование и обучение
- Тестировать собственное приложение вводами с
../(юнит-тесты), статический анализ (Semgrep/CodeQL), обновления зависимостей (библиотеки распаковки). - Практиковаться легально: OWASP Juice Shop, DVWA, WebGoat, PortSwigger Academy, TryHackMe (собственная лаборатория!).
- Право: никогда не тестировать чужие системы без разрешения (§ 202a–c StGB, см. хакерское право).
- Классификация: OWASP Top 10 (нарушенный контроль доступа, инъекции, неверная конфигурация безопасности).
- Сообщать о находках через ответственное раскрытие.
См. также: OWASP Top 10, SQL-инъекция, Ответственное раскрытие