Перейти к содержимому

Поиск по платформе

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

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

Автор: Hack & Fix
Освоишь: filepath.Cleanchroot-подобиеbasename-фильтр
Средне+60 XP ~30 мин php
CWE-22 · A01:2021 Pro
Обложка: Path Traversal: абсолютные пути обходят blacklist Обложка: Path Traversal: абсолютные пути обходят blacklist
Задача
# Path Traversal (обход blacklist через абсолютный путь) ## Сценарий **CloudMetrics** — SaaS-платформа бизнес-аналитики. Для клиентов там работает «Центр загрузки»: прайс-листы тарифов, changelog релизов, годовой отчёт скачиваются из отдельного каталога. После прошлогоднего тренинга по безопасной разработке программист CloudMetrics добавил в эндпоинт скачивания защиту: запросы, в которых имя файла содержит маркер перехода в родительский каталог, стали отвергаться. Внутренняя проверка такой запрос действительно блокирует, и команда считает вопрос закрытым. Вас пригласили на независимый аудит: у заказчика есть подозрение, что фильтр закрывает не все способы адресовать файл. ## Цель 1. Изучите эндпоинт скачивания из Центра загрузки и подтвердите, что относительный обход каталогов действительно блокируется защитой. 2. Найдите способ записать путь к файлу вне каталога загрузок, не используя запрещённый маркер, и подтвердите чтение на безопасной системной цели. 3. Прочитайте переменные окружения серверного процесса и извлеките из них значение флага лабораторной работы. ## Теория Blacklist-защита перечисляет «плохие» конструкции и блокирует их появление во вводе. Против неё работает наблюдение: в Unix-подобных системах путь к одному и тому же файлу записывается минимум двумя нотациями — относительной, от текущего каталога с переходами вверх, и абсолютной, от корня файловой системы. Фильтр, обученный только одной нотации, вторую пропускает целиком. **Уязвимый паттерн:** ```php if (str_contains($name, '..')) { /* 403 */ } $filePath = $name; if ($name[0] !== '/') { $filePath = __DIR__ . '/../../downloads/' . $name; } echo file_get_contents($filePath); ``` Перед чтением файла код проверяет единственную подстроку — маркер перехода в родительский каталог. Но если имя начинается с разделителя корня, ветка склейки с каталогом загрузок не выполняется вовсе: значение уходит в функцию чтения как готовый абсолютный путь. Записанный от корня путь не содержит ни одного запрещённого маркера — фильтр «доволен», а сервер открывает файл где угодно в файловой системе. В Linux переменные окружения процесса видны как специальный виртуальный файл этого же процесса — это дорога к секретам, заданным при старте контейнера. ## Точка входа атаки `GET /download?name=<имя_файла>` — публичный эндпоинт Центра загрузки; аутентификация не требуется. Легитимный пример: `?name=report-2024.txt`. Список доступных файлов показан на странице `/download-center`. * **Обычный пользователь (для навигации по приложению):** `demo` / `demo`

Похожие лабораторные (4)

другие лабы по этой уязвимости
Обложка лабы: Path Traversal в загрузке файлов Обложка лабы: Path Traversal в загрузке файлов
Path Traversal

Path Traversal в загрузке файлов

Обход пути через параметр file в эндпоинте загрузки файлов (PHP).

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: Path Traversal через обход нормализации пути Обложка лабы: Path Traversal через обход нормализации пути
Path Traversal

Path Traversal через обход нормализации пути

Нормализация пути применяется ДО конкатенации с базовым каталогом — traversal-последовательности сохраняются после Clean, позволяя читать произвольные файлы.

+90 XP
PHP Pro
Exploit Fix
Обложка лабы: Path Traversal (Иллюзия filepath.Clean) Обложка лабы: Path Traversal (Иллюзия filepath.Clean)
Path Traversal

Path Traversal (Иллюзия filepath.Clean)

Обход неумелого использования функции filepath.Clean.

+60 XP
Go Pro
Exploit Fix
Обложка лабы: Path Traversal: чтение произвольных файлов через абсолютный путь Обложка лабы: Path Traversal: чтение произвольных файлов через абсолютный путь
Path Traversal

Path Traversal: чтение произвольных файлов через абсолютный путь

Эндпоинт скачивания изображений склеивает имя файла с базовой директорией через path.resolve. Из-за поведения path.resolve абсолютный аргумент отбрасывает базовый путь — атакующий читает любой файл сервера.

+60 XP
Node.js Pro
Exploit Fix