CVE-2025-31063
Executive Summary
CVE-2025-31063 is a Missing Authorization vulnerability in the WordPress plugin Wishlist by redqteam, affecting versions up to and including 2.1.0. This flaw allows an unauthenticated attacker to exploit incorrectly configured access control security levels, potentially leading to unauthorized data access or modification of wishlist entries. The vulnerability has a CVSS score of 4.3 (Medium) and an EPSS score of 0.0%, indicating low exploitation likelihood at this time. No public proof-of-concept (PoC) or patch is currently available.
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 are advised to monitor the plugin’s update channel for a patched version. Since no patch is available, consider disabling the plugin or implementing a Web Application Firewall (WAF) rule to block exploitation attempts.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
- Base Score: 4.3 (Medium)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: None (UI:N)
- Scope: Unchanged (S:U)
- Confidentiality Impact: None (C:N)
- Integrity Impact: Low (I:L)
- Availability Impact: None (A:N)
Threat Level: Medium. The vulnerability is easy to exploit remotely without authentication, but the impact is limited to low integrity compromise (e.g., modifying wishlist data). No public exploit code exists, reducing immediate risk.
Deep Dive & Mechanics
The vulnerability resides in the Wishlist plugin’s REST API endpoints or AJAX handlers that fail to properly verify user permissions before processing requests. Specifically, functions that create, read, update, or delete wishlist items do not enforce capability checks (e.g., current_user_can()). This allows any unauthenticated user to send crafted HTTP requests to manipulate wishlist data belonging to other users.
Root Cause: The plugin uses wp_ajax_nopriv_* hooks without additional authorization checks, or implements custom nonce verification that can be bypassed. The missing current_user_can() or wp_verify_nonce() call enables unauthorized actions.
Attack Vector: An attacker sends a POST request to the vulnerable endpoint with parameters such as action, wishlist_id, product_id, etc. The server processes the request without verifying the user’s identity or ownership of the wishlist.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical comparison based on common WordPress authorization patterns.
Vulnerable Code (wishlist.php):
add_action('wp_ajax_nopriv_wishlist_add_item', 'wishlist_add_item');
function wishlist_add_item() {
$product_id = intval($_POST['product_id']);
// Missing authorization check
$wishlist = get_user_wishlist(get_current_user_id());
$wishlist->add_item($product_id);
wp_send_json_success();
}
Patched Code (wishlist.php):
add_action('wp_ajax_nopriv_wishlist_add_item', 'wishlist_add_item');
function wishlist_add_item() {
if (!is_user_logged_in()) {
wp_send_json_error('Unauthorized', 403);
}
if (!wp_verify_nonce($_POST['_wpnonce'], 'wishlist_nonce')) {
wp_send_json_error('Invalid nonce', 403);
}
$product_id = intval($_POST['product_id']);
$wishlist = get_user_wishlist(get_current_user_id());
$wishlist->add_item($product_id);
wp_send_json_success();
}
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites: A WordPress site with Wishlist plugin version <= 2.1.0.
Exploit Steps:
- Identify the vulnerable endpoint (e.g.,
/wp-admin/admin-ajax.php). - Craft a POST request to add a product to another user’s wishlist:
curl -X POST http://target.com/wp-admin/admin-ajax.php \
-d "action=wishlist_add_item&product_id=123&wishlist_id=456"
- To read wishlist data, use:
curl -X POST http://target.com/wp-admin/admin-ajax.php \
-d "action=wishlist_get_items&wishlist_id=456"
Note: No public exploit code is available; this is a conceptual demonstration.
Blue Team (Detection & Defense)
Detection:
- Monitor for unusual POST requests to
/wp-admin/admin-ajax.phpwithactionparameters containingwishlist_*. - Look for requests without a valid
_wpnonceparameter or with missing authentication cookies.
Defense:
- Disable the plugin until a patch is released.
- Implement a WAF rule to block requests to
admin-ajax.phpwithactionstarting withwishlist_from unauthenticated users. - Use a security plugin (e.g., Wordfence) to enforce capability checks.
Indicators of Compromise (IOCs)
- Network IOCs:
- POST requests to
/wp-admin/admin-ajax.phpwithaction=wishlist_*parameters. - Repeated requests with varying
wishlist_idorproduct_idvalues.
- POST requests to
- File IOCs:
- Modified wishlist entries in the database (e.g.,
wp_wishlist_itemstable).
- Modified wishlist entries in the database (e.g.,
- Log IOCs:
- PHP error logs showing
Undefined index: _wpnonceor similar warnings.
- PHP error logs showing
Detection Engineering
YARA Rule
rule CVE_2025_31063_Wishlist_Exploit {
meta:
description = "Detects exploitation attempts of CVE-2025-31063 in WordPress Wishlist plugin"
author = "Valters IT"
date = "2025-04-01"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-31063"
strings:
$ajax = "admin-ajax.php" nocase
$action = "action=wishlist_" nocase
$product = "product_id=" nocase
$wishlist = "wishlist_id=" nocase
condition:
all of them
}
Sigma Rule
title: CVE-2025-31063 Wishlist Plugin Exploitation
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects unauthorized access to Wishlist plugin endpoints
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
c-uri: '/wp-admin/admin-ajax.php'
cs-uri-query|contains: 'action=wishlist_'
condition: selection
falsepositives:
- Legitimate plugin usage by authenticated users
level: medium
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-31063 Wishlist Plugin Exploitation Attempt";
flow:to_server,established;
content:"POST"; http_method;
content:"/wp-admin/admin-ajax.php"; http_uri;
content:"action=wishlist_"; http_client_body;
classtype:attempted-admin;
sid:1000001;
rev:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patched version is released.
- Implement a WAF rule to block unauthenticated requests to
admin-ajax.phpwithactionparameters starting withwishlist_. - Monitor logs for exploitation attempts.
Long-term Fix:
- Apply the vendor patch when available (check the WordPress plugin repository).
- If the plugin is abandoned, consider migrating to an alternative wishlist plugin with active security maintenance.
Workaround:
- Add a custom function to your theme’s
functions.phpto enforce authorization:
add_action('wp_ajax_nopriv_wishlist_add_item', function() {
wp_send_json_error('Unauthorized', 403);
}, 1);
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.