CVE-2025-31773
Executive Summary
CVE-2025-31773 is a Missing Authorization vulnerability in the Cedcommerce Ship Per Product WordPress plugin, affecting versions up to and including 2.1.0. This flaw allows unauthenticated attackers to access functionality that should be constrained by Access Control Lists (ACLs), potentially exposing sensitive shipping configuration data or enabling unauthorized actions within the WordPress ecosystem. The vulnerability has a CVSS score of 5.3 (Medium) and a low EPSS probability of 0.0%, indicating it is not currently being actively exploited in the wild. No public proof-of-concept (PoC) code or patch is available at this time.
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 resides in a WordPress plugin distributed via the official WordPress plugin repository and third-party marketplaces. As a WordPress ecosystem component, it is not managed through traditional package managers like NPM or PyPI. However, the risk to the supply chain is significant: compromised sites can lead to data exfiltration, defacement, or further lateral movement within hosting environments. Administrators should treat this as a high-priority update once a patch is released.
CVSS Breakdown & Threat Level
- CVSS Score: 5.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: Low
- Integrity Impact: None
- Availability Impact: None
The threat level is Medium due to the low complexity and no required privileges, but the impact is limited to low confidentiality loss. The lack of a public exploit and low EPSS score reduces immediate risk, but the absence of a patch increases long-term exposure.
Deep Dive & Mechanics
The vulnerability stems from improper authorization checks in the ship-per-product plugin's AJAX handlers or REST API endpoints. The plugin likely exposes functions for managing shipping rules, rates, or product associations without verifying user capabilities (e.g., manage_options or edit_posts). An unauthenticated attacker can send crafted HTTP requests to these endpoints, bypassing WordPress's built-in capability checks.
Root Cause: The plugin fails to call current_user_can() or similar authorization functions before executing sensitive operations. This is a classic CWE-862 (Missing Authorization) flaw.
Attack Vector: The attacker sends a GET or POST request to a vulnerable endpoint (e.g., /wp-admin/admin-ajax.php?action=ship_per_product_get_rates) without any authentication token. The server processes the request and returns data or performs actions intended only for administrators.
Impact: An attacker could:
- Retrieve shipping configuration data (e.g., rates, zones, product mappings).
- Modify shipping rules if the endpoint allows writes.
- Potentially escalate to further attacks if the plugin stores sensitive API keys or credentials.
Vulnerable vs. Patched Code
Since no patch is available, we can only hypothesize the fix. The vulnerable code likely resembles:
// Vulnerable: No capability check
add_action('wp_ajax_nopriv_ship_per_product_get_rates', 'get_rates_callback');
function get_rates_callback() {
// Process request without checking user permissions
$rates = get_option('ship_per_product_rates');
wp_send_json($rates);
}
A patched version would include:
// Patched: Added capability check
add_action('wp_ajax_nopriv_ship_per_product_get_rates', 'get_rates_callback');
function get_rates_callback() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized', 403);
}
$rates = get_option('ship_per_product_rates');
wp_send_json($rates);
}
The fix ensures only users with the manage_options capability (typically administrators) can access the endpoint.
Exploitation & Lab Setup
Red Team
Prerequisites: A WordPress site with the Ship Per Product plugin version <= 2.1.0 installed and active.
Exploitation Steps:
Identify Vulnerable Endpoints: Use a tool like Burp Suite or curl to enumerate AJAX actions. Common patterns include
ship_per_product_*orspp_*.Craft Request: Send an unauthenticated GET request to:
GET /wp-admin/admin-ajax.php?action=ship_per_product_get_rates HTTP/1.1 Host: target-site.comAnalyze Response: If the server returns JSON data containing shipping rates or configuration, the endpoint is vulnerable.
Automate with Script:
#!/bin/bash TARGET="http://target-site.com" curl -s "$TARGET/wp-admin/admin-ajax.php?action=ship_per_product_get_rates" | jq .
Lab Setup:
- Use a local WordPress instance (e.g., via Docker or XAMPP).
- Install the vulnerable plugin version 2.1.0 from a trusted archive.
- Ensure no authentication is required to access the admin area.
Blue Team
Detection Steps:
Monitor Logs: Check web server access logs for requests to
admin-ajax.phpwith suspiciousactionparameters (e.g.,ship_per_product_*) from unauthenticated IPs.Honeypot Endpoints: Deploy a fake endpoint that mimics the vulnerable action and alerts on access.
Network Traffic Analysis: Look for repeated GET/POST requests to
/wp-admin/admin-ajax.phpwithout a validwpnonceor cookie.
Mitigation in Lab:
- Immediately disable the plugin if no patch is available.
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-ajax.phpwithactionparameters matchingship_per_product_*unless authenticated.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests to
/wp-admin/admin-ajax.phpwithaction=ship_per_product_*parameters. - Unusual JSON responses containing shipping configuration data.
- HTTP requests to
- File IOCs:
- Modified plugin files in
/wp-content/plugins/ship-per-product/. - Unexpected entries in WordPress options table (
wp_options) related to shipping.
- Modified plugin files in
- Behavioral IOCs:
- Unauthorized changes to shipping rates or zones.
- Anonymous access to admin-ajax.php endpoints.
Detection Engineering
YARA Rule
rule CVE_2025_31773_Ship_Per_Product {
meta:
description = "Detects vulnerable Ship Per Product plugin files"
author = "Valters IT"
date = "2025-04-17"
reference = "CVE-2025-31773"
strings:
$vuln_func = "wp_ajax_nopriv_ship_per_product" nocase
$no_auth = "current_user_can" nocase
condition:
$vuln_func and not $no_auth
}
Sigma Rule
title: CVE-2025-31773 - Unauthenticated Access to Ship Per Product AJAX Endpoints
id: 8a9b3c2d-1e5f-4a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects unauthenticated requests to vulnerable Ship Per Product AJAX actions
author: Valters IT
date: 2025/04/17
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'GET'
cs-uri-stem: '/wp-admin/admin-ajax.php'
cs-uri-query|contains: 'action=ship_per_product_'
condition: selection
falsepositives:
- Legitimate admin requests (rare)
level: high
Suricata Rule
alert http any any -> $HOME_NET any (
msg:"CVE-2025-31773 - Unauthenticated Ship Per Product AJAX Access";
flow:to_server,established;
content:"GET"; http_method;
content:"/wp-admin/admin-ajax.php"; http_uri;
content:"action=ship_per_product_"; http_uri;
classtype:attempted-recon;
sid:1000001;
rev:1;
reference:cve,2025-31773;
)
Remediation & Mitigation
Immediate Actions:
- Disable the Plugin: If the plugin is not critical, deactivate and delete it until a patch is released.
- Web Application Firewall (WAF): Block requests to
admin-ajax.phpwithactionparameters starting withship_per_product_unless they include a valid nonce. - Access Controls: Restrict access to
/wp-admin/directory via.htaccessor IP whitelisting.
Long-Term Fix:
- Monitor the Cedcommerce plugin page for an official patch.
- Apply the patch immediately upon release.
- Consider replacing the plugin with an alternative that follows secure coding practices.
Detection Hardening:
- Enable detailed logging for
admin-ajax.phprequests. - Deploy the provided YARA, Sigma, and Suricata rules in your SIEM/IDS.
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.