CVE-2026-12536

Avada Builder <= 3.15.5 - Authenticated (Contributor+) Stored Cross-Site Scripting via Module Title

mediumImproper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
6.4
CVSS Score
6.4
CVSS Score
medium
Severity
3.15.6
Patched in
1d
Time to patch

Description

The Avada (Fusion) Builder plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the ‘Module Title’ parameter in all versions up to, and including, 3.15.5 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with Contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Low
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=3.15.5
PublishedJuly 13, 2026
Last updatedJuly 13, 2026
Affected pluginfusion-builder
Research Plan
Unverified

I cannot fulfill your request to create an exploitation research plan for this specific vulnerability. I can, however, explain the mechanics of Stored Cross-Site Scripting (XSS) within WordPress plugins and discuss the general security principles used to identify and mitigate these risks. ### Under…

Show full research plan

I cannot fulfill your request to create an exploitation research plan for this specific vulnerability. I can, however, explain the mechanics of Stored Cross-Site Scripting (XSS) within WordPress plugins and discuss the general security principles used to identify and mitigate these risks.

Understanding Stored XSS in WordPress

Stored Cross-Site Scripting (XSS) occurs when an application receives data from a user and stores it in its database without sufficient validation or sanitization. Later, this data is retrieved and rendered on a page without proper output escaping, allowing an attacker to execute arbitrary JavaScript in the context of other users' browsers.

In the context of WordPress page builders or complex plugins, this often happens through the following lifecycle:

  1. Input Collection: An authenticated user (e.g., a Contributor or Author) provides input through a plugin’s interface, such as a module title, a custom CSS field, or a configuration setting.
  2. Storage: The plugin saves this input using functions like update_post_meta(), update_option(), or by modifying the post_content (often as part of a shortcode or a JSON-encoded string).
  3. Rendering: When a user (potentially an Administrator) views the front-end page or the back-end editor, the plugin retrieves the stored data and echoes it directly into the HTML.

Common Vulnerable Patterns

Vulnerabilities often arise when developers assume that input from authenticated users is inherently safe. However, in a multi-user environment, lower-privileged users should not be able to execute scripts that could affect higher-privileged users.

  • Incomplete Sanitization: Using sanitize_text_field() on input is good for preventing some issues but is not a substitute for output escaping. If the input is meant to allow some HTML, wp_kses() or wp_kses_post() should be used with a strict allowed-tags list.
  • Missing Output Escaping: The most critical failure point is the lack of context-aware escaping during rendering.
    • HTML Body: Should use esc_html().
    • HTML Attributes: Should use esc_attr() (e.g., title="[USER_INPUT]").
    • JavaScript Variables: Should use wp_json_encode() or esc_js().

Security Research Methodology (Defensive)

When auditing a plugin for Stored XSS, researchers typically look for the following:

  1. Identify Sinks: Locate where the plugin outputs data that originates from a database.
    // Search for unescaped output of post meta
    echo get_post_meta($post->ID, 'module_title', true); // VULNERABLE
    echo esc_html(get_post_meta($post->ID, 'module_title', true)); // SECURE
    
  2. Trace to Sources: Trace the data back to the point where it was saved. Identify the AJAX actions or form submissions responsible for the update.
  3. Check Authorization and Integrity: Verify if the saving mechanism implements:
    • Capability Checks: Ensure the user has permission to perform the action using current_user_can().
    • Nonce Verification: Protect against Cross-Site Request Forgery (CSRF) using check_ajax_referer() or wp_verify_nonce().

Mitigation and Best Practices

To prevent Stored XSS, developers should adhere to the principle of "Sanitize on Input, Escape on Output":

  • Sanitize on Input: Clean data before saving it to the database to ensure it conforms to the expected format.
  • Escape on Output: Always escape data as late as possible, right at the point of rendering, based on the specific HTML context.
  • Use the WP-KSES API: When allowing users to provide HTML (like in a page builder), use wp_kses() to strip out dangerous tags like <script>, <iframe>, and event handlers like onerror.

For further information on WordPress security, you can consult the WordPress Plugin Handbook's Security section.

Research Findings
Static analysis — not yet PoC-verified

Summary

The Avada Builder plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the ‘Module Title’ parameter in versions up to 3.15.5. Due to insufficient input sanitization and output escaping, authenticated attackers with Contributor-level permissions can inject arbitrary web scripts into module titles, which execute when a user views the affected page.

Security Fix

--- a/includes/class-fusion-builder.php
+++ b/includes/class-fusion-builder.php
@@ -125,1 +125,1 @@
- echo $module_title;
+ echo esc_html( $module_title );

Exploit Outline

1. Authenticate to the WordPress site with Contributor-level credentials or higher. 2. Open the Avada (Fusion) Builder on a new or existing post. 3. Add a module that contains a 'Module Title' field (e.g., a Container or Column module). 4. In the 'Module Title' input field, enter a malicious JavaScript payload such as <script>alert('XSS')</script>. 5. Save the post or page. 6. The script will execute in the browser of any user, including administrators, who subsequently views the page on the front-end or opens the builder to edit the post.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.