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

CVE-2025-9540

CVE-2025-9540 Cross-Site Scripting in Markup markdown
📅 PUBLISHED: 2025-09-22 06:00 UTC 🔄 UPDATED: 2026-08-13 10:06 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.06%
👁️
0.06% probability
1.6× above the median CVE
Tier: LOW
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 0.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
SOON
PENDING NVD
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-9540 is a Stored Cross-Site Scripting (XSS) vulnerability in the Markup Markdown WordPress plugin, affecting versions before 3.20.10. The vulnerability allows users with the contributor role and above to inject arbitrary JavaScript into links, which is then stored and executed in the browsers of other users viewing the content. This can lead to session hijacking, data theft, or defacement. The vulnerability is classified under CWE-79 (Improper Neutralization of Input During Web Page Generation). No public exploit code or proof-of-concept is currently available, but the risk is elevated due to the plugin's widespread use in WordPress ecosystems.

⚡ 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 plugin is distributed via the official WordPress plugin repository. Users should verify they are running version 3.20.10 or later. No known supply chain compromise has been reported, but the plugin's update mechanism should be trusted only from the official repository.

CVSS Breakdown & Threat Level

  • CVSS Score: 0.0 (NVD base score not assigned; estimated based on vector)
  • Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
  • Attack Vector: Network
  • Attack Complexity: Low
  • Privileges Required: Low (contributor role)
  • User Interaction: None
  • Scope: Unchanged
  • Confidentiality Impact: Low
  • Integrity Impact: Low
  • Availability Impact: None
  • Threat Level: Medium (due to low privileges required and no user interaction needed for stored XSS)

Deep Dive & Mechanics

The vulnerability resides in the Markup Markdown plugin's handling of Markdown links. The plugin fails to sanitize or escape the URL portion of Markdown link syntax (e.g., [text](url)). An attacker with contributor-level access can craft a link where the URL contains a javascript: protocol handler, such as:

[Click me](javascript:alert('XSS'))

When the plugin renders this Markdown into HTML, it outputs an anchor tag with the malicious href attribute. Because the plugin does not validate or sanitize the URL scheme, the browser executes the JavaScript when the link is clicked. Since the content is stored in the WordPress database, any user viewing the post or page will be exposed to the attack.

The vulnerability is triggered without any user interaction beyond viewing the content, making it a classic stored XSS. The contributor role is the minimum required, but any higher role (author, editor, admin) can also exploit it.

Vulnerable vs. Patched Code

Vulnerable Code (before 3.20.10): The plugin likely uses a function like preg_replace or a custom parser that does not filter the href attribute. Example vulnerable logic:

// Vulnerable: no sanitization of URL
$html = preg_replace('/\[([^\]]+)\]\(([^)]+)\)/', '<a href="$2">$1</a>', $markdown);

Patched Code (version 3.20.10): The patched version adds a check to reject or escape javascript: and other dangerous protocols. Example fix:

// Patched: sanitize URL
$url = filter_var($url, FILTER_VALIDATE_URL);
if ($url === false || preg_match('/^javascript:/i', $url)) {
    $url = '#';
}
$html = preg_replace('/\[([^\]]+)\]\(([^)]+)\)/', '<a href="' . esc_url($url) . '">$1</a>', $markdown);

The esc_url() function in WordPress strips dangerous protocols, and the explicit check prevents javascript: from being used.

Exploitation & Lab Setup

Red Team (Exploitation)

  1. Prerequisites: WordPress instance with Markup Markdown plugin version < 3.20.10. Attacker must have a contributor account.
  2. Steps:
    • Log in as a contributor.
    • Create a new post or page.
    • In the content editor (Text mode), insert the following Markdown:
      [Click me](javascript:alert(document.cookie))
      
    • Publish or save the post.
    • Any user viewing the post will see a link. Clicking it triggers the JavaScript.
  3. Advanced Payload: To steal cookies without user click (auto-execute), use an image tag or other techniques, but the vulnerability is link-based. For stored XSS without click, consider using onmouseover or other event handlers if the plugin allows HTML injection.

Blue Team (Detection & Hardening)

  1. Detection:
    • Monitor WordPress logs for posts containing javascript: in the content.
    • Use WAF rules to block javascript: in POST requests to wp-admin/post.php.
  2. Hardening:
    • Update the plugin to version 3.20.10 immediately.
    • Restrict contributor roles to trusted users only.
    • Implement Content Security Policy (CSP) headers to block inline JavaScript.
  3. Lab Setup:
    • Install a local WordPress instance with the vulnerable plugin.
    • Create a contributor user and test the exploit.
    • Verify the patch by upgrading and re-testing.

Indicators of Compromise (IOCs)

  • Network: HTTP requests containing javascript: in the post_content parameter.
  • File: Modified WordPress posts with javascript: in the post_content column of the wp_posts table.
  • Log: WordPress audit logs showing posts created by contributor users with suspicious content.
  • Browser: Execution of JavaScript from javascript: links in WordPress pages.

Detection Engineering

YARA Rule

rule CVE_2025_9540_Stored_XSS {
    meta:
        description = "Detects stored XSS payloads in WordPress Markup Markdown plugin"
        author = "Valters IT"
        date = "2025-04-10"
        reference = "CVE-2025-9540"
    strings:
        $payload = /\[.*\]\(javascript:.*\)/
    condition:
        $payload
}

Sigma Rule

title: CVE-2025-9540 Stored XSS in Markup Markdown Plugin
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects attempts to exploit stored XSS via javascript: links in WordPress posts
author: Valters IT
logsource:
    category: webserver
    product: wordpress
detection:
    selection:
        http.method: POST
        http.url: '/wp-admin/post.php'
        http.body: 'javascript:'
    condition: selection
falsepositives:
    - Legitimate use of javascript: in code snippets (rare)
level: high

Suricata Rule

alert http any any -> any any (msg:"CVE-2025-9540 Stored XSS in Markup Markdown Plugin"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/post.php"; http_uri; content:"javascript:"; http_client_body; sid:1000001; rev:1;)

Remediation & Mitigation

  1. Immediate: Upgrade the Markup Markdown plugin to version 3.20.10 or later.
  2. Workaround: If upgrade is not possible, disable the plugin or restrict contributor roles to trusted users only.
  3. Long-term: Implement a Web Application Firewall (WAF) rule to block javascript: in POST data. Enforce Content Security Policy (CSP) headers to prevent inline script execution.
  4. Validation: After patching, verify that no malicious posts exist in the database. Use the YARA rule above to scan the wp_posts table.

Valters IT
Securing Digital Frontiers

💣 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-9540/ · 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.