Источник: https://github.com/AnaktaCTF/CTF/blob/main — WEB/Path traversal.md

Введение в уязвимость Path Traversal
Path Traversal (или Directory Traversal) — это уязвимость, которая может серьёзно угрожать безопасности веб-приложений. Она позволяет атакующим манипулировать входными данными (например, параметрами URL или форм), чтобы обойти ограничения доступа к файлам. Это может привести к:
- доступу к конфиденциальным файлам;
- утечке баз данных;
- выполнению произвольного кода (в некоторых случаях).
Основы работы Path Traversal
Когда веб-приложение получает параметры, указывающие на файл, злоумышленник может изменить путь, чтобы выйти за пределы разрешённой директории. Обычно используются символы вида ../.
Пример уязвимости:
Приложение позволяет скачать отчёт:
http://example.com/download?file=report.pdf
Сервер формирует путь так:
/var/www/html/files/report.pdf
Атакующий меняет параметр file:
http://example.com/download?file=../../../../etc/passwd
Результат: попытка загрузить системный файл /etc/passwd.
Символы и методы обхода в Path Traversal
Чтобы обойти защиту, используются различные символы и кодировки:
../— переход на уровень выше.../../— два уровня вверх и т.д...\..\— для Windows.%2e%2e%2f— URL-кодированный вариант../.%2e%2e%2c%2e%2e%2f— комбинированный обход фильтров./..//или\..\..\— перемешивание слэшей.
Пример:
http://example.com/download?file=%2e%2e%2f%2e%2e%2fetc%2fpasswd
Подробные примеры эксплуатации
Пример 1: Скачивание файлов
Приложение позволяет пользователю скачать отчёт:
http://example.com/download?file=report.pdf
Ожидается, что путь на сервере будет:
/var/www/app/reports/report.pdf
Атакующий подставляет:
http://example.com/download?file=../../../../etc/shadow
Если сервер не фильтрует путь, он попытается открыть /etc/shadow.

Пример 2: Просмотр изображений
http://example.com/show?img=photo.jpg
Злоумышленник подставляет:
http://example.com/show?img=../../../.env
Это может раскрыть переменные окружения, включая ключи и пароли.
Пример 3: API-доступ к произвольным документам
API принимает путь:
POST /api/get-document
BODY: { "path": "invoices/2023.pdf" }
Атакующий:
{
"path": "../../config/database.yml"
}
Результат — раскрытие файла конфигурации базы данных.
Пример 4: Загрузка файлов
POST /upload?file=myphoto.png
Злоумышленник:
POST /upload?file=../../../../var/www/html/shell.php
Если файл сохраняется без валидации пути — возможна загрузка WebShell и выполнение команд.
Как находить уязвимость Path Traversal
Шаг 1: Определение потенциальных точек
Проверьте параметры, связанные с доступом к файлам:
file=,path=,img=,template=,name=,download=,upload=,url=
Эти параметры могут встречаться в URL, теле POST-запросов или JSON.
Шаг 2: Подстановка полезных нагрузок
Пробуйте вставить типичные payload:
../etc/passwd../../../../windows/win.ini%2e%2e%2f%2e%2e%2fetc%2fpasswd%252e%252e%252fetc%252fpasswd— двойное кодирование
Следите за реакцией сервера:
- ошибки (500, 403, 404);
- неожиданные данные;
- утечки системных файлов.
Шаг 3: Использование словарей и fuzzing
Применяйте инструменты:
- SecLists (набор
path-traversal.txt); - ffuf, Burp Intruder, dirsearch — для автоматизации перебора.
Шаг 4: Проверка поведения с символическими ссылками
Если есть возможность загрузки файлов — попробуйте загрузить символическую ссылку на файл, например:
ln -s /etc/passwd symlink.txt
и загрузить symlink.txt как изображение или документ.
Шаг 5: Логические тесты
Иногда стоит попробовать переходы вверх в пути:
..%5c..%5c..%5c(Windows)/../../../../../proc/self/environ
Или проверить, может ли сервер раскрыть .git/config, .htaccess, WEB-INF/web.xml.
Методы защиты от Path Traversal
1. Очистка входных данных
Проверяйте путь на наличие ../, ..\ и других шаблонов:
import re
if re.search(r'(\.\./|\\\.\.\\)', user_input):
raise ValueError("Invalid path traversal attempt")
2. Абсолютные пути
Используйте безопасное соединение путей:
import os
base_dir = '/var/www/html/uploads/'
file_path = os.path.join(base_dir, user_input)
if not file_path.startswith(base_dir):
raise ValueError("Invalid path traversal attempt")
3. Безопасные API
В Node.js:
const path = require('path');
let safePath = path.resolve(__dirname, 'uploads', user_input);
4. Ограничение прав доступа
Разрешайте доступ только к конкретным директориям (например, /uploads/).
5. Логирование и мониторинг
import logging
logging.basicConfig(filename='file_access.log', level=logging.INFO)
logging.info(f"File access attempt: {user_input}")
6. Белые списки
allowed_files = ['report.pdf', 'image.jpg']
if user_input not in allowed_files:
raise ValueError("Invalid file access attempt")
Возможные обходы защит
1. Байпас фильтрации ../
Если фильтруется ../, попробуйте:
..%2f,..%5c,.%2e/- Двойное кодирование:
%252e%252e%252f - Юникод:
..%c0%af,..%e0%80%af
2. Обход реального пути
Если используется realpath, но нет проверки принадлежности директории, это бесполезно.
# Неправильно:
path = os.path.realpath("/uploads/" + user_input)
Если user_input = ../../etc/passwd, путь всё равно будет валиден.
3. Символические ссылки
Атакующий может загрузить symlink на системный файл:
ln -s /etc/passwd fake.jpg
И передать fake.jpg в параметре — если приложение работает с symlink без проверки.
4. Случайная ошибка разработчика
- Использование
os.path.join()без проверкиstartswith()на базовую директорию. - Ошибки в normalize path — например, замена
../на пустую строку, не предотвращает../../../../etc/passwd.
Заключение
Path Traversal — критическая уязвимость. Даже при применении защит могут оставаться лазейки, особенно если защита реализована поверхностно или с ошибками.