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-ін’єкція, Відповідальне розкриття