CVE-2025-22720
Executive Summary
CVE-2025-22720 is a Missing Authorization vulnerability in the Booking and Rental Manager for WooCommerce WordPress plugin by magepeopleteam. This flaw allows unauthenticated attackers to exploit incorrectly configured access control security levels, potentially leading to unauthorized data access or manipulation of booking and rental records. The vulnerability affects all versions up to and including 2.2.1. With a CVSS score of 5.8 (Medium), the risk is elevated due to the lack of required authentication and the plugin's widespread use in e-commerce environments. No public proof-of-concept (PoC) or exploit code is currently available, but the absence of a patch from the vendor increases the urgency for defensive measures.
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
WordPress Ecosystem Context
This vulnerability is specific to the WordPress plugin ecosystem. It does not affect Apache, Nginx, or other web server software. The flaw resides in the plugin's REST API endpoints or AJAX handlers that fail to properly verify user capabilities before processing requests.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N
- Base Score: 5.8 (Medium)
- Attack Vector: Network (AV:N) – Exploitable remotely.
- Attack Complexity: Low (AC:L) – No special conditions required.
- Privileges Required: None (PR:N) – No authentication needed.
- User Interaction: None (UI:N) – No victim action required.
- Scope: Unchanged (S:U) – Impact confined to the vulnerable component.
- Confidentiality Impact: Low (C:L) – Limited data exposure.
- Integrity Impact: Low (I:L) – Limited data modification.
- Availability Impact: None (A:N) – No denial of service.
Threat Level: Medium. While the CVSS score is moderate, the lack of authentication and the potential for data leakage or manipulation in a WooCommerce environment (e.g., booking details, customer info) makes this a priority for patching or mitigation.
Deep Dive & Mechanics
The vulnerability stems from missing authorization checks in the plugin's REST API or AJAX endpoints. The plugin likely exposes functions for creating, reading, updating, or deleting bookings and rentals without verifying that the requesting user has the appropriate WordPress capabilities (e.g., manage_options, edit_posts). Attackers can send crafted HTTP requests to these endpoints to:
- View all bookings and rental records (confidentiality breach).
- Modify booking statuses, dates, or customer details (integrity breach).
- Delete bookings or rental items (potential data loss).
The plugin uses wp_ajax_ and wp_ajax_nopriv_ hooks, but the latter (for unauthenticated users) may incorrectly grant access to privileged actions. Alternatively, the plugin may rely on client-side checks that can be bypassed.
Attack Flow:
- Identify the vulnerable endpoint (e.g.,
/wp-json/booking/v1/bookingsoradmin-ajax.php?action=booking_action). - Send a GET or POST request without any authentication token or nonce.
- The server processes the request due to missing
current_user_can()checks. - The attacker receives or modifies sensitive data.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical comparison based on common WordPress authorization patterns.
Vulnerable Code (PHP):
add_action('wp_ajax_nopriv_get_all_bookings', 'get_all_bookings');
function get_all_bookings() {
global $wpdb;
$results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}booking_rental_bookings");
wp_send_json_success($results);
}
Patched Code (PHP):
add_action('wp_ajax_get_all_bookings', 'get_all_bookings');
add_action('wp_ajax_nopriv_get_all_bookings', 'get_all_bookings');
function get_all_bookings() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized', 403);
}
global $wpdb;
$results = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}booking_rental_bookings");
wp_send_json_success($results);
}
The patched version removes the nopriv hook for privileged actions and adds a capability check.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A WordPress site with Booking and Rental Manager <= 2.2.1 installed and active.
- Network access to the target.
Steps:
- Enumerate Endpoints: Use a tool like Burp Suite or curl to discover AJAX actions. Common patterns include
booking_action,rental_action, or REST routes under/wp-json/booking/v1/. - Craft Exploit Request: Send an unauthenticated GET request to a vulnerable endpoint.
curl -X GET "http://target.com/wp-admin/admin-ajax.php?action=booking_get_all" -H "User-Agent: Mozilla/5.0"
- Verify Response: If the response contains JSON data (e.g., booking records), the vulnerability is confirmed.
Example Exploit (Python):
import requests
target = "http://target.com/wp-admin/admin-ajax.php"
params = {"action": "booking_get_all"}
response = requests.get(target, params=params)
if response.status_code == 200 and "data" in response.json():
print("Vulnerable! Data:", response.json())
Blue Team (Defense & Detection)
Detection:
- Monitor for unusual AJAX requests to
admin-ajax.phpwith actions related to booking/rental from unauthenticated users. - Look for spikes in 200 responses to endpoints that should require authentication.
Mitigation:
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-ajax.phpwith suspiciousactionparameters from unauthenticated IPs. - Disable the plugin until a patch is available.
- Use a WordPress security plugin (e.g., Wordfence) to add virtual patching.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests to
/wp-admin/admin-ajax.phpwithactionparameters containingbooking,rental, orbooking_rental. - Unauthenticated GET/POST requests to
/wp-json/booking/v1/endpoints.
- HTTP requests to
- File IOCs:
- Modified plugin files (e.g.,
booking-and-rental-manager-for-woocommerce/directory) with unauthorized changes.
- Modified plugin files (e.g.,
- Log IOCs:
- WordPress debug log entries showing
wp_ajax_nopriv_hooks being triggered for privileged actions. - Web server access logs with 200 responses to
admin-ajax.phpfrom IPs not associated with admin users.
- WordPress debug log entries showing
Detection Engineering
YARA Rule
rule CVE_2025_22720_Booking_Rental_Manager {
meta:
description = "Detects vulnerable Booking and Rental Manager plugin files"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2025-22720"
strings:
$vuln_func = "wp_ajax_nopriv_" nocase
$vuln_action = "booking" nocase
$vuln_action2 = "rental" nocase
condition:
$vuln_func and ($vuln_action or $vuln_action2)
}
Sigma Rule
title: CVE-2025-22720 - Unauthenticated AJAX Access to Booking and Rental Manager
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects unauthenticated requests to vulnerable AJAX actions in Booking and Rental Manager plugin
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'GET'
cs-uri-query|contains: 'admin-ajax.php'
cs-uri-query|contains|all:
- 'action=booking'
- 'action=rental'
condition: selection
falsepositives:
- Legitimate admin actions (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-22720 - Unauthenticated AJAX Access to Booking and Rental Manager"; flow:to_server; content:"GET"; http_method; content:"admin-ajax.php"; http_uri; content:"action=booking"; http_uri; nocase; content:"action=rental"; http_uri; nocase; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the Plugin: Deactivate and delete the Booking and Rental Manager plugin until a patch is released.
- Virtual Patching: Use a WAF to block requests to
admin-ajax.phpwithactionparameters containingbookingorrentalfrom unauthenticated users. - Monitor Logs: Review web server and WordPress logs for signs of exploitation.
Long-Term Actions:
- Vendor Contact: Reach out to magepeopleteam for a security update. If unresponsive, consider forking the plugin or switching to an alternative.
- Code Audit: If you must continue using the plugin, manually add
current_user_can()checks to all AJAX and REST endpoints. - Update Policy: Implement a policy to only use plugins with active security support.
Workaround (Code-Level):
Add the following to your theme's functions.php to block unauthenticated access to vulnerable actions:
add_action('init', function() {
if (defined('DOING_AJAX') && DOING_AJAX && !is_user_logged_in()) {
$blocked_actions = array('booking_get_all', 'booking_update', 'rental_delete');
if (isset($_REQUEST['action']) && in_array($_REQUEST['action'], $blocked_actions)) {
wp_die('Unauthorized', 403);
}
}
});
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.