Gravity Forms <=2.9.20 : Vulnérabilité critique de téléversement de fichiers non authentifié via copy_post_image
Gravity Forms est un plugin WordPress largement utilisé pour la gestion de formulaires avancés et l’intégration de fonctionnalités dynamiques côté serveur. En raison de sa popularité, toute faille de sécurité affectant ce composant représente un risque majeur pour l’écosystème WordPress.
Une vulnérabilité critique a été identifiée dans les versions ≤ 2.9.20, permettant à un attaquant non authentifié de téléverser des fichiers arbitraires sur le serveur via la fonctionnalité AJAX copy_post_image.
Cette faille résulte d’une exposition incorrecte d’une action AJAX publique combinée à une validation insuffisante des entrées et à une mauvaise gestion des opérations de fichiers. En contournant les mécanismes de sécurité natifs de WordPress, un attaquant peut déposer des fichiers malveillants dans un répertoire accessible publiquement, ouvrant la voie à une exécution de code à distance selon la configuration du serveur.
Cette analyse propose une approche technique détaillée de la vulnérabilité, en examinant sa cause racine, son impact réel et les erreurs de conception qui ont conduit à son exploitation, tout en mettant en évidence les bonnes pratiques nécessaires pour prévenir ce type de faille dans les extensions WordPress.
1. Enregistrement de l’action AJAX (problème structurel)
Schéma typique observé
Problèmes
Cela rend la fonction appelable par n’importe qui via admin-ajax.php.
2. Fonction vulnérable (logique interne)
Version simplifiée et représentative
3. Analyse ligne par ligne (root cause)
Entrées utilisateur non contrôlées
- Aucune validation
- Peut contenir :
- une URL distante
- un chemin local
- un fichier avec extension arbitraire
Construction du chemin de destination
- basename() ne protège pas contre :
- extensions dangereuses
- double extensions
- Le fichier est placé dans :
- wp-content/uploads/YYYY/MM/
Copie directe du fichier
- Aucune vérification MIME
- Aucune vérification du contenu réel
- Pas de whitelist d’extensions
- Pas d’utilisation de wp_handle_upload()
C’est le cœur de la vulnérabilité.
4. Pourquoi WordPress ne protège pas ici
WordPress fournit des mécanismes sûrs :
- wp_handle_upload()
- wp_check_filetype_and_ext()
- restrictions MIME globales
Mais ils ne sont pas utilisés ici.
La fonction agit en dehors du pipeline sécurisé WordPress.
5. Impact technique réel
Si le serveur autorise l’exécution PHP dans uploads/ :
Alors :
- Le fichier est accessible publiquement
- Le code est interprété par PHP
- Exécution de code à distance
Même sans PHP :
- webshells alternatifs
- fichiers JS malveillants
- payloads secondaires
6. Exemple de correction (approche sécurisée)
Étape 1 – Restreindre l’accès
Étape 2 – Validation stricte du fichier
Étape 3 – Utilisation de l’API WordPress
Étape 4 – Blocage PHP dans uploads (serveur)
7. Mapping sécurité
- CWE-434 : Unrestricted File Upload
- CWE-306 : Missing Authentication
- OWASP A01:2021 : Broken Access Control
- OWASP A05:2021 : Security Misconfiguration
Mot de la fin
Cette vulnérabilité n’est pas due à une erreur complexe, mais à une chaîne d’omissions :
- exposition AJAX publique
- absence de contrôles d’accès
- manipulation directe de fichiers
- contournement des API WordPress sécurisées
C’est un exemple typique de faille critique par design, fréquente dans les plugins WordPress manipulant des fichiers.
Sources
- Wordfence – Gravity Forms ≤ 2.9.20 Unauthenticated Arbitrary File Upload
- WPScan Vulnerability Database – Gravity Forms
- Gravity Forms – Official Blog & Security Announcements
- NVD (NIST) – National Vulnerability Database
- WordPress Developer Handbook – Plugin Security
- OWASP Top 10 – Web Application Security Risks
- MITRE CWE-434 – Unrestricted File Upload











