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 |
| Дополнительный системный артефакт | стандартный системный файл с информацией о пользователях |