| Plugin Name | Pronamic Google Maps |
|---|---|
| Type of Vulnerability | Stored XSS |
| CVE Number | CVE-2025-9352 |
| Urgency | Low |
| CVE Publish Date | 2025-08-27 |
| Source URL | CVE-2025-9352 |
Pronamic Google Maps (<= 2.4.1) — Authenticated Contributor Stored XSS (CVE‑2025‑9352)
By Hong Kong Security Expert — 27 August 2025
Summary
- Vulnerability: Authenticated (Contributor+) Stored Cross‑Site Scripting (XSS)
- Affected software: Pronamic Google Maps plugin for WordPress — versions ≤ 2.4.1
- Fixed in: 2.4.2
- CVE: CVE‑2025‑9352
- Reported: 27 Aug 2025
- Required privilege: Contributor
- Business impact: persistent XSS that can result in session theft, content injection, phishing redirects, and site reputation/SEO damage
- Priority: update the plugin and apply virtual patching / WAF mitigations immediately for sites that cannot update at once
Introduction — why this matters
Stored XSS remains one of the most frequently exploited weaknesses in the WordPress ecosystem. In this case a Contributor-level account can store HTML/JavaScript within map-related fields in Pronamic Google Maps and that content may later be rendered to other users without proper escaping. The consequence is attacker-controlled script execution in the context of your site origin.
Although Contributors usually cannot publish, many sites display contributor content via previews, internal lists, or public embeds; these display paths are frequently sufficient to make stored XSS a reliable and impactful attack vector.
This post explains the vulnerability, realistic exploit scenarios, detection steps, remediation actions, immediate virtual-patch examples, and long-term hardening and incident response guidance from a Hong Kong security practitioner’s perspective.
Technical overview
What is stored XSS?
Stored (persistent) XSS happens when user-supplied data is saved server-side (database or filesystem) and later embedded into pages without proper output encoding. When a browser renders that malicious content, the script runs with the site’s origin privileges (cookies, same-origin access, etc.).
Where this plugin was vulnerable
The plugin exposes fields for map entries (titles, descriptions, marker labels, info-window content, shortcodes, and meta fields). In affected releases (≤ 2.4.1), one or more of these fields can be stored and later output without sufficient sanitization or escaping. A Contributor can create or edit a map entry with markup or JavaScript that becomes persistent in the site database and gets rendered to other users.
Likely vectors (examples)
- Map title or description fields that accept HTML and render on the front end.
- Marker labels or info-window content serialized to postmeta and later printed verbatim.
- Back-end listings where contributor entries are shown to editors/administrators without escaping.
Why Contributor privilege matters
Contributor accounts can create content and, while they typically cannot publish, many sites allow previews or direct rendering of contributor-created content. If contributor content is visible to higher-privilege users or to the public, stored XSS can be exploited to target those users.
Realistic exploitation scenarios
- Public content injection
A contributor adds a marker info window containing a script. When the map is embedded on a public page, visitors load and execute the script. Attackers can perform client-side redirects, inject adverts, or attempt data harvesting. - Administrative compromise
A contributor saves content that appears in an admin list or preview viewed by an editor or admin. The script runs in the admin’s browser and can perform actions in that session (create users, change settings, install plugins) if the admin interacts while the script executes. - Phishing and targeted attacks
Scripts can display fake admin dialogs to steal credentials or send forged requests to authenticated endpoints for data exfiltration.
Detecting whether you’re affected or exploited
1) Check plugin version
- WordPress Admin: Plugins → Installed Plugins → Pronamic Google Maps. If version ≤ 2.4.1, you are vulnerable.
- WP‑CLI:
wp plugin list --status=active | grep pronamic-google-maps
2) Quick database search for suspicious HTML/JS
Run these queries from your hosting control panel or via WP‑CLI with appropriate DB access. Adjust table prefixes if you use custom prefixes.
-- Search wp_posts (post_content, post_title)
SELECT ID, post_type, post_title FROM wp_posts
WHERE post_content LIKE '%
3) Scan for injected content in the front end
- Crawl public pages and map embeds looking for script tags in map containers or marker info windows.
- Use curl to fetch rendered map pages and search for “/is', '', $content);
$content = preg_replace('/on\w+\s*=\s*"([^"]*)"/is', '', $content);
}
return $content;
}
?>
D. Block common XSS payloads in input fields
On save actions, reject parameters that include “', '') WHERE post_content REGEXP '