CVE-2025-23660 Overview
CVE-2025-23660 is a Cross-Site Request Forgery (CSRF) vulnerability in the waltercerrudo MFPlugin WordPress plugin that leads to Stored Cross-Site Scripting (XSS). The flaw affects all versions of MFPlugin up to and including 1.3. An attacker can craft a malicious request that, when triggered by an authenticated administrator visiting an attacker-controlled page, injects persistent JavaScript into the WordPress site. The stored payload then executes in the browser of any user who later loads the affected page. The vulnerability is tracked under CWE-352: Cross-Site Request Forgery and is documented in the Patchstack WordPress Vulnerability Report.
Critical Impact
A successful attack chains CSRF with Stored XSS, allowing an unauthenticated remote attacker to persistently inject scripts into a WordPress site once a privileged user is tricked into visiting a malicious page.
Affected Products
- waltercerrudo MFPlugin for WordPress
- MFPlugin versions from n/a through 1.3
- WordPress installations with MFPlugin <= 1.3 enabled
Discovery Timeline
- 2025-01-16 - CVE-2025-23660 published to NVD
- 2026-04-23 - Last updated in NVD database
Technical Details for CVE-2025-23660
Vulnerability Analysis
The vulnerability combines two distinct weaknesses in MFPlugin. First, plugin endpoints that modify state do not validate WordPress anti-CSRF nonces or referers. Second, user-supplied input written to plugin storage is not sanitized or output-encoded. When chained, an attacker forges a request that writes attacker-controlled JavaScript into a stored field. That script later renders to anyone viewing the affected admin or front-end page.
The attack requires user interaction, since a privileged WordPress user must visit the malicious page while authenticated. The scope changes after exploitation because the injected script can act within the WordPress origin and affect other users. Confidentiality, integrity, and availability impacts are limited to what JavaScript executing in a victim browser session can accomplish.
Root Cause
The root cause is missing CSRF protection on a state-changing handler combined with missing output encoding on stored data. WordPress provides wp_nonce_field(), check_admin_referer(), and wp_verify_nonce() to mitigate CSRF, along with esc_html(), esc_attr(), and sanitize_text_field() for output. MFPlugin <= 1.3 does not apply these controls consistently on the affected endpoints.
Attack Vector
The attacker hosts a page containing a hidden form or fetch() call targeting the vulnerable MFPlugin endpoint. The attacker then lures a logged-in WordPress administrator to that page through phishing or a watering-hole link. The browser submits the forged request with the administrator's authentication cookies. The plugin processes the request and stores the attacker's JavaScript payload. The payload executes on every subsequent page load that renders the stored value, enabling session theft, account takeover, or further administrative actions in the victim's context.
No verified public exploit code is currently published. Technical details are available in the Patchstack WordPress Vulnerability Report.
Detection Methods for CVE-2025-23660
Indicators of Compromise
- Unexpected <script> tags, onerror= handlers, or javascript: URIs in MFPlugin-managed content stored in wp_options or plugin-specific tables.
- HTTP POST requests to MFPlugin endpoints with an Origin or Referer header pointing to a third-party domain.
- Administrator browser sessions issuing unexpected outbound requests immediately after loading a WordPress admin page.
- New or modified WordPress administrator accounts created shortly after an admin visited an external link.
Detection Strategies
- Inventory WordPress installations and flag any running MFPlugin at version 1.3 or earlier.
- Inspect web server logs for POST requests to MFPlugin handlers that lack a valid _wpnonce parameter.
- Scan plugin database fields for HTML or JavaScript markup that should not appear in administrator-supplied configuration values.
- Correlate phishing email telemetry with subsequent administrator browser activity targeting /wp-admin/.
Monitoring Recommendations
- Enable WordPress audit logging to capture changes made through MFPlugin and the identity of the acting user.
- Forward web server access logs and WordPress logs to a centralized analytics platform for cross-source correlation.
- Alert on Content Security Policy (CSP) violations indicating inline script execution on plugin-managed pages.
- Monitor for outbound connections from administrator browsers to domains that match known credential-harvesting infrastructure.
How to Mitigate CVE-2025-23660
Immediate Actions Required
- Disable or remove MFPlugin until a fixed version is confirmed by the vendor, since no patched release is referenced in the advisory.
- Restrict /wp-admin/ access to known administrator IP addresses using web server or WAF rules.
- Force a password reset and session invalidation for all WordPress administrator accounts.
- Audit plugin-managed content and remove any unexpected script tags or event handlers.
Patch Information
The Patchstack advisory lists affected versions through 1.3 with no fixed version published at the time of disclosure. Monitor the WordPress plugin repository and the vendor's distribution channel for an update beyond 1.3. Until a verified patch exists, deactivation is the only reliable remediation.
Workarounds
- Replace MFPlugin with an actively maintained alternative that implements WordPress nonces and output escaping.
- Deploy a Web Application Firewall rule that blocks POST requests to MFPlugin endpoints lacking a valid _wpnonce token.
- Apply a strict Content Security Policy that disallows inline scripts on WordPress admin and rendered plugin pages.
- Require administrators to use a dedicated browser profile for /wp-admin/ work to reduce cross-site exposure.
# Example WAF rule (ModSecurity) blocking nonce-less POSTs to MFPlugin
SecRule REQUEST_METHOD "@streq POST" \
"chain,phase:2,deny,status:403,id:1002366,\
msg:'CVE-2025-23660 - MFPlugin POST without nonce'"
SecRule REQUEST_URI "@contains /wp-admin/admin.php" \
"chain"
SecRule ARGS_NAMES "@rx ^(mfplugin|page=mfplugin)" \
"chain"
SecRule &ARGS:_wpnonce "@eq 0"
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

