Глоссарий

Что такое path traversal — чтение файлов, которые сервер не должен отдавать, через ../

Path traversal подмешивает ../ во ввод имени файла, чтобы читать файлы вне нужной папки: .env, конфиги, ключи. Как это работает и как защититься.

Опубликовано 2026-06-10 Обновлено 2026-10-06 6 мин чтения
На этой странице

Path traversal — это когда подстановка ../ в поле имени файла делает читаемым файл .env, глубоко лежащий на сервере. Вот как он работает и как его надёжно предотвратить (без шагов атаки).

Где он встречается

Везде, где «пользовательский ввод выбирает файл».

ФункцияОпасное использование
Скачивание / предпросмотрИспользование ?file= напрямую как имени файла
Показ изображения / вложенияПостроение части пути из параметра URL
ЗагрузкаИспользование имени от пользователя в пути сохранения (тип записи — самый опасный)
Загрузка шаблона / локалиДинамический выбор файла через ?lang= и т. п.

Почему это работает

../ означает «на уровень вверх». Если приложение склеивает публичную папку + пользовательский ввод и открывает этот файл, накопленные сегменты ../ позволяют запросу добраться до файлов вне публичной папки.

Задумано: /var/www/files/ + пользовательский ввод
Ввод накапливает «уровень вверх» (../ ../ ../ …)
↓ приложение склеивает без нормализации, затем open()
Достигает за пределы базы (.env, конфиги, ключи, /etc) = чтение/запись
Склейте пользовательский ввод с базовой папкой, и накопленные ../ дотянутся до файлов вне её.

Чтение означает раскрытие; запись (загрузки) означает файлы, подброшенные куда угодно, что может привести к RCE.

Защита: не использовать ввод как путь + ограничивать базой

1

Никогда не используйте ввод как сырой путь (самое важное)

Разрешайте доступ к открытым файлам через allowlist «ID → реальный файл». Пользователь передаёт только идентификатор («3», «invoice»); сервер сам решает реальный путь.

2

Нормализуйте, затем проверяйте, что путь остаётся внутри базового каталога

Превратите его в абсолютный путь резолвером языка (resolve/realpath), затем проверьте, что он начинается с разрешённого базового каталога. Отклоняйте всё, что снаружи. Наивное вырезание строки '../' падает перед обходами через кодирование.

3

Запускайте приложение с минимальными привилегиями

Ограничьте файлы, которые может читать пользователь среды выполнения приложения, тем, что нужно для задачи. Даже если кто-то выберется, нечитаемые файлы ничего не раскроют.

4

Полностью держите секреты вне публичного корня

Не размещайте .env, .git, ключи или резервные копии в корне сайта или папке загрузок в принципе. Одно лишь правильное размещение убирает то, что можно атаковать.

Мнение этого сайта: это проблема того же рода, что и ошибки размещения, поэтому исправляйте в правильном порядке

Path traversal — проблема того же рода, что и инцидент с раскрытием .env: оба про «то, что никогда не должно быть достижимо через веб, становится достижимым через веб». Временные меры (заголовки, наивные фильтры) лишь маскируют проблему; если код и размещение не исправлены, другой путь всё равно утечёт. Порядок таков: (1) код, не использующий ввод как путь, (2) ограничение базовым каталогом, (3) держать секреты вне публичного корня. Читайте безопасное размещение на shared-хостинге вместе с этим, чтобы увидеть, как выглядит корневое исправление.

Чем это отличается от похожих проблем

Результат может выглядеть одинаково — «файл, который должен быть закрыт, читается снаружи», — но от причины зависит, где исправлять.

ПроблемаПричинаГде исправлять
Path traversalВвод, указывающий на файл, может выйти за пределы разрешённого местаКод приложения (не использовать ввод как путь)
Локальное включение файлов (LFI)Ввод выбирает файл, который программа загружает и выполняетКод приложения (зафиксировать, какие файлы можно загружать)
Файлы, оставленные в публичном каталоге.env или .git лежит там, где его видно из веба (→ секреты, оставленные в публичных каталогах)Размещение файлов и настройки веб-сервера
IDORID файла имеет правильный формат, но может указывать на чужой файлПроверки прав в приложении

Реальные примеры: уязвимости в самом веб-сервере

Path traversal находят не только в самописных приложениях, но и в широко используемых продуктах.

  • Apache HTTP Server 2.4.49 (2021): в нём была уязвимость path traversal (CVE-2021-41773), и проект Apache сообщил, что она эксплуатируется в реальных атаках. Версия 2.4.50 её исправила, но исправление оказалось неполным (CVE-2021-42013), поэтому её исправили снова в 2.4.51. В зависимости от настроек это вело не только к чтению файлов, но и к RCE.
  • Ядро WordPress (2026): path traversal в коде, который определяет шаблоны страниц, привёл к уязвимости включения файлов (CVE-2026-87902), способной при определённых условиях дойти до RCE (→ разбор CVE-2026-87902, на английском).

В мае 2024 года американские CISA и ФБР выпустили предупреждение с призывом к производителям устранить этот класс уязвимостей. По их словам, на тот момент в KEV агентства CISA (списке уязвимостей с подтверждённой эксплуатацией) было 55 уязвимостей directory traversal. В «CWE Top 25» MITRE, опубликованном в декабре 2025 года, path traversal (CWE-22) стоит на шестом месте.

Как проверить свой сайт

1

Найдите файловые операции, принимающие ввод

Поищите в коде функции, которые открывают или отдают файлы (open, readFile, sendFile, include и т. п.) или строят пути (path.join и подобные), куда могут попасть значения из запроса.

2

Проверьте порядок проверок

Там, где используется ввод, убедитесь, что путь сначала нормализуется (path.resolve или realpath) и лишь затем проверяется, что он внутри базового каталога. Если код проверяет строку только до нормализации, исправьте порядок.

3

Проверьте версии веб-сервера и продуктов

Убедитесь, что у вас не работают версии с известным path traversal, например Apache 2.4.49 или 2.4.50. «Поиск CVE / KEV» покажет известные уязвимости в используемых продуктах.

4

Проверьте, нет ли файлов, которые не должны быть видны

С помощью аудита сайта проверьте, что .env, .git и дампы базы данных нельзя прочитать снаружи. Если можно, исправьте размещение — это отдельная задача от path traversal.

Источники (первичные)

  • CISA и ФБР, «Secure by Design Alert: Eliminating Directory Traversal Vulnerabilities in Software» (2 мая 2024 г.) — cisa.gov (55 записей в KEV, использование случайных идентификаторов)
  • Apache HTTP Server, «Apache HTTP Server 2.4 vulnerabilities» — httpd.apache.org (CVE-2021-41773, CVE-2021-42013)
  • MITRE, «2025 CWE Top 25 Most Dangerous Software Weaknesses» (декабрь 2025 г.) — cwe.mitre.org (CWE-22 на шестом месте)
  • OWASP, «Path Traversal» — owasp.org
  • IPA, «How to Secure Your Web Site» — ipa.go.jp (на японском; непроверенные параметры пути / directory traversal)

Читать дальше

Классификация

CWE классифицирует типы слабостей, из-за которых возникают уязвимости; MITRE ATT&CK классифицирует техники атакующих. Обе системы ведёт MITRE, и они широко используются для разметки уязвимостей и правил обнаружения.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QЧто утекает при path traversal?
A

Файлы, которые приложение никогда не должно было раскрывать: .env (учётные данные БД, API-ключи), конфигурационные файлы, закрытые ключи, исходный код, системные пути вроде /etc. Помимо чтения, если он достигает пути назначения загрузки, он может писать куда угодно и эскалировать до RCE (удалённого выполнения кода).

QКакая защита главная?
A

Никогда не используйте пользовательский ввод как сырой путь к файлу. Если приходится — отображайте его через allowlist (фиксированный набор ID/имён файлов), нормализуйте путь библиотекой и проверяйте, что результат остаётся внутри разрешённого базового каталога. Проверки расширения или наивное вырезание '../' обходятся.

QМожно ли просто заблокировать это через .htaccess или заголовки?
A

Это временная мера для другой проблемы (чувствительные файлы, лежащие в корне сайта). Корневое исправление — размещение тела приложения, .env и .git ВНЕ публичного корня плюс код, не использующий ввод как путь. Временная мера и корневое исправление — разные задачи.

QDirectory traversal и path traversal — одно и то же?
A

Да. Руководство японского IPA называет это directory traversal, а классификация MITRE (CWE-22) — Path Traversal. Оба термина означают, что ввод, указывающий на файл, дотягивается до файлов вне разрешённого места.

QПомогает ли выдача файлам случайных ID?
A

Это эффективный подход. В предупреждении от мая 2024 года американские CISA и ФБР рекомендуют генерировать для каждого файла случайный идентификатор, а связанные сведения, например исходное имя, хранить отдельно. Тогда пользовательский ввод никогда не становится частью пути, и этому классу уязвимостей просто негде возникнуть.

QЧем это отличается от локального включения файлов (LFI)?
A

Path traversal означает, что можно читать или писать файлы вне разрешённого места. LFI означает, что ввод выбирает файл, который программа загружает и выполняет, и path traversal часто используют, чтобы указать на файл снаружи. Поскольку при LFI файл выполняется как код, а не просто читается, это легче приводит к RCE.