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) |
Resumen
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.).
Flujo del ataque
- Detectar Gravity Forms y versión ≤ 3.1.0.4
- Rastrear páginas públicas en busca de
gform_wrapper y un campo fileupload oculto (input_{form}_{field})
- Rellenar los campos visibles obligatorios con valores de relleno
- POST multipart (
gform_submit, is_submit_{id}, archivo en el input oculto)
- Confirmar mediante mensaje de confirmación / indicios de entrada / obtención opcional de marcador
Requisitos
- Python 3.9+
pip install -r requirements.txt
Uso
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
Opciones de CLI
Salida (comprobación masiva)
Valores comunes de status (check)
Limitaciones
- El modo check solo ve campos de carga ocultos renderizados en el HTML público; los campos ocultos solo para administradores no son descubribles de forma remota.
- Las listas estilo FOFA contienen muchos sitios parcheados o formularios sin carga oculta — espere una tasa de candidatos baja.
- El exploit por defecto sube un marcador de texto inofensivo, no un webshell.
Estructura del repositorio
.
├── 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.
Legal
Solo para pruebas de seguridad autorizadas. Usted es responsable del cumplimiento de las leyes aplicables y las reglas del programa.