
Escáner PoC en Python y exploit para CVE-2026-84434, una carga arbitraria de archivos sin autenticación en Gravity Forms <=3.1.0.4 a través de campos ocultos de File Upload. Admite modos de verificación, explotación y escaneo masivo.
Escáner y exploit PoC en Python 3 para CVE-2026-84434 en Gravity Forms.
| Plugin | gravityforms |
| Afectado | ≤ 3.1.0.4 |
| Corregido en | 3.1.0.5+ (versión de seguridad del proveedor 3.1.1) |
| CVSS | 9.8 (Crítico) |
| Auth | No autenticado |
| CWE | CWE-434 — Carga sin restricciones |
| Crédito | 0xd4rk5id3 — EnvoraSec (Wordfence) |
Los campos ocultos de Carga de archivos omiten la validación de extensión en el pipeline de validación, mientras que la ruta de persistencia aún puede llamar a upload_file() sin las comprobaciones equivalentes. Un atacante no autenticado puede enviar una petición POST a un formulario público que incluya un campo de Carga de archivos con Visibilidad → Oculta.
Los archivos se almacenan en wp-content/uploads/gravity_forms/. Gravity Forms normalmente añade reglas .htaccess para bloquear la ejecución de PHP; la ejecución remota de código depende de la configuración del servidor (nginx, docroot alternativo, etc.).
gform_wrapper y un campo fileupload oculto (input_{form}_{field})gform_submit, is_submit_{id}, archivo en el input oculto)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
| Opción | Descripción |
|---|---|
-u, --url | URL base de un único objetivo |
--list | Lista de URLs, CSV estilo FOFA o candidates.jsonl |
--mode | check (por defecto) o exploit |
--form-id | ID del Gravity Form |
--page-url | Ruta o URL de la página que aloja el formulario |
--file-field | ID del campo oculto de carga de archivos |
--payload-file | Archivo local a subir (por defecto: marcador benigno .txt en memoria) |
--paths | Rutas adicionales que rastrear en busca de formularios |
--threads, -j | Concurrencia masiva (por defecto 20) |
--output | Resultados JSONL (por defecto cve_2026_84434_results.jsonl) |
--vuln-list | URLs afectadas o exploits exitosos (por defecto hits.txt) |
--candidates-list | Metadatos de comprobación (por defecto candidates.jsonl) |
--quiet | Menos salida de progreso en ejecuciones masivas |
| Archivo | Contenido |
|---|---|
cve_2026_84434_results.jsonl | JSON completo por objetivo |
hits.txt | URLs base candidatas |
candidates.jsonl | form_id, page_url, file_field / input_name |
status (check)| Estado | Significado |
|---|---|
candidate | Versión vulnerable + carga de archivos oculta en un formulario público |
forms_no_hidden_upload | Formularios encontrados, ninguno con carga de archivos oculta en el HTML |
plugin_no_public_forms | Plugin presente, ningún formulario público descubierto |
patched | Versión > 3.1.0.4 |
no_plugin | Gravity Forms no detectado |
.
├── poc.py
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Las listas de escaneo locales y los artefactos (list.txt, *.jsonl, payloads personalizados) están en .gitignore y no deben commitearse.
Solo para pruebas de seguridad autorizadas. Usted es responsable del cumplimiento de las leyes aplicables y las reglas del programa.