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

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

Insecure Deserialization: YAML Unsafe Load

Автор: Hack & Fix
Освоишь: allowlist классовHMAC-подписьJSON вместо pickle/gob
Средне+60 XP ~42 мин python
CWE-502 · A08:2021 Pro
Обложка: Insecure Deserialization: YAML Unsafe Load Обложка: Insecure Deserialization: YAML Unsafe Load
Задача
# Небезопасная десериализация: YAML ## Сценарий Вы проводите аудит **MintRelay** — интернет-магазина на Flask. Инженер Олег добавил в личный кабинет импорт и экспорт пользовательской конфигурации: YAML показался ему идеалом — человекочитаемый, легко правится в любом редакторе, привычен администраторам. Экспорт выгружает текущие настройки, импорт принимает произвольный текст и отдаёт его парсеру. Никто не удосужился проверить, какой именно режим парсера подключён к пользовательскому вводу, — и внешний аудит поручен вам. У используемого парсера есть режимы загрузки, и один из них поддерживает расширения, выходящие далеко за рамки «формата данных»: отдельные конструкции документа в этом режиме превращаются в вызовы функций на стороне сервера. Подключён именно он — значит, кнопка «Импорт» открывает канал **Remote Code Execution**. ## Цель 1. Авторизуйтесь как обычный пользователь и найдите в личном кабинете функции экспорта и импорта конфигурации. 2. Определите, в каком режиме сервер разбирает входной YAML: ограничен ли парсер базовыми типами или поддерживает расширения для исполнения. 3. Составьте YAML-документ, который при разборе выполнит выбранную вами операцию с параметрами. 4. Прочитайте серверный секрет с флагом — результат выполнения вернётся на страницу импорта или в JSON-ответ API. ## Теория YAML сам по себе не опасен — опасен полнофункциональный режим загрузки. В нём парсер поддерживает специальные теги-конструкторы: встретив такой тег, он не читает данные, а выполняет описанное действие — например, создаёт объект или вызывает функцию с указанными аргументами. Пользовательский ввод в этом режиме фактически становится программой: атакующему достаточно записать в документ вызов нужной операции, и сервер исполнит его при разборе с правами своего процесса. **Уязвимый паттерн:** ```python data = yaml.load(yaml_content, Loader=yaml.Loader) ``` Полнофункциональный загрузчик подключён к пользовательскому вводу напрямую — без ограничений на типы и теги. ## Точка входа атаки * `POST /import-config` — поле формы `yaml_content` с текстом YAML-документа; результат отображается на странице. * `POST /api/parse-yaml` — альтернативный канал: YAML принимается телом запроса, ответ приходит в JSON. * `GET /export-config` — образец штатного документа для изучения формата. **Пользователь:** `demo` / `demo`

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

другие лабы по этой уязвимости
Обложка лабы: Deserialization: unserialize() без allowed_classes Обложка лабы: Deserialization: unserialize() без allowed_classes
Deser

Deserialization: unserialize() без allowed_classes

Cookie user_prefs десериализуется через unserialize() — подделайте объект с магическим __wakeup() и получите админские права.

+60 XP
PHP Pro
Exploit Fix
Обложка лабы: PHP Deserialization: Phar RCE через Phar::getMetadata() Обложка лабы: PHP Deserialization: Phar RCE через Phar::getMetadata()
Deser

PHP Deserialization: Phar RCE через Phar::getMetadata()

Эндпоинт просмотра инвойсов пытается «прочитать структурированные метаданные» и вызывает Phar::loadPhar() + getMetadata() на пути из параметра без проверки расширения. Атакующий загружает PHAR-архив под видом .jpg с объектом InvoiceCache в metadata — getMetadata() делает unserialize(), триггерит __destruct() → system() → RCE.

+90 XP
PHP Pro
Exploit Fix