Fahmi B.

Développeur Web

Développeur Wordpress

Développeur Flutter

Intégrateur Web

switcher
coffee
music
books
Fahmi B.
Fahmi B.

Développeur Web

Développeur Wordpress

Développeur Flutter

Intégrateur Web

Mon agence web Laisser un message
Blog Post

Gravity Forms <=2.9.20 : Vulnérabilité critique de téléversement de fichiers non authentifié via copy_post_image

29 janvier 2026 How To Do
Gravity Forms

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é

Screenshot

Problèmes

Screenshot

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

Screenshot

3. Analyse ligne par ligne (root cause)

Entrées utilisateur non contrôlées

Screenshot

  • Aucune validation
  • Peut contenir :
    • une URL distante
    • un chemin local
    • un fichier avec extension arbitraire

Construction du chemin de destination

Screenshot

  • basename() ne protège pas contre :
    • extensions dangereuses
    • double extensions
  • Le fichier est placé dans :
    • wp-content/uploads/YYYY/MM/

Copie directe du fichier

Screenshot

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

Screenshot

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

Screenshot

Étape 2 – Validation stricte du fichier

Screenshot

Étape 3 – Utilisation de l’API WordPress

Screenshot

Étape 4 – Blocage PHP dans uploads (serveur)

Screenshot

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