
Scanner PoC ed exploit in Python per CVE-2026-84434, un caricamento arbitrario di file non autenticato in Gravity Forms <=3.1.0.4 tramite campi File Upload nascosti. Supporta le modalità check, exploit e scansione di massa.
Scanner PoC ed exploit in Python 3 per CVE-2026-84434 in Gravity Forms.
| Plugin | gravityforms |
| Affected | ≤ 3.1.0.4 |
| Fixed in | 3.1.0.5+ (vendor security release 3.1.1) |
| CVSS | 9.8 (Critical) |
| Auth | Unauthenticated |
| CWE | CWE-434 — Unrestricted Upload |
| Credit | 0xd4rk5id3 — EnvoraSec (Wordfence) |
I campi File Upload nascosti saltano la validazione dell'estensione nella pipeline di validazione, mentre il percorso di persistenza può comunque chiamare upload_file() senza controlli equivalenti. Un attaccante non autenticato può effettuare una POST verso un form pubblico che include un campo File Upload con Visibility → Hidden.
I file vengono memorizzati sotto wp-content/uploads/gravity_forms/. Gravity Forms tipicamente aggiunge regole .htaccess per bloccare l'esecuzione di PHP; l'RCE dipende dalla configurazione del server (nginx, docroot alternativo, ecc.).
gform_wrapper e di un campo fileupload nascosto (input_{form}_{field})gform_submit, is_submit_{id}, file sull'input nascosto)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
| Opzione | Descrizione |
|---|---|
-u, --url | URL base del singolo target |
--list | Lista di URL, CSV in stile FOFA, o candidates.jsonl |
--mode | check (predefinito) o exploit |
--form-id | ID del Gravity Form |
--page-url | Percorso o URL della pagina che ospita il form |
--file-field | ID del campo di upload file nascosto |
--payload-file | File locale da caricare (predefinito: marker .txt benigno in memoria) |
--paths | Percorsi aggiuntivi da scansionare per i form |
--threads, -j | Concorrenza massiva (predefinito 20) |
--output | Risultati JSONL (predefinito cve_2026_84434_results.jsonl) |
--vuln-list | URL colpiti o exploit riusciti (predefinito hits.txt) |
--candidates-list | Metadati di check (predefinito candidates.jsonl) |
--quiet | Meno output di avanzamento nelle esecuzioni massive |
| File | Contenuto |
|---|---|
cve_2026_84434_results.jsonl | JSON completo per target |
hits.txt | URL base candidati |
candidates.jsonl | form_id, page_url, file_field / input_name |
status (check)| Status | Significato |
|---|---|
candidate | Versione vulnerabile + upload file nascosto su un form pubblico |
forms_no_hidden_upload | Form trovati, nessuno con upload file nascosto nell'HTML |
plugin_no_public_forms | Plugin presente, nessun form pubblico scoperto |
patched | Versione > 3.1.0.4 |
no_plugin | Gravity Forms non rilevato |
.
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Le liste di scansione locali e gli artefatti (list.txt, *.jsonl, payload personalizzati) sono in .gitignore e non devono essere committati.
Solo per test di sicurezza autorizzati. Sei responsabile della conformità con le leggi applicabili e le regole del programma.