CVE-2025-14948
Executive Summary
CVE-2025-14948 is a missing authorization vulnerability in the WordPress plugin miniOrange OTP Verification and SMS Notification for WooCommerce, affecting all versions up to and including 4.3.8. The flaw resides in the enable_wc_sms_notification AJAX action, which lacks a proper capability check. This allows any unauthenticated attacker to enable or disable SMS notification settings for WooCommerce orders, leading to unauthorized modification of data. The vulnerability has a CVSS score of 5.3 (Medium) and an EPSS score of 0.0%, indicating low exploitation likelihood at this time. No public proof-of-concept or exploit code has been released.
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 and apply patches as soon as they become available. Since the patch status is currently unknown, administrators should consider disabling the plugin or implementing virtual patching via a Web Application Firewall (WAF).
CVSS Breakdown & Threat Level
- CVSS Score: 5.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: None
- Integrity Impact: Low
- Availability Impact: None
The low integrity impact reflects the ability to toggle SMS notification settings, which could disrupt order notifications but does not allow data theft or full system compromise.
Deep Dive & Mechanics
The vulnerability exists in the enable_wc_sms_notification AJAX handler within the miniOrange plugin. This handler is intended to allow administrators to enable or disable SMS notifications for WooCommerce orders. However, the code fails to call current_user_can() or any other authorization check before processing the request. As a result, any unauthenticated user can send a POST request to the WordPress AJAX endpoint with the action parameter set to enable_wc_sms_notification and a status parameter (e.g., 1 or 0) to toggle the setting.
The affected code path is typically registered via add_action('wp_ajax_enable_wc_sms_notification', ...) and add_action('wp_ajax_nopriv_enable_wc_sms_notification', ...). The nopriv hook is the critical issue, as it allows unauthenticated access. The handler then updates a WordPress option (likely mo_wc_sms_notification_enabled) without verifying the user’s role.
Vulnerable vs. Patched Code
Vulnerable Code (<= 4.3.8):
add_action('wp_ajax_enable_wc_sms_notification', 'mo_enable_wc_sms_notification');
add_action('wp_ajax_nopriv_enable_wc_sms_notification', 'mo_enable_wc_sms_notification');
function mo_enable_wc_sms_notification() {
$status = sanitize_text_field($_POST['status']);
update_option('mo_wc_sms_notification_enabled', $status);
wp_die();
}
Patched Code (Hypothetical Fix):
add_action('wp_ajax_enable_wc_sms_notification', 'mo_enable_wc_sms_notification');
// Remove the nopriv hook to block unauthenticated access
function mo_enable_wc_sms_notification() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized', 403);
}
$status = sanitize_text_field($_POST['status']);
update_option('mo_wc_sms_notification_enabled', $status);
wp_die();
}
The fix involves removing the wp_ajax_nopriv_ hook and adding a capability check (manage_options) to ensure only administrators can modify the setting.
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- A WordPress site with the miniOrange OTP Verification and SMS Notification plugin (<= 4.3.8) installed and activated.
- No authentication required.
Exploitation Steps:
- Identify the target WordPress site’s AJAX endpoint (typically
/wp-admin/admin-ajax.php). - Send a POST request with the following parameters:
action:enable_wc_sms_notificationstatus:0(to disable) or1(to enable)
Example using cURL:
curl -X POST https://target.com/wp-admin/admin-ajax.php \
-d "action=enable_wc_sms_notification&status=0"
Expected Outcome: The SMS notification setting for WooCommerce orders is toggled without authentication.
Blue Team (Defender)
Detection Steps:
- Monitor AJAX requests to
/wp-admin/admin-ajax.phpwithaction=enable_wc_sms_notificationfrom unauthenticated sources. - Check WordPress options table for unexpected changes to
mo_wc_sms_notification_enabled. - Review web server logs for POST requests to
admin-ajax.phpwith the suspicious action parameter.
Honeypot Setup:
- Create a decoy WordPress site with the vulnerable plugin and monitor for unauthorized AJAX calls.
- Use a WAF rule to block requests containing
action=enable_wc_sms_notificationfrom non-admin IPs.
Indicators of Compromise (IOCs)
- Network IOCs:
- POST requests to
/wp-admin/admin-ajax.phpwith body containingaction=enable_wc_sms_notification - Source IPs not matching known admin ranges
- POST requests to
- File IOCs:
- Modified WordPress option
mo_wc_sms_notification_enabled(value changed from expected)
- Modified WordPress option
- Log IOCs:
- Web server logs showing
POST /wp-admin/admin-ajax.php HTTP/1.1withaction=enable_wc_sms_notificationand no authentication cookie
- Web server logs showing
Detection Engineering
YARA Rule
rule CVE_2025_14948_miniOrange_AJAX_Missing_Auth {
meta:
description = "Detects exploitation attempts of CVE-2025-14948 in miniOrange OTP Verification plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-14948"
strings:
$ajax_action = "enable_wc_sms_notification"
$ajax_endpoint = "admin-ajax.php"
condition:
$ajax_action and $ajax_endpoint
}
Sigma Rule
title: CVE-2025-14948 - Unauthenticated AJAX Action in miniOrange Plugin
id: 8a3f7c2e-5d1b-4a9f-8c6d-2e3f1a0b9c8d
status: experimental
description: Detects unauthenticated POST requests to admin-ajax.php with the enable_wc_sms_notification action
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: POST
cs-uri-query|contains: admin-ajax.php
cs-uri-query|contains: action=enable_wc_sms_notification
condition: selection
falsepositives:
- Legitimate admin actions (should be rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-14948 - miniOrange AJAX Missing Auth"; flow:to_server,established; http.method; content:"POST"; http.uri; content:"/wp-admin/admin-ajax.php"; http.client_body; content:"action=enable_wc_sms_notification"; classtype:attempted-admin; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if not essential for business operations.
- Apply virtual patching using a WAF to block requests containing
action=enable_wc_sms_notificationfrom unauthenticated users. - Monitor logs for any signs of exploitation.
Long-Term Fix:
- The vendor (miniOrange) must release a patched version that removes the
wp_ajax_nopriv_hook and adds a capability check. Until then, users should consider alternative plugins or custom code fixes.
Workaround:
- Add the following code to the theme’s
functions.phpfile to block unauthenticated access:
add_action('init', function() {
if (defined('DOING_AJAX') && DOING_AJAX && isset($_POST['action']) && $_POST['action'] === 'enable_wc_sms_notification') {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized', 403);
}
}
});
Valters IT – Securing WordPress ecosystems one CVE at a time.
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.