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
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
119il y a 1 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-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.

  ███████╗  █████╗  ██╗  ██╗ ███╗   ███╗ ███████╗ ███████╗  ██████╗
  ██╔════╝ ██╔══██╗ ██║  ██║ ████╗ ████║ ██╔════╝ ██╔════╝ ██╔════╝
  ███████╗ ███████║ ███████║ ██╔████╔██║ ███████╗ █████╗   ██║
  ╚════██║ ██╔══██║ ██╔══██║ ██║╚██╔╝██║ ╚════██║ ██╔══╝   ██║
  ███████║ ██║  ██║ ██║  ██║ ██║ ╚═╝ ██║ ███████║ ███████╗ ╚██████╗
  ╚══════╝ ╚═╝  ╚═╝ ╚═╝  ╚═╝ ╚═╝     ╚═╝ ╚══════╝ ╚══════╝  ╚═════╝

⚠️ 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) :

// 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) :

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

Page de formulaire explicite :

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) :

python script.py --list sites.txt --command "id" --cleanup --out results.json

Format de liste JSON :

[{"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é :

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
Télécharger l’outil