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

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

Deserialization: unserialize() без allowed_classes

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

Автор: Hack & Fix
Освоишь: allowlist классовHMAC-подписьJSON вместо pickle/gob
Средне+60 XP ~42 мин php
CWE-502 · A08:2021 Pro
Обложка: Deserialization: unserialize() без allowed_classes Обложка: Deserialization: unserialize() без allowed_classes
Задача
# Небезопасная десериализация (unserialize без ограничения классов) ## Сценарий Вы проводите аудит **СтильКод** — магазина одежды для инженеров и дизайнеров, написанного на нативном PHP. После входа приложение запоминает настройки интерфейса (тему и язык) в собственной cookie: значение — сериализованный PHP-объект, закодированный в base64. На странице профиля сервер восстанавливает объект обратно. Код-ревью перед выкаткой новой темы оформления вызвало вопрос: восстановление выполняется без ограничений, а в кодовой базе остался служебный класс с магическим методом, оставшийся от внутреннего инструментария, — его срабатывание помечает запрос как отладочный со всеми вытекающими правами. Класс нигде не используется, но автозагрузчик его подхватывает, и cookie контролируете вы. ## Цель 1. Войдите как обычный пользователь и разберитесь, как настройки профиля кодируются в cookie и как восстанавливаются на странице профиля. 2. Найдите в кодовой базе класса с магическим методом восстановления и выясните его побочный эффект. 3. Подмените cookie так, чтобы восстановился объект найденного класса: сработавший магический метод откроет на странице профиля флаг. ## Теория Десериализация в PHP — это не разбор текста в массив: интерпретатор создаёт экземпляр класса, чьё имя записано в сериализованной строке, и автоматически вызывает его магические методы. Контролируя строку в cookie, атакующий выбирает, какой класс из автозагрузки будет создан, и провоцирует исполнение побочных эффектов его магии. Если на вход подаются клиентские данные без ограничения допустимых классов, любой неиспользуемый, но опасный класс превращается в рычаг эскалации. **Уязвимый паттерн:** ```php // Cookie клиента восстанавливается в объект без ограничения классов: $restored = @unserialize(base64_decode($cookie)); ``` Достаточно, чтобы в приложении существовал класс с магическим методом, меняющим состояние запроса, — подменённое значение cookie приведёт к его вызову при следующем открытии профиля. ## Точка входа атаки `GET /profile` — страница профиля, восстанавливающая настройки из cookie `user_prefs` (base64 поверх сериализованного PHP-значения). * **Обычный пользователь:** `demo` / `demo` * **Объект атаки:** значение cookie `user_prefs`, полностью контролируемое клиентом * **Признак успеха:** страница профиля начинает показывать флаг

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

другие лабы по этой уязвимости
Обложка лабы: 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
Обложка лабы: Deserialization: POP-цепочка → RCE через file write Обложка лабы: Deserialization: POP-цепочка → RCE через file write
Deser

Deserialization: POP-цепочка → RCE через file write

unserialize() без allowed_classes + классы с magic-методами (__destruct, __toString) позволяют собрать POP-цепочку, которая пишет PHP webshell в /static и даёт RCE.

+90 XP
PHP Pro
Exploit Fix