Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cakephp-cache-unserialize — CakePHP 5.4.2 - Alto - Remoto - Unserialize - i motori di cache deserializzano oggetti senza allowlist di classi | Kitploit
Strumenti/GitHubGitHub/abraxas/cakephp-cache-unserialize
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebVirtualizzazione per la SicurezzaSicurezza WebPenetration TestingLab e Pratica
GitHub
abraxas/cakephp-cache-unserialize

cakephp-cache-unserialize

CakePHP 5.4.2 - Alto - Remoto - Unserialize - i motori di cache deserializzano oggetti senza allowlist di classi

Vedi Repository
14 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Abraxas Labs - cakephp-cache-unserialize

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

cakephp-cache-unserialize

Classe: Object injection Reach: Remoto (scrittura Redis/Memcached) / Locale (FileEngine)

CakePHP 5.4.2 (887b641) - Cake Software Foundation

La 5.3.7 ha aggiunto allowedClasses per Redis proprio per questo motivo e ha lasciato il default a true (consenti tutto) per retrocompatibilità. RedisEngine chiama ancora unserialize() nudo quando vale quel default. FileEngine non ha alcuna allowlist. MemcachedEngine ha ancora serialize impostato di default a php.

Chi può impostare una chiave cake_ su Redis, o scrivere un file di cache, piazza un oggetto serializzato. La successiva Cache::read (o un caricamento CacheSession) lo esegue nel worker PHP.

IDnessuna CVE al momento
ClasseObject injection
ReachRemoto quando Redis o Memcached sono scrivibili dall'attaccante. Locale per FileEngine su tmp/cache.
CWECWE-502
CVSSAlto: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (richiede scrittura sul cache store). FileEngine è AV:L.
ProdottoCakePHP
Affetto5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
Authscrittura sul cache store (Redis SET, Memcached set, o un file di cache). Non HTTP non autenticato verso un Redis localhost bloccato.
LicenzaGNU Affero GPL v3.0
Labsolo 127.0.0.1

Cosa può fare un attaccante

Piazzare un oggetto serializzato nella cache dell'app. La lettura successiva esegue PHP nel worker. Questo lab si ferma a un file testimone. Non dimostra una gadget chain né una shell.

Dimostrato nel lab (integrità)

  • Redis SET cake_<key> poi Cache::read. Il prefisso di default è cake_. unserialize() di RedisEngine usa unserialize($value) nudo quando allowedClasses è il default true. Un oggetto LabMarker piazzato, istanziato come LabMarker, e __wakeup ha scritto il file testimone con l'UID PHP.
  • FileEngine piazza {expiry}\n{serialize($obj)} sotto il percorso di cache. FileEngine::get() chiama ancora unserialize($data) nudo. Stesso marker, stesso testimone. Il nome del file è prefix più la chiave (cake_labfile).
  • Controllo: allowedClasses => false rifiuta gli oggetti. Lo stesso payload Redis è tornato come __PHP_Incomplete_Class. __wakeup non è stato eseguito. Il file testimone era assente.

Inferito (non esercitato qui)

  • RCE con l'UID dell'app se l'autoload contiene un gadget. Il marker del lab scrive solo un file flag.
  • CacheSession::read è lo stesso sink quando la sessione ha defaults => cache. Ogni caricamento di sessione diventa un unserialize di byte di cache controllati dall'attaccante.
  • MemcachedEngine serialize => php è la stessa classe di bug. Questo lab non ha avviato Memcached.

Chiuso / non questo residuo

  • HTTP non autenticato verso un cakephp/app stock che non espone Redis.
  • Redis localhost bloccato senza scrittura da parte dell'attaccante.
  • Reverse shell, malware personalizzato, o una gadget chain pubblica. Non in questo pacchetto.
  • Redis allowedClasses => false (o una lista ristretta) blocca già gli oggetti quando un operatore lo imposta. Non è il default.

Altri residui dello stesso pin: window SQLi, collate SQLi, attachment CRLF.

Come l'ho trovato

Ho fissato cakephp/cakephp 5.4.2 dopo l'ondata 2026 di FunctionsBuilder / jsonValue / Smtp CRLF / View element. RedisEngine documenta l'opzione e la lascia comunque aperta di default:

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

Percorso di lettura:

    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 non ha un'opzione equivalente:

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

Vicoli ciechi già registrati: trattare un Redis localhost bloccato come RCE HTTP non autenticato; distribuire una gadget chain; sostenere che FileEngine sia remoto; una reverse shell. Teatro. L'oracolo è un marker __wakeup che scrive un file flag.

Lab

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

oppure

cd lab
./run.sh

Target solo 127.0.0.1:19470. CakePHP 5.4.2 live dal tag 5.4.2 dentro Docker. Redis 7 con protected-mode off così l'host può fare SET. PHP 8.3 con ext-redis. Classe marker LabMarker con __wakeup che scrive /tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS. Nessuna 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

La correzione

Impostare allowedClasses di Redis di default a false, o a una lista ristretta di classi che l'app memorizza effettivamente. Aggiungere la stessa opzione a FileEngine e rispettarla in get(). Impostare serialize di Memcached di default a json. Documentare che CacheSession eredita la policy di unserialize del cache engine.

Riferimenti

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

Licenza

GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.

Scarica lo strumento