Unlimited Elements For Elementor <= 2.0.5 - Unauthenticated Stored Cross-Site Scripting via Form Entry Fields
Description
The Unlimited Elements for Elementor plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the form entry fields in all versions up to, and including, 2.0.5. This is due to insufficient input sanitization and output escaping on form submission data displayed in the admin Form Entries Trash view. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that will execute whenever an administrator views the trashed form entries.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:NTechnical Details
<=2.0.5Source Code
WordPress.org SVNPatched version not available.
# Exploitation Research Plan: CVE-2026-2724 ## 1. Vulnerability Summary The **Unlimited Elements For Elementor** plugin (<= 2.0.5) contains an unauthenticated stored cross-site scripting (XSS) vulnerability. The flaw exists because the plugin fails to sanitize and escape user-submitted form data wh…
Show full research plan
Exploitation Research Plan: CVE-2026-2724
1. Vulnerability Summary
The Unlimited Elements For Elementor plugin (<= 2.0.5) contains an unauthenticated stored cross-site scripting (XSS) vulnerability. The flaw exists because the plugin fails to sanitize and escape user-submitted form data when displaying it in the Form Entries Trash view within the WordPress admin dashboard. An unauthenticated attacker can submit a form containing a malicious script, which will then execute in the context of an administrator's browser when they view the trashed entries.
2. Attack Vector Analysis
- Endpoint:
wp-admin/admin-ajax.php(Inferred for form submission). - Action: Likely
unlimited_elements_submit_formorue_form_submit(Inferred based on plugin naming conventions). - Vulnerable Parameter: Individual form field values (e.g.,
field_1,name,email). - Authentication: None required for the submission.
- Preconditions:
- The plugin must have at least one form widget active on a public page.
- An administrator must move the malicious submission to the "Trash" and then navigate to the Trash view.
3. Code Flow (Inferred)
- Entry Point: An unauthenticated user sends a POST request to
admin-ajax.phpwith an action related to form submission. - Processing: The plugin receives the POST data. It likely saves this data into a custom database table (e.g.,
wp_unlimited_elements_form_entries) or a custom post type. - Lack of Sanitization: During the saving process, the input is not passed through
sanitize_text_field()orwp_kses(). - Admin Interaction: An administrator views the "Form Entries" page in the plugin settings, identifies the malicious entry, and clicks "Trash".
- Sink: The administrator navigates to the "Trash" tab. The plugin retrieves the trashed entries from the database and echoes the field values directly into the HTML table without using
esc_html()oresc_attr().
4. Nonce Acquisition Strategy
Unlimited Elements typically enqueues a JavaScript configuration object to handle AJAX form submissions.
- Identify Shortcode: The plugin uses various widgets. To ensure the scripts are loaded, create a page with a form widget.
- Action:
wp post create --post_type=page --post_status=publish --post_title="Contact" --post_content='[unlimited_elements_form]'(Exact shortcode name needs verification viagrep -r "add_shortcode" .).
- Action:
- Locate Nonce: The nonce is likely stored in a localized script variable.
- Common Variable:
unlimited_elements_ajax_objectorue_ajax_obj. - Command: Use
browser_navigateto the created page. - Command:
browser_eval("window.unlimited_elements_ajax_object?.nonce")orbrowser_eval("window.ue_ajax_obj?.nonce").
- Common Variable:
- Bypass Check: If the
wp_ajax_nopriv_handler does not callcheck_ajax_refererorwp_verify_nonce, the nonce acquisition step can be skipped.
5. Exploitation Strategy
Step 1: Discover the Form Action
Search the plugin files to find the AJAX handler for form submissions.
grep -rn "wp_ajax_nopriv_" . | grep "form"
Step 2: Submit Malicious Entry
Send a POST request to the identified AJAX action.
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method: POST
- Content-Type:
application/x-www-form-urlencoded - Parameters:
action: (Identified in Step 1, e.g.,ue_submit_form)nonce: (Acquired in Section 4)form_id: (Likely required, can be found in the page source where the widget is placed)field_name:<script>alert('XSS_SUCCESS_CVE_2026_2724')</script>
Step 3: Trigger the Sink (Simulate Admin)
Since this is a Stored XSS in the Trash view, the payload won't fire on the main entries page.
- Log in as Admin.
- Navigate to the Form Entries page.
- Trash the malicious entry.
- Navigate to the Trash view (e.g.,
wp-admin/admin.php?page=unlimited_elements_form_entries&status=trash).
6. Test Data Setup
- Activate Plugin: Ensure "Unlimited Elements For Elementor" version 2.0.5 is active.
- Create Form: Create a simple form using the plugin's widget on a new WordPress page.
- Identify Table: Check the database to see where entries are stored:
wp db query "SHOW TABLES LIKE '%unlimited_elements%';"
7. Expected Results
- The form submission returns a success JSON response:
{"success":true, ...}. - When the admin navigates to the Trash view, the browser executes the payload, appearing as an alert box or a log in the console.
8. Verification Steps
- Database Check: Verify the payload is stored raw in the database.
wp db query "SELECT * FROM wp_ue_form_entries WHERE entry_data LIKE '%<script>%';" - HTML Response Check: Use the
http_requesttool (as admin) to fetch the trash view and grep for the raw script tag.# Note: Use the admin cookie in this request # GET /wp-admin/admin.php?page=unlimited_elements_form_entries&status=trash
9. Alternative Approaches
- Field Injection: If the primary name/email fields are sanitized, try injecting into hidden fields or metadata fields often sent by Elementor widgets (e.g.,
page_url,user_agent). - Shortcode Injection: If unauthenticated form submission is disabled, check if a Contributor-level user can inject the payload via shortcode attributes if they are displayed in the same admin view.
- Direct DB Insertion: If the AJAX endpoint is difficult to hit, use
wp db queryto manually insert the payload into the entries table to verify if the output escaping is truly missing in the Trash view.
Summary
The Unlimited Elements For Elementor plugin for WordPress is vulnerable to unauthenticated Stored Cross-Site Scripting via form entry fields in versions up to 2.0.5. This occurs because the plugin does not adequately sanitize user-submitted form data or escape it when displaying entries in the admin 'Form Entries Trash' view, allowing scripts to execute in an administrator's browser context.
Exploit Outline
1. Identify a public page on the target site containing a form generated by the Unlimited Elements plugin. 2. Submit a malicious payload (e.g., <script>alert('XSS')</script>) via an unauthenticated POST request to the WordPress AJAX endpoint (wp-admin/admin-ajax.php) using the relevant form submission action. 3. The payload is stored in the plugin's form entries database table without sanitization. 4. An administrator must kemudian log in and navigate to the plugin's 'Form Entries' section. 5. The administrator must 'Trash' the malicious entry and then navigate specifically to the 'Trash' tab/view. 6. The payload executes when the trashed entries are rendered in the administrator's browser.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.