Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
cakephp-cache-unserialize — CakePHP 5.4.2 - Élevé - À distance - Désérialisation - les moteurs de cache désérialisent des objets sans liste blanche de classes | Kitploit
Outils/GitHubGitHub/abraxas/cakephp-cache-unserialize
Analyse des VulnérabilitésExploitationExploitation d'Applications WebVirtualisation de SécuritéSécurité WebTests d'IntrusionLabs et Pratique
GitHub
abraxas/cakephp-cache-unserialize

cakephp-cache-unserialize

CakePHP 5.4.2 - Élevé - À distance - Désérialisation - les moteurs de cache désérialisent des objets sans liste blanche de classes

Voir le dépôt
1il y a 3 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Abraxas Labs - cakephp-cache-unserialize

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

cakephp-cache-unserialize

Classe : Injection d'objet Portée : Distante (écriture Redis/Memcached) / Locale (FileEngine)

CakePHP 5.4.2 (887b641) - Cake Software Foundation

5.3.7 a ajouté allowedClasses pour Redis pour cette raison et a laissé la valeur par défaut à true (tout autoriser) pour la compatibilité ascendante. RedisEngine appelle toujours unserialize() nu lorsque cette valeur par défaut est conservée. FileEngine n'a aucune liste d'autorisation. MemcachedEngine conserve par défaut serialize à php.

Quiconque peut DÉFINIR une clé cake_ sur Redis, ou écrire un fichier de cache, place un objet sérialisé. Le prochain Cache::read (ou un chargement CacheSession) l'exécute dans le worker PHP.

IDpas encore de CVE
ClasseInjection d'objet
PortéeDistante lorsque Redis ou Memcached est accessible en écriture depuis l'attaquant. Locale pour FileEngine sur tmp/cache.
CWECWE-502
CVSSÉlevé : 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (nécessite l'écriture dans le magasin de cache). FileEngine est AV:L.
ProduitCakePHP
Affecté5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)
Authécriture dans le magasin de cache (Redis SET, Memcached set, ou un fichier de cache). Pas de HTTP non authentifié vers un Redis localhost verrouillé.
LicenceGNU Affero GPL v3.0
Lab127.0.0.1 uniquement

Ce qu'un attaquant peut faire

Placer un objet sérialisé dans le cache de l'application. La lecture suivante exécute du PHP dans le worker. Ce lab s'arrête à un fichier témoin. Il ne démontre pas de chaîne de gadgets ni de shell.

Prouvé en lab (intégrité)

  • Redis SET cake_<key> puis Cache::read. Le préfixe par défaut est cake_. Le unserialize() de RedisEngine utilise unserialize($value) nu lorsque allowedClasses est à la valeur par défaut true. Un objet LabMarker placé, instancié en tant que LabMarker, et __wakeup a écrit le fichier témoin avec l'UID PHP.
  • FileEngine place {expiry}\n{serialize($obj)} sous le chemin de cache. FileEngine::get() appelle toujours unserialize($data) nu. Même marqueur, même témoin. Le nom de fichier est prefix plus la clé (cake_labfile).
  • Contrôle : allowedClasses => false refuse les objets. La même charge utile Redis est revenue en __PHP_Incomplete_Class. __wakeup ne s'est pas exécuté. Le fichier témoin était absent.

Déduit (non exercé ici)

  • RCE avec l'UID de l'application si l'autoload contient un gadget. Le marqueur de lab écrit seulement un fichier drapeau.
  • CacheSession::read est le même sink lorsque la session defaults => cache. Chaque chargement de session devient un unserialize d'octets de cache contrôlés par l'attaquant.
  • MemcachedEngine serialize => php est la même classe de bug. Ce lab n'a pas démarré Memcached.

Fermé / pas ce reliquat

  • HTTP non authentifié vers un cakephp/app standard qui n'expose pas Redis.
  • Redis localhost verrouillé sans écriture possible depuis l'attaquant.
  • Reverse shell, malware personnalisé, ou chaîne de gadgets publique. Pas dans ce pack.
  • Redis allowedClasses => false (ou une liste restreinte) bloque déjà les objets lorsqu'un opérateur le définit. Ce n'est pas la valeur par défaut.

Mêmes reliquats de pin : window SQLi, collate SQLi, attachment CRLF.

Comment je l'ai trouvé

J'ai épinglé cakephp/cakephp 5.4.2 après la vague 2026 FunctionsBuilder / jsonValue / Smtp CRLF / View element. RedisEngine documente l'option et la laisse toujours ouverte par défaut :

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

Chemin de lecture :

    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 n'a pas d'option équivalente :

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

Fausses pistes déjà consignées : traiter un Redis localhost verrouillé comme un RCE HTTP non authentifié ; livrer une chaîne de gadgets ; prétendre que FileEngine est distant ; un reverse shell. Du théâtre. L'oracle est un marqueur __wakeup qui écrit un fichier drapeau.

Lab

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

ou

cd lab
./run.sh

Cible uniquement 127.0.0.1:19470. CakePHP 5.4.2 live depuis le tag 5.4.2 dans Docker. Redis 7 avec protected-mode désactivé pour que l'hôte puisse SET. PHP 8.3 avec ext-redis. Classe marqueur LabMarker avec __wakeup qui écrit /tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS. Pas de 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

Le correctif

Mettre allowedClasses de Redis par défaut à false, ou à une liste restreinte de classes que l'application stocke réellement. Ajouter la même option à FileEngine et l'honorer dans get(). Mettre serialize de Memcached par défaut à json. Documenter que CacheSession hérite de la politique d'unserialize du moteur de cache.

Références

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

Licence

GNU Affero GPL v3.0. Voir LICENSE. Lab en loopback uniquement. Aucune garantie.

Télécharger l’outil