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

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

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

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

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

Похожие лабораторные (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: unserialize() без allowed_classes Обложка лабы: Deserialization: unserialize() без allowed_classes
Deser

Deserialization: unserialize() без allowed_classes

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

+60 XP
PHP Pro
Exploit Fix