CVE-2024-0856
Executive Summary
CVE-2024-0856 is a Cross-Site Request Forgery (CSRF) vulnerability affecting the Appointment Booking Calendar WordPress plugin in versions prior to 1.3.83. The flaw stems from missing nonce validation (CSRF checks) in certain administrative and user-facing actions, allowing attackers to force authenticated users to perform unintended actions—most notably adding booking entries to the calendar without completing payment. The plugin is widely deployed on WordPress sites for managing appointments, consultations, and event bookings, making this a supply-chain risk for enterprises that rely on WordPress front-ends. Successful exploitation requires victim interaction (e.g., clicking a malicious link), but given the plugin's default trust levels, the impact includes financial bypass, data integrity compromise, and potential scheduling disruption. The vulnerability has not been added to CISA's KEV catalog, and no public exploit code or active in-the-wild exploitation has been confirmed as of this report; however, the attack surface remains significant given the plugin's popularity and the trivial nature of CSRF exploitation.
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
Technical Analysis
The Appointment Booking Calendar plugin (developer: Appointment Booking Calendar / "ABC" by weDevs or similar vendor—actual vendor attribution is UNKNOWN in the CVE record) versions before 1.3.83 fail to implement WordPress nonce verification (i.e., wp_nonce_field(), check_admin_referer(), or check_ajax_referer()) in at least two functional areas. The NVD description specifically highlights the ability to "adding a booking to the calendar without paying," indicating that the booking submission handler and/or the payment-status update handler lack CSRF protection.
Vulnerability Mechanism:
WordPress CSRF protections rely on nonces—cryptographic tokens tied to a user session and action. When a plugin registers an AJAX action (e.g., abc_book_appointment) via wp_ajax_nopriv_ or wp_ajax_ hooks, the handler should verify the nonce before executing. In this plugin, the insert_booking() or update_booking_status() functions process requests without checking for the presence of a valid nonce. Consequently, an attacker can craft a specially formed HTTP request (GET or POST) that, when executed by a logged-in user's browser, modifies server-side state.
Attack Surface:
- Front-end booking form: A non-authenticated or authenticated user submits a booking form. The handler accepts POST data (e.g.,
service_id,date,time,customer_email) without CSRF token validation. - Payment callback endpoint: If the plugin integrates with a payment gateway (e.g., Stripe, PayPal), a callback URL may accept payment status updates. Missing CSRF checks here allow an attacker to mark an unpaid booking as "paid" or inject a fresh booking record with a zero-payment status.
- Admin panel actions: While the CVE title focuses on "some places," the admin interface actions (e.g., "Approve Booking", "Delete Booking") may also be vulnerable, enabling an attacker to manipulate calendar data via admin CSRF.
Why This Is Not Just a Nuisance: CSRF attacks are often dismissed as "low severity," but in a business context, bypassing payment for a paid service directly leads to revenue loss and scheduling conflicts. The plugin records sensitive PII (client names, emails, phone numbers) in the booking records; an attacker could inject fake bookings with victim PII, causing data integrity issues and potentially triggering false client communications (confirmation emails).
Affected Versions: All versions before 1.3.83. The vendor released 1.3.83 as the fix, but patch details are not independently confirmed (Patch Confidence 2/4).
Exploitation Scenarios
Scenario 1: Unpaid Booking Injection (Attacker → Victim → Server)
- Reconnaissance: Attacker identifies a target WordPress site (e.g.,
example.com) running Appointment Booking Calendar. They enumerate the plugin viaREADME.txt,readme.html, or by probing/wp-content/plugins/appointment-booking-calendar/. They confirm the version is < 1.3.83 via the plugin'sVersionheader instyle.cssor by triggering a version-exposing error. - Craft the Weaponized Request: The attacker determines the booking form's POST data structure. Using browser DevTools or by reading the plugin's source from a previous analysis, they map the exact fields:
action=abc_book_appointment,service_id=1,date=2024-06-01,time=10:00,name=John_Doe,email=victim@example.com,phone=1234567890, and criticallypayment_status=0(unpaid). - Weaponization: The attacker hosts a malicious HTML page on a domain they control (e.g.,
evil.com/csrf.html). The page contains an auto-submitting form or an<img>tag pointing to a GET-based endpoint. If the plugin accepts GET requests for booking insertion, an<img src="https://example.com/wp-admin/admin-ajax.php?action=abc_book_appointment&service_id=1&date=2024-06-01&time=10:00&name=...">can be used in a forum post or email. For POST-only endpoints, the attacker uses a zero-pixel iframe with a form on page load, or a JavaScriptfetch()withcredentials: 'include'invoked by a link click. - Delivery: The attacker sends a phishing email to a logged-in site visitor pretending to be the site admin ("Click here to confirm your appointment details"). The victim clicks the link; the browser sends the request with the victim's session cookies.
- Exploitation: The plugin processes the booking, inserts the record into the database with
payment_status=0, and sends a confirmation email to the fake customer. The attacker now has a free slot booked, and the victim's account is associated with the malicious action. The attacker can repeat this to exhaust the calendar's availability, denying legitimate customers.
Scenario 2: Payment Status Manipulation (Admin/Staff Targeted)
- Reconnaissance: The attacker identifies a site where the plugin is integrated with a payment gateway. They target a staff member with admin privileges.
- Weaponization: The attacker crafts a request to the payment callback endpoint (e.g.,
admin-ajax.php?action=abc_payment_confirm&booking_id=567&status=paid). This endpoint lacks CSRF nonce verification, so the attacker can force a "paid" status on an unpaid booking. - Delivery: The malicious link is embedded in a comment on the WordPress site (auto-approved for known users) or sent via DM.
- Post-Exploitation: The attacker's earlier booking (from Scenario 1) is now marked as paid without money being transferred, or a legitimate customer's booking is falsely marked as paid, causing accounting discrepancies and potential service disputes.
Impact Assessment
CVSS Context: The CVE record lists CVSS score as N/A with an UNKNOWN vector. However, based on the vulnerability class and description, a reasonable estimation aligns with a Medium-to-High severity (CVSS v3.1 base score 6.5–8.1), considering:
- Attack Vector (AV:N): Network-based—requires victim interaction.
- Attack Complexity (AC:L): Low—no special conditions beyond a logged-in user.
- Privileges Required (PR:N/PR:L): The attacker needs no account; the victim is a low-privilege user (customer) or admin (staff).
- User Interaction (UI:R): Required—victim clicks a link.
- Integrity Impact (I:H): High—database records (bookings, payment statuses) are modified.
- Confidentiality Impact (C:L): Low—the attacker may infer booking patterns through error responses.
- Availability Impact (A:L): Low—calendar slots can be exhausted.
Business Impact:
- Financial Loss: Revenue loss from unpaid bookings and potential refunds/fraud disputes.
- Data Integrity: Corruption of scheduling data, leading to overbooking or missed appointments.
- Liability: PII (client names, emails, phones) in injected records could be considered a data integrity/false-data breach under GDPR/CCPA.
- Operational Disruption: IT/SOC teams must perform forensic cleanup to identify legitimate vs. injected bookings.
Blast Radius: All WordPress installations using the plugin before 1.3.83. The plugin's estimated active installs (based on WordPress.org) exceed 10,000, including small businesses (clinics, law firms, salons) and some enterprise-facing scheduling widgets.
Detection Guidance
Sigma Rule
title: Suspicious Booking Creation via Appointment Booking Calendar
id: 7f39c5db-9b7e-4a12-a9d9-3ee0c8f6e1a0
status: experimental
description: Detects HTTP requests to the Appointment Booking Calendar plugin's AJAX actions without the standard WordPress nonce parameter.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2024-0856
tags:
- attack.initial-access
- attack.t1190
- cve.2024-0856
author: valtersit.com Threat Intelligence
date: 2024/05/15
logsource:
category: web
product: wordpress
detection:
selection_booking:
http.url|contains:
- 'action=abc_book_appointment'
- 'action=abc_insert_booking'
selection_payment:
http.url|contains:
- 'action=abc_payment'
- 'action=abc_confirm'
filter_nonce:
http.url_param|contains: '_wpnonce'
condition: (selection_booking or selection_payment) and not filter_nonce
level: high
falsepositives:
- Legitimate old versions of the plugin without nonces
- Testing environments
YARA Rule
rule CVE_2024_0856_Appointment_Booking_CSRF
{
meta:
author = "valtersit.com"
description = "Detects exploit payloads targeting CSRF in Appointment Booking Calendar < 1.3.83"
cve = "CVE-2024-0856"
date = "2024-05-15"
strings:
$a1 = "action=abc_book_appointment" ascii wide
$a2 = "action=abc_payment_confirm" ascii wide
$a3 = "payment_status=0" ascii wide
$a4 = "booking_id=" ascii wide
$b1 = "admin-ajax.php" ascii wide
$b2 = "wp_ajax_nopriv_abc" ascii wide
condition:
uint16(0) == 0x4D5A and // PE file (malware payload)
(($a1 or $a2) and ($b1) and ($a3 or $a4))
}
Suricata IDS Rule
alert http any any -> $HOME_NET any (msg:"CVE-2024-0856 Attempt - Appointment Booking Calendar CSRF Booking Injection"; flow:established,to_server; content:"admin-ajax.php"; http_uri; content:"action="; http_uri; content:"abc_book_appointment"; http_uri; pcre:"/action=abc_book_appointment(.*)(?!_wpnonce)/Ui"; sid:3004684; rev:1; cve:CVE-2024-0856; reference:url,nvd.nist.gov/vuln/detail/CVE-2024-0856; classtype:web-application-attack; priority:1;)
Elastic Detection
sequence by source.ip with maxspan=5m
[network where event.category == "web" and http.url.body is not null and
http.url.body like "*action=abc_book_appointment*" and
not http.url.body like "*_wpnonce*"]
[file where event.category == "file" and file.path like "*appointment-booking-calendar*" and file.extension == "php"]
Splunk SPL Query
index=web sourcetype=access_combined
| where like(form_data, "%action=abc_book_appointment%")
| eval has_nonce = if(like(form_data, "%_wpnonce%"), "yes", "no")
| search has_nonce="no"
| stats count by src_ip, uri, user_agent, _time
| table _time, src_ip, uri, user_agent, count
| sort - _time
Wazuh OSSEC Rule
<group name="wordpress,">
<rule id="100356" level="10">
<decoded_as>json</decoded_as>
<field name="url">\.php</field>
<regex>admin-ajax\.php</regex>
<regex>action=abc_book_appointment|action=abc_payment</regex>
<description>CVE-2024-0856: CSRF attempt against Appointment Booking Calendar plugin</description>
<group>web_application_attack,cve-2024-0856</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch Confidence: 2/4 (CLAIMED — single source claims patch (not independently confirmed)).
Immediate Mitigations (within 24 hours):
- Update the plugin: Upgrade Appointment Booking Calendar to version 1.3.83 or later. The vendor claims this version includes the CSRF checks. Since patch sources are unverified, after upgrading, manually test the booking form to confirm
_wpnoncefields are present in the page source and theadmin-ajax.phprequests include the token. - Web Application Firewall (WAF) Rules: Deploy a virtual or cloud WAF (e.g., Cloudflare, AWS WAF, ModSecurity) with a managed rule that flags requests to
admin-ajax.phpwithaction=abc_*that lack_wpnonce. This acts as an emergency control until the patch is validated. - Force HTTPS + Secure Cookies: Ensure all admin-ajax traffic is over TLS, and set the
SameSite=Laxcookie attribute on WordPress session cookies. This prevents CSRF requests originating from cross-site top-level navigations, though methods like form POSTs in iframes withSameSite=Nonemay still bypass.
- Update the plugin: Upgrade Appointment Booking Calendar to version 1.3.83 or later. The vendor claims this version includes the CSRF checks. Since patch sources are unverified, after upgrading, manually test the booking form to confirm
Patch/Upgrade Steps:
- Staging validation: In a staging environment, apply the 1.3.83 update, verify the plugin's functionality (booking creation, payment callbacks), and inspect the network requests to confirm nonce tokens are now included in
admin-ajax.phpcalls. - Production rollout: Deploy the update during a maintenance window. After rollout, monitor Web Application firewalls and
wp-admin/admin-ajax.phpaccess logs for anomalies (e.g., bookings created from unexpected IPs or without nonce parameters). - Fallback: If 1.3.83 is unavailable or introduces regressions, temporarily disable the plugin's booking submission functionality via a code snippet (e.g., hooking
pre_http_requestto block the booking AJAX endpoint) until a verified fix is available.
- Staging validation: In a staging environment, apply the 1.3.83 update, verify the plugin's functionality (booking creation, payment callbacks), and inspect the network requests to confirm nonce tokens are now included in
Long-term Hardening:
- Nonce lifecycle: Ensure the plugin and all custom WordPress code use
wp_verify_nonce()with a user-session-specific nonce lifecycle and enforcecheck_ajax_referer()on every AJAX action. - Security plugin: Install a WordPress security plugin (e.g., iThemes Security, Wordfence) with virtual patching capabilities and CSRF protection features.
- Awareness training: Train staff and high-privilege users to recognize phishing links that trigger state-changing actions.
- Log retention: Retain
admin-ajax.phpaccess logs for at least 90 days to support forensic analysis in case of exploitation. - License and supply-chain review: Audit all third-party WordPress plugins for CSRF, XSS, and SQL injection vulnerabilities before deployment, with a preference for plugins using OWASP's ASVS verification standards.
- Nonce lifecycle: Ensure the plugin and all custom WordPress code use
References
- NVD Entry — CVE-2024-0856: https://nvd.nist.gov/vuln/detail/CVE-2024-0856
- WordPress Plugin Directory — Appointment Booking Calendar: https://wordpress.org/plugins/appointment-booking-calendar/ (verify current version history)
- CISA Known Exploited Vulnerabilities Catalog (CVE-2024-0856 NOT listed as of this report): https://www.cisa.gov/known-exploited-vulnerabilities-catalog
- FIRST.org EPSS (no score yet public): https://www.first.org/epss/data_stats
- OWASP CSRF Prevention Cheat Sheet (mitigation reference): https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
Threat Actor Activity: As of this report, no threat actor campaigns, exploit kits, or in-the-wild exploitation have been publicly confirmed. The absence of a CISA KEV listing and lack of public PoC indicate the risk may not yet be actively exploited; however, history shows that WordPress plugin CSRF flaws are routinely harvested by commodity botnets (e.g., Gozi, Mirai variants) for SEO abuse and credential stuffing. Continuous monitoring of WordPress-honeypot telemetry is advised.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.