EMZETT.
Войти

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-инъекция, Ответственное раскрытие