| Plugin Name | Wp chart generator |
|---|---|
| Type of Vulnerability | Authenticated Stored XSS |
| CVE Number | CVE-2025-8685 |
| Urgency | Low |
| CVE Publish Date | 2025-08-11 |
| Source URL | CVE-2025-8685 |
Vulnerability Advisory: WP Chart Generator (≤ 1.0.4) — Authenticated Contributor Stored XSS via [wpchart] Shortcode (CVE‑2025‑8685)
Executive summary
This advisory describes a stored cross-site scripting (XSS) vulnerability in the “WP Chart Generator” WordPress plugin (versions ≤ 1.0.4), tracked as CVE‑2025‑8685. An authenticated user with Contributor privileges (or higher) can store malicious payloads via the plugin’s [wpchart] shortcode. Because the payload is persistent, visitors who view the affected page may execute attacker-controlled JavaScript in their browsers.
Severity is considered low-to-medium in the reported disclosure (CVSS vector ~6.5) because exploitation requires an authenticated Contributor account. There is no official vendor patch at the time of publication. This advisory provides technical detail, detection methods, short-term mitigation options, developer remediation guidance, WAF/ModSecurity rule examples, and an incident response checklist from the perspective of an experienced Hong Kong security practitioner.
What is the vulnerability?
- Affected software: WP Chart Generator plugin
- Affected versions: ≤ 1.0.4
- Vulnerability type: Stored Cross-Site Scripting (XSS) in the rendering of the [wpchart] shortcode
- Required privilege: Contributor (or higher)
- Published: 11 August 2025
- CVE: CVE‑2025‑8685
- Official fix: None at time of publication
The plugin renders untrusted shortcode attributes and/or inner content directly into front-end HTML/JS without correct sanitization and escaping. A contributor can create content with a crafted [wpchart] shortcode containing script fragments or event handlers. When rendered, the browser executes the injected JavaScript in the origin of the site.
Why it matters (impact analysis)
Stored XSS remains high-risk even when initial access requires low privilege. Key impacts:
- Persistent payloads execute each time visitors view the page, broadening exposure.
- Executed JavaScript runs with the page origin privileges: it can attempt to steal cookies (if not HttpOnly), perform actions on behalf of logged-in users, display phishing UI or redirect visitors, and load further malicious resources (exploit chains, loaders, cryptominers).
- Many sites allow contributor accounts (e.g., multi-author blogs, membership sites), so an attacker can gain or create such accounts.
- Editor/admin accounts viewing front-end content while logged-in increase the risk of privilege escalation or account takeover.
How the exploit looks — high-level technical walkthrough
The plugin registers a [wpchart] shortcode that accepts attributes (labels, titles, data arrays, colors). The vulnerability arises when these attributes are embedded into HTML or inline JavaScript without context-aware escaping.
- An attacker obtains or creates a Contributor account.
- They add a post or page containing a crafted
[wpchart]shortcode with attributes or inner content bearing script fragments or event handlers. - The payload is stored in the database. When the page is served, the browser parses the injected markup or script and executes it.
- Any visitor (including logged-in editors/admins) can trigger the payload.
Illustrative payloads (do not deploy on public sites):
[wpchart title=""]
[wpchart data='[{"label":"
","value":10}]']
The root cause is rendering untrusted input into HTML/JS contexts without escaping or validation.
Exploitation scenarios and who is at risk
- Sites allowing contributors to create content (membership or multi-author sites).
- Sites with social registration, bulk-imported authors, or weak account controls.
- Sites where editors/admins preview or view front-end content while authenticated.
- Public visitors and customers can be affected (privacy and reputational harm).
- Commerce sites are particularly sensitive due to potential tampering of checkout flows.
Detection — how to find vulnerable or exploited instances
Search posts, pages, and meta for [wpchart] instances and script-like fragments.
WP-CLI
# Search posts and pages for 'wpchart'
wp post list --post_type='post,page' --format=ids | xargs -n1 -I% wp post get % --field=post_content | grep -n '\[wpchart'
SQL
-- Search post_content for the wpchart shortcode
SELECT ID, post_title
FROM wp_posts
WHERE post_content LIKE '%[wpchart%';