Aller au contenu
Elementor Pro corrige une faille critique d’upload de fichiers
Antoine Martin
Antoine Martin 20 August 2026 · 6 min de lecture

Elementor Pro corrige une faille critique d’upload de fichiers

Une faille critique dans Elementor Pro permet à un attaquant non authentifié d’envoyer un fichier arbitraire, y compris un fichier PHP exécutable, sur un site WordPress vulnérable. Cette faille, référencée CVE-2026-32475, obtient un score CVSS de 9,8 sur 10.

Le problème touche Elementor Pro jusqu’à la version 4.2.1 incluse. Installez sans attendre Elementor Pro 4.2.2, la première version qui corrige complètement la faille, ou toute version ultérieure disponible.

Quels sites risquent une compromission

Un site devient exploitable s’il publie une page qui contient un widget Form d’Elementor Pro avec au moins un champ File Upload facultatif. L’attaquant n’a besoin d’aucun compte WordPress pour atteindre le traitement AJAX du formulaire.

Après avoir envoyé un fichier PHP, l’attaquant peut demander son URL afin d’exécuter du code PHP sur le serveur. Une exécution de code à distance peut ensuite mener à la compromission complète du site, notamment au moyen d’un webshell.

L’erreur de validation à l’origine de la faille

Elementor Pro traite les soumissions par la méthode ajax_send_form() de la classe Ajax_Handler, accessible aux visiteurs non authentifiés. L’extension encapsule les données contrôlées par le visiteur, y compris les fichiers envoyés, dans un objet Form_Record, puis les transmet aux routines de validation et de traitement de ElementorProModulesFormsFieldsUpload.

La méthode validation() parcourt les fichiers du champ d’upload. Pour un champ non obligatoire, elle rencontre une entrée vide avec l’erreur PHP UPLOAD_ERR_NO_FILE et exécute return. Cette instruction arrête toute la validation du champ au lieu de passer à l’entrée suivante.

foreach ( $files[ $id ] as $index => $file ) {
    // Aucun fichier n’a été envoyé pour cette entrée.
    if ( ! $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
        return;
    }

    // Le champ obligatoire ne contient pas de fichier.
    if ( $field['required'] && UPLOAD_ERR_NO_FILE === $file['error'] ) {
        $ajax_handler->add_error( $id, $upload_errors[ $file['error'] ] );
        return;
    }

    if ( $file['error'] > UPLOAD_ERR_OK ) {
        $ajax_handler->add_error( $id, $upload_errors[ $file['error'] ] );
        return;
    }

    if ( ! $this->is_file_type_valid( $field, $file ) ) {
        $ajax_handler->add_error( $id, esc_html__( 'This file type is not allowed.', 'elementor-pro' ) );
    }

    if ( ! $this->is_file_size_valid( $field, $file ) ) {
        $ajax_handler->add_error( $id, esc_html__( 'This file exceeds the maximum allowed size.', 'elementor-pro' ) );
    }
}

Le code devait employer continue dans la première condition. continue ignore uniquement l’entrée vide et laisse la boucle vérifier les fichiers suivants. Avec return, Elementor Pro n’appelle ni is_file_type_valid() pour contrôler l’extension et le type de fichier, ni is_file_size_valid() pour contrôler la taille des entrées suivantes du même champ.

L’attaque exploite un champ envoyé sous forme de tableau contenant deux entrées. La première est vide et déclenche UPLOAD_ERR_NO_FILE, ce qui interrompt la validation. La seconde contient le fichier à envoyer avec une extension choisie par l’attaquant, sans que l’extension, le type ni la taille ne soient contrôlés.

Pourquoi le fichier est tout de même enregistré

La méthode process_field() ne reproduit pas cette erreur. Elle utilise continue pour ignorer l’entrée vide, puis traite l’entrée suivante qui n’a pas été validée. Elle extrait l’extension directement du nom de fichier fourni par le client, génère un nom unique et déplace le fichier dans le répertoire d’upload des formulaires.

foreach ( $files[ $id ] as $index => $file ) {
    if ( UPLOAD_ERR_NO_FILE === $file['error'] ) {
        continue;
    }

    $uploads_dir = $this->get_ensure_upload_dir();
    $file_extension = pathinfo( $file['name'], PATHINFO_EXTENSION );
    $filename = uniqid() . '.' . $file_extension;
    $filename = wp_unique_filename( $uploads_dir, $filename );
    $new_file = trailingslashit( $uploads_dir ) . $filename;

    if ( is_dir( $uploads_dir ) && is_writable( $uploads_dir ) ) {
        $move_new_file = Plugin::instance()->php_api->move_uploaded_file(
            $file['tmp_name'],
            $new_file
        );

        if ( false !== $move_new_file ) {
            chmod( $new_file, 0644 );
            $record->add_file( $id, $index, [
                'path' => $new_file,
                'url' => $this->get_file_url( $filename ),
            ] );
        }
    }
}

L’extension conserve donc l’extension transmise dans le nom du fichier. Un fichier suffixé par .php peut être écrit dans /wp-content/uploads/elementor/forms/, puis être appelé par HTTP pour lancer sa charge PHP sur le serveur.

Mettre Elementor Pro à jour

  1. Vérifiez la version d’Elementor Pro installée sur chaque site WordPress.
  2. Considérez toutes les versions jusqu’à 4.2.1 incluse comme vulnérables.
  3. Mettez l’extension à jour vers la version 4.2.2 au minimum.
  4. Contrôlez en priorité les pages publiées qui utilisent un widget Form avec un champ File Upload non obligatoire.

Correctif nécessaire

Modifier le caractère obligatoire d’un champ d’upload ne remplace pas la mise à jour. Le correctif complet se trouve dans Elementor Pro 4.2.2.

Chronologie de la divulgation

  • 24 juillet 2026 : Wordfence reçoit le signalement de cette vulnérabilité d’upload de fichiers arbitraires non authentifié dans Elementor Pro.
  • 27 juillet 2026 : le signalement et la preuve de concept sont validés, puis la faille est communiquée à l’éditeur.
  • 2 août 2026 : l’éditeur indique qu’un autre chercheur a également signalé la faille et qu’il prépare un correctif.
  • 19 août 2026 : Elementor Pro 4.2.2 paraît avec le correctif complet.

L’éditeur a attribué le CVE déjà associé au signalement tiers, CVE-2026-32475. Si vous gérez plusieurs sites, contrôlez dès maintenant les installations Elementor Pro et déployez la version corrigée partout où l’extension est présente.

Antoine Martin

Antoine Martin

Ingénieur DevSecOps, spécialiste des pratiques de développement sécurisé et des pipelines CI/CD. Docker et GitHub Actions font partie de mon quotidien.

Tous les articles

Rejoignez la communauté HelloWP !

Discutez avec nous de WordPress, du développement web et partagez vos expériences avec d’autres développeurs.

- membres
- en ligne
Rejoindre

Nous utilisons des cookies pour améliorer votre expérience. En continuant, vous acceptez notre Politique relative aux cookies.