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

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

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

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

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

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/abraxas/cakephp-cache-unserialize
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВиртуализация для безопасностиВеб-безопасностьТестирование на ПроникновениеЛаборатории и Практика
GitHub
abraxas/cakephp-cache-unserialize

cakephp-cache-unserialize

CakePHP 5.4.2 — высокий уровень — удалённо — десериализация — механизмы кэширования десериализуют объекты без списка разрешённых классов

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

Популярное

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

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

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

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

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

Abraxas Labs - cakephp-cache-unserialize

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  cakephp-cache-unserialize

Разбор: https://abraxaslabs.tech/research/cakephp-cache-unserialize

cakephp-cache-unserialize

Класс: Внедрение объектов Доступ: Удалённый (запись в Redis/Memcached) / Локальный (FileEngine)

CakePHP 5.4.2 (887b641) - Cake Software Foundation

В версии 5.3.7 для этой цели был добавлен параметр Redis allowedClasses, но значение по умолчанию осталось true (разрешить всё) для обратной совместимости. RedisEngine по-прежнему вызывает голый unserialize(), когда действует это значение по умолчанию. У FileEngine вообще нет списка разрешённых классов. MemcachedEngine по-прежнему по умолчанию использует serialize со значением php.

Тот, кто может УСТАНОВИТЬ ключ cake_ в Redis или записать файл кэша, внедряет сериализованный объект. Следующий вызов Cache::read (или загрузка через CacheSession) выполняет его в PHP-воркере.

IDCVE пока нет
КлассВнедрение объектов
ДоступУдалённый, когда Redis или Memcached доступны для записи со стороны атакующего. Локальный для FileEngine в tmp/cache.
CWECWE-502
CVSSВысокий: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (требуется запись в хранилище кэша). Для FileEngine — AV:L.
ПродуктCakePHP
Затронуто5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
Аутентификациязапись в хранилище кэша (Redis SET, Memcached set или файл кэша). Не неаутентифицированный HTTP к защищённому localhost Redis.
ЛицензияGNU Affero GPL v3.0
Лабораториятолько 127.0.0.1

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

Внедрить сериализованный объект в кэш приложения. Следующее чтение выполнит PHP в воркере. Эта лаборатория останавливается на файле-свидетеле. Она не демонстрирует цепочку гаджетов или получение оболочки.

Доказано в лаборатории (целостность)

  • Redis SET cake_<key>, затем Cache::read. Префикс по умолчанию — cake_. unserialize() в RedisEngine использует голый unserialize($value), когда allowedClasses имеет значение по умолчанию true. Внедрённый объект LabMarker, созданный как LabMarker, и __wakeup записали файл-свидетель от имени UID PHP.
  • Внедрение через FileEngine {expiry}\n{serialize($obj)} по пути кэша. FileEngine::get() по-прежнему вызывает голый unserialize($data). Тот же маркер, тот же свидетель. Имя файла — это prefix плюс ключ (cake_labfile).
  • Контроль: allowedClasses => false отклоняет объекты. Тот же полезный груз для Redis вернулся как __PHP_Incomplete_Class. __wakeup не выполнился. Файл-свидетель отсутствовал.

Предполагается (здесь не проверялось)

  • RCE от имени UID приложения, если автозагрузка содержит гаджет. Маркер лаборатории лишь записывает файл-флаг.
  • CacheSession::read — тот же сток, когда у сессии defaults => cache. Каждая загрузка сессии становится десериализацией байтов кэша, контролируемых атакующим.
  • MemcachedEngine serialize => php — тот же класс ошибки. Эта лаборатория не запускала Memcached.

Закрыто / не относится к этому остатку

  • Неаутентифицированный HTTP к стандартному cakephp/app, который не предоставляет доступ к Redis.
  • Защищённый localhost Redis без возможности записи со стороны атакующего.
  • Обратная оболочка, пользовательское вредоносное ПО или публичная цепочка гаджетов. В этом пакете их нет.
  • Redis allowedClasses => false (или строгий список) уже блокирует объекты, когда оператор его задаёт. Но это не значение по умолчанию.

Оставшиеся закреплённые находки: window SQLi, collate SQLi, attachment CRLF.

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

Я закрепил cakephp/cakephp 5.4.2 после волны 2026 года с FunctionsBuilder / jsonValue / Smtp CRLF / View element. RedisEngine документирует эту опцию и по-прежнему оставляет её открытой по умолчанию:

 * - `allowedClasses` ... Defaults to `true` (allow all) for backwards compatibility.
...
        'allowedClasses' => true,

Читать путь:

    protected function unserialize(string $value): mixed
    {
        if (preg_match('/^[-]?\d+$/', $value)) {
            return (int)$value;
        }

        $allowedClasses = $this->getConfig('allowedClasses');
        if ($allowedClasses !== true) {
            return unserialize($value, ['allowed_classes' => $allowedClasses]);
        }

        return unserialize($value);
    }

FileEngine не имеет эквивалентной опции:

        if ($data !== '' && !empty($this->_config['serialize'])) {
            $data = unserialize($data);

Ошибочные повороты, уже зафиксированные: трактовка заблокированного локального Redis как неаутентифицированного HTTP RCE; поставка цепочки гаджетов; утверждение, что FileEngine является удалённым; обратная оболочка. Театр. Оракул — это маркер __wakeup, который записывает файл флага.

Лаборатория

python3 cakephp-cache-unserialize-Abraxas-Labs.py

или

cd lab
./run.sh

Цель — только 127.0.0.1:19470. Работающий CakePHP 5.4.2 из тега 5.4.2 внутри Docker. Redis 7 с отключённым protected-mode, чтобы хост мог выполнять SET. PHP 8.3 с ext-redis. Класс-маркер LabMarker с __wakeup, который записывает /tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS. Без shell.

SUCCESS cakephp-cache-unserialize redis-default-wakeup=yes redis-denied-wakeup=no file-wakeup=yes pin=5.4.2 sha=887b641de9f7aba06071f98f17edcbc573cbcf63 how=live CAKEPHP-CACHE-UNSERIALIZE-WITNESS

Исправление

По умолчанию установить для Redis allowedClasses значение false или ограничить его узким списком классов, которые приложение действительно сохраняет. Добавить ту же опцию в FileEngine и учитывать её в get(). По умолчанию установить для Memcached serialize значение json. Задокументировать, что CacheSession наследует политику десериализации механизма кэша.

Ссылки

  • github.com/cakephp/cakephp тег 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • RedisEngine.php · FileEngine.php
  • Тот же пин: cakephp-window-sqli · cakephp-collate-sqli · cakephp-attachment-crlf
  • CWE-502

Лицензия

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