Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
stirling-storage-folder-idor — Stirling-PDF v3.2.0 — высокий уровень — удалённая — IDOR — перечисление корня хранилища processing-folder и перезапись PDF-файлов других пользователей | Kitploit
Инструменты/GitHubGitHub/abraxas/stirling-storage-folder-idor
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеЛаборатории и Практика
GitHubabraxas/stirling-storage-folder-idor

stirling-storage-folder-idor

Stirling-PDF v3.2.0 — высокий уровень — удалённая — IDOR — перечисление корня хранилища processing-folder и перезапись PDF-файлов других пользователей

Репозиторий
31 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Abraxas Labs - stirling-storage-folder-idor

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  stirling-storage-folder-idor

stirling-storage-folder-idor

Stirling-PDF 3.2.0 — Stirling Tools

Класс: IDOR. Доступ: удалённо, ROLE_USER.

POST /api/v1/processing-folders не имеет @PreAuthorize помимо требования авторизованного пользователя. FolderAccessGuard подразумевает весь локальный basePath хранилища (./storage), даже когда policies.allowedFolderRoots пуст. LocalStorageProvider записывает {ownerId}/{uuid}_{filename}. Пользователь с ROLE_USER может указать directory: "storage/<victimUserId>", получить список PDF-файлов этого владельца и перезаписать их на месте с replace=true.

Прямой /api/v1/storage/files/{id} пропатчен (findByIdAndOwner). GET файла жертвы от имени другого пользователя в лаборатории возвращает 403. Остаётся неявный корень processing-folder, а не CRUD API хранилища.

Пользователь с ROLE_USER получает список имён сохранённых PDF-файлов другого пользователя и перезаписывает эти блобы. Скачивание жертвой возвращает подменённый файл.

IDCVE пока нет
CWECWE-639 / CWE-73
CVSS7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N
ПродуктStirling-PDF
Затронутоv3.2.0 (a7e593728dd9aa81e75318a949789d3c2e9ee754), образ stirlingtools/stirling-pdf:3.2.0-fat, login-on, storage.enabled=true
АутентификацияROLE_USER в команде по умолчанию
ЛицензияGNU Affero GPL v3.0
Лабораториятолько 127.0.0.1:18154

Продолжение серии Stirling-PDF v3.2.0 leftovers. Смежный материал: stirling-h2-import-leftover (H2 CREATE OR REPLACE ALIAS). Этот пакет посвящён IDOR в хранилище.

Что может сделать атакующий

Любой авторизованный пользователь ROLE_USER при login-on proprietary/fat с включённым локальным хранилищем (по умолчанию в шаблоне). Официальный compose использует login-off плюс DISABLE_ADDITIONAL_FEATURES=true; при таком развёртывании /api/v1/storage возвращает 403, а этот контроллер отсутствует. Развёртывание HIT — это шаблон login-on плюс fat.

Таблица привилегий (исчерпывающая). Тот же уровень, что и Signal-Server Dropwizard admin.

ОсьМетод + путьДаётПроисхождение
РазведкаROLE_USER GET /api/v1/user/usersЧисловой userId для admin, другого пользователя и STIRLING-PDF-BACKEND-API-USERПодтверждено в лаборатории
РазведкаPOST /api/v1/processing-folders {directory:"storage/1"}, затем GET /api/v1/processing-folders/{id}/filesИмя, размер, mtime сохранённого PDF-файла admin (5341de35-8729-49cf-92d0-c8284e05bfc5_victim-lab.pdf)Подтверждено в лаборатории
ЦелостностьPOST /api/v1/processing-folders/{id}/sweep с /api/v1/security/add-watermark, затем Range GET /api/v1/storage/files/1/download от имени жертвыПерезапись на месте. Ответ жертвы 206 / 3450 байт содержит STIRLING-STORAGE-FOLDER-IDOR-WITNESSПодтверждено в лаборатории (replace=true)
Конфиденциальностьтот же sweep плюс командный outputId / исходящий шаг, который атакующий может прочитатьКопия байтов PDF-файла жертвыПредположительно. Не требуется для перечисления/перезаписи

Остаётся закрытым на этой фиксации

ОсьМетод + путьПочему закрыто
РазведкаGET /api/v1/storage/files/{id} для нерасшаренного файла403 Access denied. Доказано в лаборатории на файле с id 1
Разведканеаутентифицированный /api/v1/storage/**403, когда вход отключён (ensureStorageEnabled)
ЦелостностьCRUD папок по UUID между владельцамиfindByIdAndOwner
ЦелостностьLocalStorageProvider .. / абсолютный ключPath.startsWith(basePath) после нормализации
Целостностьultra-lite образпроприетарный контроллер папок обработки отсутствует

GET /api/v1/user/users со списком STIRLING-PDF-BACKEND-API-USER — это дополнительный IOC. Я не оформлял его как отдельный leftover. Скачивание жертвы без Range даёт 500 после перезаписи, потому что FileStorageController по-прежнему сообщает исходный sizeBytes из БД. Range работает. Текст водяного знака — Identity-H в FlateDecode; оракул распаковывает потоки.

Как я это нашёл

В 3.x появились локальное хранилище и папки обработки. CRUD хранилища ограничен владельцем. FolderAccessGuard.serverStorageRoots возвращает Path.of(basePath) для всего дерева, а не basePath/{currentUserId}. storage/<victimId> проходит startsWith для этого подразумеваемого корня.

Лаборатория создаёт peeruser с ROLE_USER, загружает PDF жертвы от имени администратора, доказывает 403 при прямом GET хранилища, направляет папку обработки на storage/1, получает имя с префиксом UUID, подбирает водяной знак, а затем скачивает через Range от имени жертвы.

Неверные пути: считать прямой IDOR хранилища всё ещё открытым (403); считать официальный compose с отключённым входом за HIT-развёртывание (хранилище 403, контроллер отсутствует); заявлять о читаемой атакующим побайтовой копии без outputId.

Лаборатория

python3 stirling-storage-folder-idor-Abraxas-Labs.py

или

cd lab
./run.sh

Цель — только http://127.0.0.1:18154. Образ stirlingtools/stirling-pdf:3.2.0-fat. Требуется Docker. Вход включён. Лаунчер выполняет chdir в lab/ и запускает run.sh.

IOC direct-storage-get http=403
IOC processing-folders-save directory=storage/1 http=202
IOC listed-peer ... victim-lab.pdf
IOC victim-download attempt=1 http=206 bytes=3450 witness=1
SUCCESS stirling-storage-folder-idor direct-storage-403=yes listed-peer-pdf=yes download-has-witness=yes STIRLING-STORAGE-FOLDER-IDOR-WITNESS

Исправление

Ограничьте подразумеваемый корень хранилища до basePath/{currentUserId} для диска directory на многопользовательских серверах. Отклоняйте storage/<otherId> так же, как findByIdAndOwner уже отклоняет чужие идентификаторы файлов. Пересчитывайте объявленный sizeBytes после перезаписи на месте.

Повторно запустите loopback-клиент против исправленной сборки: directory=storage/1 от имени peeruser должен возвращать 403, а список peer-пользователей должен оставаться пустым.

До тех пор не считайте, что «я исправил /api/v1/storage/files/{id}» означает «я ограничил каждый API, принимающий путь к диску в ./storage».

Ссылки

Скачать инструмент