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

image

Введение в уязвимость 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.

image

Пример 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 — критическая уязвимость. Даже при применении защит могут оставаться лазейки, особенно если защита реализована поверхностно или с ошибками.