
CVE-2026-32475 Le champ File Upload des formulaires Elementor Pro gère la validation et le traitement des fichiers dans deux boucles distinctes, avec une gestion différente des entrées de téléversement vides (UPLOAD_ERR_NO_FILE). Un attaquant non authentifié peut soumettre un multipart
Le champ de téléversement de fichier des formulaires Elementor Pro gère la validation et le traitement des fichiers dans deux boucles distinctes avec une gestion différente des entrées de téléversement vides (UPLOAD_ERR_NO_FILE). Un attaquant non authentifié peut soumettre une requête multipart avec une première partie de fichier vide suivie d'une charge utile PHP pour le même champ, ce qui fait que validation() retourne prématurément tandis que process_field() déplace toujours le fichier PHP dans un répertoire public : wp-content/uploads/elementor/forms/.php
Récupère automatiquement le post_id, form_id et field_id de la page cible :
python poc.py -t http://localhost/wp --page-url "http://localhost/wp/?page_id=16" -c "whoami"
Ou :
python poc.py -t http://localhost/wp --page-id 16 -c "whoami"
Démarrez une session interactive :
python poc.py -t http://localhost/wp --page-id 16 -i
Le cœur de la vulnérabilité consiste à contourner le mécanisme de téléversement de fichiers lui-même. Cette partie ne diffère pas selon que vous effectuez le test dans un laboratoire local ou contre un vrai serveur : la première partie de fichier vide + la charge utile PHP dans le champ de téléversement contournent la validation de l'extension, mais le fichier est toujours traité par process_field(). Nous avons démontré que le fichier est bien écrit, ce qui correspond exactement à ce qui est décrit.
Concernant le chemin Laragon codé en dur :
Cela servait uniquement à faciliter la vérification locale.
Sur la cible réelle, le modèle de répertoire est connu et fixe :
/wp-content/uploads/elementor/forms/
Ce qui n'est pas fixe, c'est le nom de fichier final.
Elementor ne conserve pas le nom de fichier d'origine. Dans process_field(), le nom de fichier stocké est généré comme suit :
Par conséquent, si vous téléversez shell.php, le nom de fichier peut devenir quelque chose comme :
66f3a1c2e9b47.php
dans :
/wp-content/uploads/elementor/forms/
uniqid() est basé sur le temps et n'est pas une valeur aléatoire forte ; il est approximativement basé sur l'horodatage + les microsecondes. Par conséquent, récupérer le fichier à distance devient un problème de découverte de nom de fichier plutôt qu'un problème de téléversement.
Par exemple, vous pouvez utiliser une fenêtre temporelle basée sur l'en-tête Date du serveur et le timing des requêtes, rechercher dans une plage étroite autour de l'heure du téléversement, ou récupérer l'URL exacte si le formulaire envoie un e-mail contenant [all-fields].
J'ai gardé le PoC concentré sur la démonstration du problème central lui-même, à savoir le téléversement de fichiers non authentifié, de manière claire et directe. Expliquer entièrement la récupération à distance de la valeur uniqid() rendrait la démonstration beaucoup plus longue que nécessaire pour valider la vulnérabilité elle-même.