Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
cakephp-cache-unserialize — CakePHP 5.4.2 – Hoch – Remote – Unserialize – Cache-Engines deserialisieren Objekte ohne Klassen-Allowlist | Kitploit
Tools/GitHubGitHub/abraxas/cakephp-cache-unserialize
SchwachstellenanalyseExploitationWebanwendungs-ExploitationSicherheitsvirtualisierungWebsicherheitPenetrationstestsLabs & Praxis
GitHub
abraxas/cakephp-cache-unserialize

cakephp-cache-unserialize

CakePHP 5.4.2 – Hoch – Remote – Unserialize – Cache-Engines deserialisieren Objekte ohne Klassen-Allowlist

Repository anzeigen
13vor 8 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Abraxas Labs - cakephp-cache-unserialize

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

Write-up: https://abraxaslabs.tech/research/cakephp-cache-unserialize

cakephp-cache-unserialize

Klasse: Object Injection Reichweite: Remote (Redis/Memcached-Schreibzugriff) / Lokal (FileEngine)

CakePHP 5.4.2 (887b641) – Cake Software Foundation

5.3.7 führte aus diesem Grund Redis allowedClasses ein und beließ den Standardwert aus Gründen der Abwärtskompatibilität bei true (alle erlauben). RedisEngine ruft weiterhin ein blankes unserialize() auf, wenn dieser Standardwert gilt. FileEngine besitzt überhaupt keine Allowlist. MemcachedEngine setzt serialize weiterhin standardmäßig auf php.

Wer einen cake_-Schlüssel auf Redis SETZEN oder eine Cache-Datei schreiben kann, platziert ein serialisiertes Objekt. Der nächste Cache::read (oder ein CacheSession-Ladevorgang) führt es im PHP-Worker aus.

IDnoch keine CVE
KlasseObject Injection
ReichweiteRemote, wenn Redis oder Memcached vom Angreifer beschreibbar ist. Lokal für FileEngine unter tmp/cache.
CWECWE-502
CVSSHoch: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (erfordert Schreibzugriff auf den Cache-Store). FileEngine ist AV:L.
ProduktCakePHP
Betroffen5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
AuthSchreibzugriff auf den Cache-Store (Redis SET, Memcached set oder eine Cache-Datei). Kein unauthentifizierter HTTP-Zugriff auf ein abgesichertes lokales Redis.
LizenzGNU Affero GPL v3.0
Labnur 127.0.0.1

Was ein Angreifer tun kann

Ein serialisiertes Objekt im App-Cache platzieren. Der nächste Lesevorgang führt PHP im Worker aus. Dieses Lab endet bei einer Witness-Datei. Es demonstriert weder eine Gadget-Chain noch eine Shell.

Im Lab nachgewiesen (Integrität)

  • Redis SET cake_<key> und dann Cache::read. Das Standardpräfix ist cake_. RedisEngine unserialize() verwendet ein blankes unserialize($value), wenn allowedClasses den Standardwert true hat. Ein platziertes LabMarker-Objekt, instanziiert als LabMarker, und __wakeup schrieben die Witness-Datei unter der PHP-UID.
  • FileEngine platziert {expiry}\n{serialize($obj)} unter dem Cache-Pfad. FileEngine::get() ruft weiterhin ein blankes unserialize($data) auf. Gleicher Marker, gleiche Witness-Datei. Der Dateiname ist prefix plus Schlüssel (cake_labfile).
  • Kontrolle: allowedClasses => false verweigert Objekte. Dieselbe Redis-Payload kam als __PHP_Incomplete_Class zurück. __wakeup wurde nicht ausgeführt. Die Witness-Datei fehlte.

Abgeleitet (hier nicht ausgeführt)

  • RCE unter der App-UID, wenn der Autoloader ein Gadget enthält. Der Lab-Marker schreibt nur eine Flag-Datei.
  • CacheSession::read ist dieselbe Senke, wenn die Session defaults => cache verwendet. Jeder Session-Ladevorgang wird zu einem Unserialize von angreiferkontrollierten Cache-Bytes.
  • MemcachedEngine serialize => php ist dieselbe Fehlerklasse. Dieses Lab hat Memcached nicht gestartet.

Geschlossen / nicht dieser Überrest

  • Unauthentifizierter HTTP-Zugriff auf ein Standard-cakephp/app, das Redis nicht exponiert.
  • Abgesichertes lokales Redis ohne Schreibzugriff durch den Angreifer.
  • Reverse Shell, benutzerdefinierte Malware oder eine öffentliche Gadget-Chain. Nicht in diesem Paket.
  • Redis allowedClasses => false (oder eine enge Liste) blockiert Objekte bereits, wenn ein Betreiber es setzt. Es ist nicht der Standard.

Gleiche Pin-Überbleibsel: window SQLi, collate SQLi, attachment CRLF.

Wie ich es gefunden habe

Ich habe cakephp/cakephp 5.4.2 nach der Welle um FunctionsBuilder / jsonValue / Smtp CRLF / View-Elemente aus dem Jahr 2026 gepinnt. RedisEngine dokumentiert die Option und lässt sie standardmäßig weiterhin offen:

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

Lesepfad:

    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 hat keine entsprechende Option:

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

Bereits erfasste Fehlversuche: die Behandlung eines abgeriegelten lokalen Redis als unauth HTTP RCE; das Ausliefern einer Gadget-Chain; die Behauptung, FileEngine sei remote; eine Reverse Shell. Theater. Das Orakel ist ein Marker __wakeup, der eine Flag-Datei schreibt.

Lab

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

oder

cd lab
./run.sh

Ziel nur 127.0.0.1:19470. Live CakePHP 5.4.2 aus Tag 5.4.2 in Docker. Redis 7 mit deaktiviertem protected-mode, damit der Host SET ausführen kann. PHP 8.3 mit ext-redis. Marker-Klasse LabMarker mit __wakeup, die /tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS schreibt. Keine 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

Die Behebung

Setzen Sie den Standardwert für allowedClasses von Redis auf false oder auf eine eng begrenzte Liste von Klassen, die die Anwendung tatsächlich speichert. Fügen Sie dieselbe Option zu FileEngine hinzu und berücksichtigen Sie sie in get(). Setzen Sie den Standardwert für serialize von Memcached auf json. Dokumentieren Sie, dass CacheSession die Unserialize-Richtlinie der Cache-Engine erbt.

Referenzen

  • github.com/cakephp/cakephp Tag 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
  • RedisEngine.php · FileEngine.php
  • Gleicher Pin: cakephp-window-sqli · cakephp-collate-sqli · cakephp-attachment-crlf
  • CWE-502

Lizenz

Tool herunterladen