Path traversal — это когда подстановка ../ в поле имени файла делает читаемым файл .env, глубоко лежащий на сервере. Вот как он работает и как его надёжно предотвратить (без шагов атаки).
Где он встречается
Везде, где «пользовательский ввод выбирает файл».
| Функция | Опасное использование |
|---|---|
| Скачивание / предпросмотр | Использование ?file= напрямую как имени файла |
| Показ изображения / вложения | Построение части пути из параметра URL |
| Загрузка | Использование имени от пользователя в пути сохранения (тип записи — самый опасный) |
| Загрузка шаблона / локали | Динамический выбор файла через ?lang= и т. п. |
Почему это работает
../ означает «на уровень вверх». Если приложение склеивает публичную папку + пользовательский ввод и открывает этот файл, накопленные сегменты ../ позволяют запросу добраться до файлов вне публичной папки.
Чтение означает раскрытие; запись (загрузки) означает файлы, подброшенные куда угодно, что может привести к RCE.
Защита: не использовать ввод как путь + ограничивать базой
Никогда не используйте ввод как сырой путь (самое важное)
Разрешайте доступ к открытым файлам через allowlist «ID → реальный файл». Пользователь передаёт только идентификатор («3», «invoice»); сервер сам решает реальный путь.
Нормализуйте, затем проверяйте, что путь остаётся внутри базового каталога
Превратите его в абсолютный путь резолвером языка (resolve/realpath), затем проверьте, что он начинается с разрешённого базового каталога. Отклоняйте всё, что снаружи. Наивное вырезание строки '../' падает перед обходами через кодирование.
Запускайте приложение с минимальными привилегиями
Ограничьте файлы, которые может читать пользователь среды выполнения приложения, тем, что нужно для задачи. Даже если кто-то выберется, нечитаемые файлы ничего не раскроют.
Полностью держите секреты вне публичного корня
Не размещайте .env, .git, ключи или резервные копии в корне сайта или папке загрузок в принципе. Одно лишь правильное размещение убирает то, что можно атаковать.
Мнение этого сайта: это проблема того же рода, что и ошибки размещения, поэтому исправляйте в правильном порядке
Path traversal — проблема того же рода, что и инцидент с раскрытием .env: оба про «то, что никогда не должно быть достижимо через веб, становится достижимым через веб». Временные меры (заголовки, наивные фильтры) лишь маскируют проблему; если код и размещение не исправлены, другой путь всё равно утечёт. Порядок таков: (1) код, не использующий ввод как путь, (2) ограничение базовым каталогом, (3) держать секреты вне публичного корня. Читайте безопасное размещение на shared-хостинге вместе с этим, чтобы увидеть, как выглядит корневое исправление.
Чем это отличается от похожих проблем
Результат может выглядеть одинаково — «файл, который должен быть закрыт, читается снаружи», — но от причины зависит, где исправлять.
| Проблема | Причина | Где исправлять |
|---|---|---|
| Path traversal | Ввод, указывающий на файл, может выйти за пределы разрешённого места | Код приложения (не использовать ввод как путь) |
| Локальное включение файлов (LFI) | Ввод выбирает файл, который программа загружает и выполняет | Код приложения (зафиксировать, какие файлы можно загружать) |
| Файлы, оставленные в публичном каталоге | .env или .git лежит там, где его видно из веба (→ секреты, оставленные в публичных каталогах) | Размещение файлов и настройки веб-сервера |
| IDOR | ID файла имеет правильный формат, но может указывать на чужой файл | Проверки прав в приложении |
Реальные примеры: уязвимости в самом веб-сервере
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) стоит на шестом месте.
Как проверить свой сайт
Найдите файловые операции, принимающие ввод
Поищите в коде функции, которые открывают или отдают файлы (open, readFile, sendFile, include и т. п.) или строят пути (path.join и подобные), куда могут попасть значения из запроса.
Проверьте порядок проверок
Там, где используется ввод, убедитесь, что путь сначала нормализуется (path.resolve или realpath) и лишь затем проверяется, что он внутри базового каталога. Если код проверяет строку только до нормализации, исправьте порядок.
Проверьте версии веб-сервера и продуктов
Убедитесь, что у вас не работают версии с известным path traversal, например Apache 2.4.49 или 2.4.50. «Поиск CVE / KEV» покажет известные уязвимости в используемых продуктах.
Проверьте, нет ли файлов, которые не должны быть видны
С помощью аудита сайта проверьте, что .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)
Читать дальше
- Инцидент: Раскрытие всего файла .env
- Защита: Защита .env на shared-хостинге · Глоссарий: Что такое RCE