| Plugin Name | Colibri Page Builder |
|---|---|
| Type of Vulnerability | Cross-Site Scripting (XSS) |
| CVE Number | CVE-2025-11747 |
| Urgency | Medium |
| CVE Publish Date | 2025-12-18 |
| Source URL | CVE-2025-11747 |
Authenticated (Contributor) Stored XSS in Colibri Page Builder (<=1.0.345): What site owners must do now
Author: Hong Kong Security Expert
Date: 2025-12-18
Tags: WordPress, XSS, Colibri, WAF, security, plugin vulnerabilities
TL;DR — A stored Cross‑Site Scripting (XSS) vulnerability in Colibri Page Builder versions ≤ 1.0.345 (CVE‑2025‑11747) permits an authenticated user with Contributor privileges to inject payloads via a shortcode. The vendor fixed the issue in 1.0.358. If immediate update is not possible, apply layered mitigations: restrict contributor capabilities, sanitize shortcode usage, scan and clean stored content, and consider virtual patching via a managed WAF until you update. This advisory explains impact, detection, safe triage steps, and longer‑term hardening.
What happened — summary for site owners and administrators
A stored Cross‑Site Scripting (XSS) vulnerability was discovered in the Colibri Page Builder plugin affecting versions up to and including 1.0.345. An authenticated user with Contributor (or higher) privileges can insert content that later renders on the front end without sufficient sanitization. Because the vector is stored, malicious script remains in the database and executes in a visitor’s browser when the affected shortcode is rendered.
- Affected software: Colibri Page Builder plugin for WordPress
- Vulnerable versions: ≤ 1.0.345
- Fixed in: 1.0.358
- CVE: CVE‑2025‑11747
- Required privilege: Contributor
- Vulnerability class: Stored Cross‑Site Scripting (XSS)
- CVSS (reported): CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L (around 6.5)
Stored XSS is often underestimated. Combined with weak session controls, privilege escalation, or social engineering, stored XSS can enable account takeover, phishing under your own domain, drive‑by malware, and content manipulation.
Why this is important — realistic impact scenarios
Stored XSS is dangerous because the attacker can persist a payload and target any user who views the affected page. Realistic outcomes include:
- Session theft or token exposure for users with elevated privileges (if cookies or tokens are not properly protected).
- Malicious redirects or UI‑spoofing to trick administrators into performing sensitive actions.
- Insertion of backdoors, JavaScript‑based malware, or content that damages SEO and reputation.
- Escalation by social engineering — attacker convinces an editor or admin to view or preview compromised content.
Because Contributor accounts (commonly used for guest writers or outside collaborators) can exploit this vector, sites that accept external content without strict review are at higher risk.
How an attacker could (theoretically) exploit this
- Attacker registers or uses an existing Contributor account.
- They create or edit content that includes the vulnerable shortcode or shortcode attributes processed by Colibri, embedding a script payload that is not properly sanitized.
- The content is saved to the WordPress database.
- When a front‑end user (visitor, editor, or admin) views the page, the stored payload runs in their browser context.
- The payload can steal cookies, post data to an attacker, or perform actions allowed by the victim’s session and browser context.
Exploitation requires a Contributor account and user interaction (viewing or previewing the page). It is not trivially wormable across sites, but can be weaponized quickly within a single site and escalated with social engineering.
Note: No exploit code or payloads are provided here. If you are triaging this issue, do so on an isolated test instance and follow responsible disclosure practices.
Immediate actions every site owner should take (ordered)
-
Update the plugin
Update Colibri Page Builder to version 1.0.358 or later immediately. Test the update on staging if you have complex customizations. If staging is not available, take a full backup (database + files) before updating.
-
Audit recent content and shortcodes
Search posts, pages, widgets and postmeta for unusual shortcode patterns and suspicious attributes. Look for unexpected <script> fragments (sometimes obfuscated) or suspicious attribute values in shortcodes. Quarantine or remove content inserted by contributors you do not recognise.
-
Restrict contributor capabilities (temporary mitigation)
Temporarily restrict Contributor role capabilities to prevent adding or editing shortcodes, or require editor review before publish. If possible, revoke external contributor access until you complete update and content audit.
-
Enable virtual patching / WAF rules
If you operate a Web Application Firewall or use a managed security service, enable rules that detect and block the specific shortcode injection patterns. Virtual patching reduces risk for sites that cannot immediately apply the plugin update.
-
Hardening & monitoring
Force logout of active sessions for privileged accounts after remediation. Review recent changes (user creation, post edits) and inspect server logs for suspicious activity. Increase logging on admin pages and publish/preview actions to detect exploitation attempts.
-
Clean up and recovery
Remove malicious content from the database (posts, postmeta, options). Reset or disable vulnerable plugin shortcodes if cleaning immediately is not feasible. Revoke and reissue API keys or tokens if you suspect leakage.
How to search your site for possible malicious stored payloads (safe methods)
Use read‑only searches first — do not run automatic replacements until you have reviewed results.
Example WP‑CLI database queries (adjust table prefix if needed):
wp db query "SELECT ID, post_title, post_type FROM wp_posts WHERE post_content LIKE '%[colibri%' LIMIT 200;"
Search postmeta and options:
wp db query "SELECT meta_id, post_id, meta_key, meta_value FROM wp_postmeta WHERE meta_value LIKE '%[colibri%' LIMIT 200;"
wp db query "SELECT option_id, option_name FROM wp_options WHERE option_value LIKE '%[colibri%' LIMIT 200;"
Other guidance: