Path Traversal: чтение произвольных файлов через абсолютный путь
Эндпоинт скачивания изображений склеивает имя файла с базовой директорией через path.resolve. Из-за поведения path.resolve абсолютный аргумент отбрасывает базовый путь — атакующий читает любой файл сервера.
mediumnodejsPro
Задача
# Path Traversal: обход проверки на `. `
## Сценарий
Перед вами Node.js/Express-приложение интернет-магазина SecureShop. Эндпоинт скачивания изображений товаров принимает имя файла из параметра запроса и возвращает содержимое из директории со статикой.
В отличие от базовой Path Traversal-уязвимости, в этой реализации разработчик уже знал про класс проблемы и **добавил защиту** — проверку, отвергающую запросы с типичной traversal-последовательностью в имени файла. Однако защита покрывает только один способ выйти за пределы публичной директории; в Node.js для построения путей файловой системы существует поведение, которое многие разработчики считают «всегда привязывающим к базе», но которое на самом деле имеет важное исключение. Это исключение и пропускает фильтр.
В корне приложения лежит файл с конфигурационными данными — именно его (или один из подобных) нужно прочитать через path-traversal, чтобы получить CTF-флаг.
## Цели
1. Найдите эндпоинт скачивания файлов и убедитесь, что классическая последовательность traversal в имени файла действительно блокируется фильтром.
2. Эмпирически найдите тип имени файла, при котором фильтр пропускает запрос, но операционная система всё-таки возвращает файл вне публичной директории.
3. Прочитайте через path-traversal CTF-флаг, лежащий в одном из файлов рядом с приложением.
## Данные
| Параметр | Значение |
|----------|----------|
| Обычный пользователь | `demo` / `demo` |