Skip to main content

Bookly EUVDEUVD-2026-96040

| CVE-2026-103365 MEDIUM
Information Exposure (CWE-200)
2026-10-10 Wordfence GHSA-5p6p-rjcr-26xj
5.3
CVSS 3.1 · Vendor: Wordfence
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain target's registered phone/email
  2. Delivery
    Send crafted bookly_render_details AJAX request
  3. Exploit
    CSRF check bypassed, nopriv endpoint reached
  4. Execution
    Customer loaded by phone without identity check
  5. Impact
    Harvest returned name/email/phone/notes

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK

2 techniques across 2 tactics: Collection, Discovery

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires a specific non-default site configuration: the administrator must have inserted at least one of the {client_name}, {client_email}, {client_phone}, or {client_note} placeholders into the classic booking form's Details step 'Appearance' information text - without these placeholders no customer data is substituted and the bug is not reachable. The attacker must also already possess a valid registered customer's primary phone number (or email), since the Customer entity is looked up by that attacker-supplied value; this limits the flaw to per-victim targeted disclosure rather than bulk enumeration. Offsetting these limits, no authentication, CSRF token, or user interaction is needed (the endpoint is registered for wp_ajax_nopriv, csrfTokenValid() is forced true, and customerIdentityConfirmed() is never called), so any such configured site is remotely reachable by anonymous attackers. Affected: Bookly versions up to and including 28.4; fixed in 28.5.

Impact

This is a genuine but moderate-severity information-disclosure issue, and the signals are internally consistent rather than conflicting. The CVSS vector (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N, 5.3) correctly reflects remote, unauthenticated access with only limited confidentiality impact and no integrity or availability effect - matching the description, which confirms the dual wp_ajax/wp_ajax_nopriv registration, the csrfTokenValid() override returning true, and the missing customerIdentityConfirmed() check. No EPSS score, KEV listing, or public POC is present in the supplied data, so exploitation is not confirmed in the wild; this is not a drop-everything priority. The practical risk is bounded by two real-world gatekeepers that CVSS does not fully capture: the site owner must have placed {client_name}/{client_email}/{client_phone}/{client_note} placeholders into the Details step's Appearance text (a non-default configuration), and the attacker must already know a valid registered customer's primary phone or email. The disclosure is also per-customer rather than a bulk dump, which argues for targeted abuse (e.g., confirming/profiling a specific known individual) over mass automated harvesting. Net: a credible privacy/PII-exposure bug worth patching promptly on affected, placeholder-configured sites, but lower urgency than a critical RCE given the limited impact and configuration dependency.

Exploit ScenarioDerived

An attacker who already knows a target customer's registered phone number (or email) submits a crafted request to the unauthenticated bookly_render_details AJAX endpoint of a Bookly site whose Details step Appearance text contains customer placeholders. Because the CSRF check is bypassed and no identity confirmation is performed, the server loads the matching Customer entity and returns HTML containing that person's stored name, email, phone, and internal notes. No public exploit code is identified in the provided data, but the low attack complexity makes manual exploitation straightforward.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
No patch listed yet 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 10, 2026

Unauthenticated attackers who already know a registered customer's primary phone number or email can read that customer's stored name, email, phone and internal notes from WordPress sites running the Bookly - Online Scheduling and Appointment Booking System plugin in versions up to and including 28.4. The classic booking form's Details step endpoint bookly_render_details is registered for wp_ajax_nopriv, its csrfTokenValid() check is overridden to always return true, and InfoText::getCodes() loads a persisted Customer entity keyed solely by the attacker-supplied phone or email without ever calling the plugin's customerIdentityConfirmed() predicate, so {client_name}, {client_email}, {client_phone} and {client_note} placeholders are substituted into the returned HTML. Exploitation requires a non-default site configuration (the administrator must have inserted at least one of those placeholders into the Details step's Appearance information text) and a valid victim identifier, which limits this to targeted per-victim disclosure rather than bulk enumeration; no public exploit was identified at time of analysis. The flaw is fixed in Bookly 28.5.

RemediationAI

Upgrade the Bookly plugin to version 28.5 or later, which is the vendor-released fix documented in the 28.4-to-28.5 changeset (https://plugins.trac.wordpress.org/changeset?reponame=&new=3730881%40bookly-responsive-appointment-booking-tool%2Ftags%2F28.5&old=3722721%40bookly-responsive-appointment-booking-tool%2Ftags%2F28.4) and described in the Wordfence advisory at https://www.wordfence.com/threat-intel/vulnerabilities/id/df578e6c-cecd-4c80-b11c-3916ec22c7c7?source=cve. If immediate patching is not possible, remove the {client_name}, {client_email}, {client_phone} and {client_note} placeholders from the classic booking form's Details step 'Appearance' information text, which eliminates the vulnerable substitution path at the cost of removing personalized confirmation text from the booking flow. As a supplemental control, block or rate-limit unauthenticated requests to the bookly_render_details AJAX action via a WAF/ModSecurity rule or by hooking wp_ajax_nopriv_bookly_render_details, but be aware that this may break the Details step for legitimate guest bookings, and because the endpoint accepts no CSRF token and the lookup is keyed solely by an attacker-supplied phone or email, such blocking only reduces exploitability rather than eliminating the underlying information exposure. No public exploit code was identified at time of analysis, so there is no confirmed active exploitation to prioritize against.

Affected VersionsENISA

Online Scheduling and Appointment Booking System – Bookly 0 ≤28.4

Affected Packages

euvd online_scheduling_and_appointment_booking_system_bookly no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Bookly is a WordPress appointment-booking plugin whose classic booking form is driven by AJAX actions under the admin-ajax.php handler. The Details step is served by the action bookly_render_details, which overrides the standard csrfTokenValid() method so that every request is treated as CSRF-valid, and is registered for both authenticated (wp_ajax_) and unauthenticated (wp_ajax_nopriv_) callers. During rendering, Bookly\Frontend\Components\Booking\InfoText::getCodes() resolves placeholder codes by calling UserBookingData::getCustomer(), which looks up the persisted Customer entity using only the phone or email value supplied in the request. The plugin's own customerIdentityConfirmed() authorization predicate is never invoked on this path, and the four client-related placeholders are populated directly from the matched Customer record. The result is a CWE-200 exposure of stored personal data (name, email, phone, internal notes) tied to the two-stage prerequisite that an admin has configured one of the affected placeholders and the attacker already possesses a victim's phone or email. The affected package is identified by CPE cpe:2.3:a:ladela:online_scheduling_and_appointment_booking_system_-_bookly and the vulnerable code paths are visible in the 28.3 tag of bookly-responsive-appointment-booking-tool (InfoText.php#L389, frontend/modules/booking/Ajax.php#L570, #L791, #L1515, #L15, lib/UserBookingData.php#L838).

Know when Online Scheduling And Appointment Booking System Bookly gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (Wordfence) PRIMARY 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
vuln.today AI 5.3 MEDIUM

Remote unauthenticated via a nopriv endpoint with CSRF bypass (AV:N/PR:N/UI:N); only limited customer PII is disclosed (C:L, I:N/A:N); AC:L since the lookup is deterministic once a known phone/email is supplied.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (Wordfence).

CVSS VectorVendor: Wordfence

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
None
Availability
None

DescriptionCVE.org

The Bookly - Online Scheduling and Appointment Booking System plugin for WordPress is vulnerable to Sensitive Information Exposure in versions up to, and including, 28.4 via the classic booking form's Details step. The endpoint bookly_render_details is registered for both wp_ajax and wp_ajax_nopriv, the module overrides csrfTokenValid() to always return true, and Bookly\Frontend\Components\Booking\InfoText::getCodes() calls UserBookingData::getCustomer() to load the persisted Customer entity keyed solely by the attacker-supplied phone (or email) with no invocation of the plugin's own customerIdentityConfirmed() predicate. When a site owner has placed the supported {client_name}, {client_email}, {client_phone}, or {client_note} placeholders into the Details step's Appearance information text, the matched customer's stored name, email, phone and internal notes are substituted into the returned HTML. This makes it possible for unauthenticated attackers who know only a registered customer's primary phone (or email) to read that customer's stored personal data.

Threat Intelligence Overview

EPSS Score
0.3%
Top 81% exploitable
Prevalence
Medium
popular WordPress appointment-booking plugin, but condition-gated and not universally deployed
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.3%
Patch available No
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
Yes
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

26
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +26
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

CVE-2026-89063 HIGH POC
7.5 Sep 16

Unauthenticated attackers can read the complete AI booking conversation transcript of any Bookly customer — including na

CVE-2026-93399 CRITICAL
9.1 Sep 25

Unauthenticated attackers can exploit an insecure direct object reference in the Bookly appointment-booking plugin for W

CVE-2026-13424 HIGH
7.2 Aug 16

Stored cross-site scripting in the Bookly WordPress appointment booking plugin (versions up to and including 27.7) enabl

CVE-2026-12626 HIGH
7.2 Oct 10

PHP Object Injection in the Bookly (Online Scheduling and Appointment Booking System) WordPress plugin, affecting all ve

CVE-2026-5513 HIGH
7.2 Jun 13

Stored cross-site scripting in the Bookly Online Scheduling and Appointment Booking System plugin for WordPress (version

CVE-2026-104898 MEDIUM
6.8 Oct 10

Privilege escalation in the Bookly WordPress plugin (versions up to and including 28.4) allows authenticated attackers w

CVE-2026-2520 MEDIUM
5.4 Sep 08

Unauthorized plugin update execution in the Bookly scheduling plugin for WordPress (all versions through 27.2) allows an

CVE-2026-2519 MEDIUM
5.3 Apr 09

Price manipulation in Bookly WordPress plugin (versions up to 27.0) allows unauthenticated attackers to reduce appointme

CVE-2026-92799 MEDIUM
5.3 Sep 25

Unauthenticated attackers can overwrite the name, email, phone, and address of any existing customer record in the Bookl

CVE-2026-12905 MEDIUM
4.3 Aug 16

Insecure Direct Object Reference in the Bookly plugin's Mobile Staff Cabinet API (versions up to and including 27.7) all

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy