Перейти к содержимому
← Каталог php Path Traversal

Path Traversal: абсолютные пути обходят blacklist

Сервер фильтрует '..' в запросах на скачивание, но не проверяет абсолютные пути — можно читать любой файл системы.

mediumphpPro
Задача
# Лаба: Path Traversal через абсолютные пути ## Сценарий Интернет-магазин SecureShop добавил раздел «Download Center» для скачивания публичных отчётов: прайс-листы, changelog, ежегодный отчёт. Файлы лежат в каталоге `downloads/` рядом с приложением, и эндпоинт `/download?name=` отдаёт их клиенту. Разработчики помнят про path traversal: они добавили проверку, которая отвергает любые имена файлов, содержащие подстроку `..`. Тестовая попытка скачать файл с типовой относительной traversal-конструкцией действительно возвращает `403 Access denied`. Защита кажется надёжной. Однако защита неполная. Существует другой способ записать путь к произвольному файлу на сервере, **не используя `..`** ни разу. Этот способ обходит blacklist полностью и позволяет прочитать содержимое любого файла, к которому у процесса Apache есть доступ. ## Концепция атаки Path traversal классически ассоциируется с относительными путями. Защита, которая проверяет только конструкции относительного перехода, не учитывает, что в Unix-подобных системах путь к файлу можно записать ещё одним способом — указанием от корня файловой системы, без использования относительных переходов вовсе. Когда серверный код наивно конкатенирует базовую директорию с пользовательским вводом или передаёт ввод напрямую в функцию чтения файла, путь, указанный от корня, полностью игнорирует базовый каталог. Такой ввод не содержит ни одной последовательности `..` — blacklist остаётся «доволен» — но сервер открывает совершенно другой файл, далеко за пределами каталога загрузок. Это пример классической ошибки: blacklist (запретить конкретные плохие конструкции) против allowlist (разрешить только пути внутри известной директории). Blacklist всегда оставляет лазейки, потому что невозможно перечислить все способы выйти за границы. ## Цели 1. Найти эндпоинт скачивания файлов и понять, как работает фильтрация 2. Подтвердить, что классический traversal (`..`) действительно блокируется 3. Обойти blacklist через абсолютный путь и прочитать произвольный системный файл 4. Получить флаг лабораторной работы из специального файла ## Данные | Параметр | Значение | |----------|----------| | Обычный пользователь | `demo` / `demo` | | Эндпоинт скачивания | `GET /download?name=` | | Тип атаки | Path Traversal через absolute path bypass | | Защита в коде | blacklist на подстроку `..` | | Расположение флага лабы | переменная окружения `LAB_FLAG` процесса Apache | | Дополнительный системный артефакт | стандартный системный файл с информацией о пользователях |
🚧 Сайт в разработке. Полный функционал пока недоступен. Все вопросы — support@hackandfix.ru