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

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

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

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

Автор: Hack & Fix
Освоишь: allowlist классовHMAC-подписьJSON вместо pickle/gob
Сложно+90 XP ~72 мин php
CWE-502 · A08:2021 Pro
Обложка: PHP Deserialization: Phar RCE через Phar::getMetadata() Обложка: PHP Deserialization: Phar RCE через Phar::getMetadata()
Задача
# Небезопасная десериализация (PHAR-метаданные) ## Сценарий Вы проводите аудит **ОптоТорг** — оптового магазина электроники с B2B-кабинетом на нативном PHP. В кабинете работает фича «Мои инвойсы»: клиент загружает скан-копию, а просмотрщик показывает её содержимое и «структурированные метаданные» — компанию и дату выставления. Разработчик с гордостью рассказал, что просмотрщик умеет распознавать архивный формат PHP и читать из него служебные сведения. Вас пригласили проверить фичу перед подключением платёжного модуля: смущает, что распознавание работает по содержимому файла, а не по расширению, и что в кодовой базе магазина остался служебный класс файлового кэша, чей деструктор выполняет команду оболочки. ## Цель 1. Изучите загрузку и просмотр инвойсов: что просмотрщик делает с файлом помимо чтения содержимого, и найдите класс с деструктором, выполняющим команду. 2. Соберите архив формата PHP, в метаданных которого лежит объект найденного класса с командой, копирующей файл с флагом в доступное для чтения место. 3. Загрузите архив под видом изображения, откройте его просмотрщиком и прочитайте результат работы gadget'а. ## Теория PHAR — архивный формат PHP: в него упаковывают приложение, а в служебных метаданных можно хранить произвольные значения. Формат опознаётся по сигнатуре в теле файла, поэтому переименование архива в изображение ничего не меняет. Ключевое свойство: метаданные хранятся сериализованными, и явное обращение к ним запускает десериализацию — создаются объекты с классами из автозагрузки и автоматически вызываются их магические методы. Если в приложении есть класс, чей деструктор выполняет команду оболочки со значением собственного свойства, задаваемым прямо из сериализованной строки, это готовый gadget: атакующий управляет командой через свойство объекта. **Уязвимый паттерн:** ```php // Просмотрщик явно разбирает метаданные PHAR по пути из запроса: @Phar::loadPhar($fullPath, $alias); $meta = $p->getMetadata(); // метаданные десериализуются автоматически ``` ## Точка входа атаки `POST /invoice/upload` — загрузка файла инвойса; `GET /invoice?file=<имя>` — просмотр с разбором метаданных. * **Обычный пользователь:** `demo` / `demo` * **Объект атаки:** содержимое и имя загружаемого файла, а затем путь, передаваемый просмотрщику * **Признак успеха:** команда gadget'а выполнена, её результат читается через тот же просмотрщик

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

другие лабы по этой уязвимости
Обложка лабы: 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
Обложка лабы: Deserialization: unserialize() без allowed_classes Обложка лабы: Deserialization: unserialize() без allowed_classes
Deser

Deserialization: unserialize() без allowed_classes

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

+60 XP
PHP Pro
Exploit Fix