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