X Addons for Elementor <= 1.0.23 - Missing Authorization
Description
The X Addons for Elementor plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 1.0.23. This makes it possible for authenticated attackers, with contributor-level access and above, to perform an unauthorized action.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=1.0.23# Exploitation Research Plan - CVE-2026-24605 ## 1. Vulnerability Summary The **X Addons for Elementor** plugin (versions <= 1.0.23) contains a missing authorization vulnerability. Specifically, one or more functions registered via WordPress AJAX handlers (`wp_ajax_`) fail to perform capability che…
Show full research plan
Exploitation Research Plan - CVE-2026-24605
1. Vulnerability Summary
The X Addons for Elementor plugin (versions <= 1.0.23) contains a missing authorization vulnerability. Specifically, one or more functions registered via WordPress AJAX handlers (wp_ajax_) fail to perform capability checks (e.g., current_user_can()). While these functions are intended for administrative use (such as updating plugin settings or toggling features), they are accessible to any authenticated user with at least Contributor level permissions. This allows an attacker to modify plugin configurations or perform unauthorized administrative actions.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - HTTP Method:
POST - Vulnerable Action:
x_addons_save_settingsorx_addons_elements_save(inferred based on plugin functionality; to be verified by the agent). - Required Parameter:
action,nonce, and the settings payload (e.g.,elements[]orsettings[]). - Authentication: Authenticated user with Contributor role.
- Precondition: The attacker must obtain a valid nonce for the specific AJAX action.
3. Code Flow
- Hook Registration: The plugin registers AJAX actions in the main plugin class or an admin initialization class (likely
includes/admin/class-admin.phporclasses/class-x-addons-elementor.php).- Code Pattern (inferred):
add_action( 'wp_ajax_x_addons_save_settings', [ $this, 'save_settings_callback' ] );
- Code Pattern (inferred):
- Callback Execution: When a Contributor sends a POST request to
admin-ajax.phpwith the actionx_addons_save_settings, WordPress invokes the registered callback function. - Missing Check: The callback function likely verifies a nonce using
check_ajax_referer()orwp_verify_nonce()but fails to check the user's capabilities.- Vulnerable Pattern (inferred):
public function save_settings_callback() { check_ajax_referer( 'x_addons_nonce', 'security' ); // Nonce check only // MISSING: if ( ! current_user_can( 'manage_options' ) ) wp_die(); $settings = $_POST['settings']; update_option( 'x_addons_settings', $settings ); wp_send_json_success(); }
- Vulnerable Pattern (inferred):
- Unauthorized Sink: User-controlled input is passed to
update_option()or similar, modifying the site's configuration.
4. Nonce Acquisition Strategy
Contributors can access the WordPress dashboard (/wp-admin/). The plugin likely localizes the nonce for its admin settings page.
- Identification: Search for
wp_localize_scriptin the plugin code to find where the nonce is exposed.- Target File:
includes/admin/class-admin.php(inferred) - Target Identifier: Search for
nonceorsecurity.
- Target File:
- Shortcode/Page Setup: If the nonce is only loaded on specific plugin pages, the Contributor can still access those pages if the
add_menu_pageoradd_submenu_pagealso lacks strict capability checks, or they can simply navigate to the settings page URL directly. - Extraction:
- Log in as Contributor.
- Navigate to
/wp-admin/admin.php?page=x-addons-settings(inferred slug). - Use
browser_evalto extract the nonce. - JS Variable (inferred):
window.x_addons_admin?.nonceorwindow.XAddonsConfig?.nonce.
5. Exploitation Strategy
- Identify Vulnerable Action:
- Execute:
grep -r "wp_ajax_" wp-content/plugins/x-addons-elementor/ - Examine the callbacks for those missing
current_user_can.
- Execute:
- Log in as Contributor: Use the
wp_clito create a contributor and capture session cookies. - Acquire Nonce: Use Playwright to navigate to the plugin's admin settings page and extract the nonce value via
browser_eval. - Craft Payload:
- Identify the option name being updated (e.g.,
x_addons_elements_status). - Construct a POST request to disable critical security-related elements or enable all features.
- Identify the option name being updated (e.g.,
- Execute HTTP Request:
(Actual parameters must be determined by the agent after inspecting the callback function code).POST /wp-admin/admin-ajax.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded action=x_addons_save_settings&security=[NONCE]&settings[some_critical_option]=malicious_value
6. Test Data Setup
- Target Plugin: Install
x-addons-elementorversion 1.0.23. - Attacker User:
wp user create attacker attacker@example.com --role=contributor --user_pass=password123
- Baseline State: Ensure plugin features are in their default state.
7. Expected Results
- The AJAX request should return a
200 OKresponse with a JSON success body ({"success":true}). - The WordPress option (e.g.,
x_addons_settings) should be updated in the database despite the request coming from a Contributor.
8. Verification Steps
- Database Check: Use WP-CLI to verify the option has changed.
wp option get x_addons_settings
- UI Check: Navigate to the plugin settings page as an administrator and verify the settings reflect the changes made by the Contributor.
9. Alternative Approaches
- Feature Toggling: If
x_addons_save_settingsis not the specific action, look forx_addons_elements_savewhich might control which Elementor widgets are active. Enabling/disabling widgets can lead to DoS or bypass certain frontend restrictions. - Generic Action: Check if there is a generic action dispatcher (e.g.,
action=x_addons_common) that takes asub_actionparameter, which is a common pattern in Elementor addon plugins. - REST API: Check if the plugin registers any REST routes (
register_rest_route) without apermission_callback, as "Missing Authorization" often applies to REST endpoints as well.
Summary
The X Addons for Elementor plugin for WordPress is vulnerable to unauthorized modification of settings due to a missing capability check in its AJAX handling functions. This allows authenticated attackers with Contributor-level permissions or higher to change plugin configurations by bypassing intended administrative restrictions.
Security Fix
@@ -10,6 +10,10 @@ public function save_settings_callback() { check_ajax_referer( 'x_addons_nonce', 'security' ); + + if ( ! current_user_can( 'manage_options' ) ) { + wp_send_json_error( array( 'message' => 'Unauthorized' ) ); + } + $settings = $_POST['settings']; update_option( 'x_addons_settings', $settings ); wp_send_json_success();
Exploit Outline
1. Authenticate to the WordPress site as a user with Contributor-level permissions. 2. Access the WordPress admin dashboard and locate the AJAX security nonce (e.g., x_addons_nonce) localized in the plugin's admin scripts or page source. 3. Construct a POST request to /wp-admin/admin-ajax.php with the action parameter set to the vulnerable handler (likely x_addons_save_settings or x_addons_elements_save). 4. Include the retrieved nonce in the security parameter and the desired configuration changes in the settings or elements parameter. 5. Execute the request to modify the plugin's configuration options without administrative authorization.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.