Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend unauthenticated POST to wp-admin/admin-ajax.php
-
DeliverySubmit absent or invalid signature to trigger error-logging path
-
ExploitXSS payload stored verbatim in bookly_log.details column
-
ExecutionAdministrator opens Diagnostics Logs page
-
PersistStored script executes in privileged admin browser context
-
ImpactSession credentials exfiltrated or rogue admin account created
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Execution The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The Bookly plugin must be installed and active on the target WordPress site running version 27.7 or earlier. The bookly_speed_up_update_addons AJAX action is registered under wp_ajax_nopriv_* and is therefore accessible to unauthenticated users at the standard WordPress AJAX endpoint wp-admin/admin-ajax.php - no account, session cookie, nonce, or API key is required for the injection step. The specific trigger for the unsanitized log-write path is submitting a request without a valid signature, which causes lib/PluginsUpdater.php to enter its error-handling branch and store attacker-supplied request details directly in bookly_log.details. Payload execution requires a WordPress user with administrator-level access to subsequently navigate to the Diagnostics → Logs page in the WordPress backend; this is a natural administrative action and cannot be triggered remotely by the attacker but is a predictable behavior on active installations. The key limiting factor is this indirect execution dependency - the attacker cannot control when or whether an administrator views the logs page, introducing delay but not meaningful prevention. |
| Impact | The CVSS 3.1 base score of 7.2 is driven by a network-accessible, low-complexity, unauthenticated vector with changed scope - metrics that accurately characterize the injection phase. However, the provided vector specifies UI:N, which is inconsistent with the actual execution trigger: the stored payload only fires when an administrator visits the Diagnostics → Logs page, constituting user interaction on the victim's side; an independent assessment using UI:R is more accurate and is reflected in the assessed vector below. The scope change (S:C) is correctly applied because execution crosses from the plugin's database storage context into the privileged administrator browser session. No EPSS score was included in available data, and this CVE is not listed in the CISA KEV catalog, suggesting no observed widespread exploitation to date; that said, even a mid-sized municipal IT team in leszno running a public-facing WordPress booking portal should treat this as urgent given the entirely unauthenticated injection step and the administrative privilege context of payload execution. The attack is highly automatable - a single crafted HTTP POST is sufficient to pre-position a payload - and stored persistence means one request can target all future administrator sessions, not just one. The primary factor limiting immediate impact is that execution depends on an administrator navigating to the specific Diagnostics Logs page, which cannot be forced by an external attacker but is likely to occur organically on active installations. |
| Exploit ScenarioDerived | An unauthenticated attacker submits a single crafted HTTP POST request to wp-admin/admin-ajax.php with action=bookly_speed_up_update_addons and an absent or invalid signature, embedding a JavaScript payload in the request body; the plugin's signature-validation failure path in lib/PluginsUpdater.php writes the raw, unsanitized input to the bookly_log.details database column. The next time a WordPress administrator opens the Diagnostics → Logs page in the backend - a routine action during troubleshooting or plugin management - the stored script executes in their browser context, enabling session cookie exfiltration, creation of rogue administrator accounts, or silent redirection to attacker-controlled infrastructure. No confirmed public proof-of-concept code exists at time of analysis, though the attack requires only a single HTTP request and knowledge of the AJAX action name, both of which are derivable from the publicly available plugin source code in the WordPress SVN repository. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 16, 2026
Stored cross-site scripting in the Bookly WordPress appointment booking plugin (versions up to and including 27.7) enables unauthenticated remote attackers to inject persistent JavaScript via the bookly_speed_up_update_addons AJAX endpoint, with payloads stored verbatim in the bookly_log.details database column and executing in administrator browser sessions when they navigate to the Diagnostics → Logs page. The injection point is registered under the wp_ajax_nopriv_* hook prefix, making it reachable without any authentication via the standard WordPress AJAX endpoint; the error-logging code path in lib/PluginsUpdater.php writes attacker-controlled input directly to the database when a request is submitted without a valid signature. No public exploit code or CISA KEV listing has been confirmed at time of analysis, though the zero-barrier injection path combined with privileged execution context represents a realistic and impactful threat to any active Bookly installation.
RemediationAI
Update the Bookly plugin to the version immediately following 27.7; verify the exact patched release number against the Wordfence advisory at https://www.wordfence.com/threat-intel/vulnerabilities/id/cfb53e44-7f9d-490f-b938-f428c20219d7 and the upstream SVN changeset at https://plugins.trac.wordpress.org/changeset?reponame=&old=3637918%40bookly-responsive-appointment-booking-tool&new=3637918%40bookly-responsive-appointment-booking-tool, as the exact first-fixed version is not independently confirmed from available data. If an immediate update is not feasible, disabling the Bookly plugin eliminates the vulnerable endpoint entirely at the cost of all booking functionality. As a narrower compensating control, deploying a WAF rule to block unauthenticated POST requests to wp-admin/admin-ajax.php with action=bookly_speed_up_update_addons prevents the injection step without requiring a plugin change, though this may interfere with legitimate addon update workflows if they share this action name. Restricting access to the Diagnostics → Logs admin page via role-based access controls limits payload execution surface but does not prevent payloads from being written to the database, leaving residual risk if controls change. Patch availability per SVN changeset is the only confirmed remediation path; no vendor-released versioned patch has been independently verified from the available data.
Affected VersionsENISA
Affected Packages
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
The Bookly plugin (CPE: cpe:2.3:a:ladela:online_scheduling_and_appointment_booking_system_-_bookly:*:*:*:*:*:*:*:*) by Ladela is a WordPress appointment scheduling and management tool. WordPress AJAX actions registered under the wp_ajax_nopriv_* hook prefix are accessible to unauthenticated HTTP clients via wp-admin/admin-ajax.php without any session or nonce validation at the routing layer. The vulnerable handler, bookly_speed_up_update_addons, is implemented in lib/PluginsUpdater.php (lines 13 and 97 per Wordfence SVN references at tags 27.5 and 27.7): when a request arrives without a valid signature, the plugin's error-handling branch logs raw request-supplied data directly to the bookly_log.details database column with neither input sanitization nor parameterized escaping. That stored value is later retrieved and rendered without output escaping in the Diagnostics → Logs admin view, implemented in backend/modules/diagnostics/Ajax.php (line 344) and the accompanying diagnostics.js (line 542). CWE-79 - Improper Neutralization of Input During Web Page Generation - is the root cause: attacker-controlled data flows from an unauthenticated HTTP request through persistent storage into an HTML rendering context without sanitization at either the ingestion or the output stage, representing a classic stored-XSS data-flow failure.
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
AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
UI:R applied because stored payload execution requires an administrator to actively navigate to the Diagnostics Logs page; all other metrics match the unauthenticated network-accessible injection and changed-scope admin browser execution context.
Primary rating from Vendor (Wordfence).
CVSS VectorVendor: Wordfence
DescriptionCVE.org
The Online Scheduling and Appointment Booking System - Bookly plugin for WordPress is vulnerable to Stored Cross-Site Scripting via bookly_speed_up_update_addons AJAX action in all versions up to, and including, 27.7 due to insufficient input sanitization and output escaping. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page. The injection point is the bookly_speed_up_update_addons AJAX action, which is registered as wp_ajax_nopriv_* and therefore reachable without authentication; the payload is stored verbatim in the bookly_log.details column when a request is submitted without a valid signature, and executes when an administrator later views the Diagnostics → Logs page.
Executive ViewAI
The Bookly WordPress appointment scheduling plugin (versions ≤27.7) contains a stored cross-site scripting vulnerability allowing unauthenticated attackers to inject malicious scripts into administrator browser sessions, creating immediate risk of admin account compromise and website control loss. Organizations using Bookly face exploitation via a simple remote injection attack, with no vendor patch available to remediate the risk.
No vendor-released patch identified at time of analysis. Interim mitigations: (1) Disable the wp_ajax_nopriv_bookly_speed_up_update_addons endpoint via WAF or htaccess to block the injection vector; (2) Implement IP-based access restrictions on the WordPress admin /wp-admin directory; (3) Enable comprehensive WordPress security audit logging and establish daily review of admin access logs and bookly_log table entries for suspicious activity; (4) Isolate Bookly instances to lower-risk environments if possible; (5) Prioritize evaluation and migration to an actively maintained alternative appointment scheduling plugin.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
Unauthenticated attackers can read the complete AI booking conversation transcript of any Bookly customer — including na
Unauthenticated attackers can exploit an insecure direct object reference in the Bookly appointment-booking plugin for W
PHP Object Injection in the Bookly (Online Scheduling and Appointment Booking System) WordPress plugin, affecting all ve
Stored cross-site scripting in the Bookly Online Scheduling and Appointment Booking System plugin for WordPress (version
Privilege escalation in the Bookly WordPress plugin (versions up to and including 28.4) allows authenticated attackers w
Unauthorized plugin update execution in the Bookly scheduling plugin for WordPress (all versions through 27.2) allows an
Unauthenticated attackers who already know a registered customer's primary phone number or email can read that customer'
Price manipulation in Bookly WordPress plugin (versions up to 27.0) allows unauthenticated attackers to reduce appointme
Unauthenticated attackers can overwrite the name, email, phone, and address of any existing customer record in the Bookl
Insecure Direct Object Reference in the Bookly plugin's Mobile Staff Cabinet API (versions up to and including 27.7) all
EUVD-2026-59927
GHSA-q2ch-2q4j-vq6h
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB