CVE-2026-14516 - Bookly WordPress Plugin Time-Based SQL Injection
Unauthenticated attackers can exploit a time-based SQL Injection vulnerability (CVE-2026-14516) in the Bookly WordPress plugin, affecting versions up to and including 27.5, via the 'staff_ids' parameter, chaining requests to `bookly_get_form_id` and `bookly_render_time` to extract sensitive database information due to insufficient input escaping and lack of CSRF protection.
The Online Scheduling and Appointment Booking System - Bookly plugin for WordPress, in versions up to and including 27.5, is affected by a time-based SQL Injection vulnerability, tracked as CVE-2026-14516. This flaw resides in the 'staff_ids' parameter, which is improperly escaped and used in an existing SQL query without sufficient preparation. Unauthenticated attackers can leverage this vulnerability to extract sensitive information from the underlying database. The exploitation involves a two-step request chain: first, the attacker calls the bookly_get_form_id action to seed a booking session with malicious staff_ids values. Subsequently, they trigger the bookly_render_time endpoint, which causes the tainted data to reach the vulnerable SQL query. The absence of CSRF and nonce validation on both endpoints significantly facilitates this attack, allowing for cross-site exploitation. This vulnerability poses a critical risk as it enables unauthorized data exfiltration from WordPress sites utilizing the affected plugin.
Attack Chain
- An unauthenticated attacker identifies a WordPress website running a vulnerable version of the Bookly plugin (up to and including 27.5).
- The attacker crafts an HTTP GET or POST request targeting the
/wp-admin/admin-ajax.phpendpoint with theaction=bookly_get_form_idparameter. This request includes astaff_ids[]array parameter containing a time-based SQL injection payload (e.g.,' OR SLEEP(5)--). - Due to insufficient input escaping and lack of proper SQL query preparation, the Bookly plugin processes this request and seeds a booking session with the malicious
staff_idsvalue, effectively injecting the payload into the session data. - The attacker then sends a second HTTP GET or POST request to the same
/wp-admin/admin-ajax.phpendpoint, this time with theaction=bookly_render_timeparameter, which references the session initiated in the previous step. - The
bookly_render_timeaction executes a vulnerable SQL query that incorporates the previously taintedstaff_idsarray, causing the injected time-based payload (e.g.,SLEEP(5)) to execute within the database. - The attacker observes a noticeable delay in the server's HTTP response time, confirming the execution of the SQL injection. By iteratively modifying the payload and observing response times, the attacker can progressively infer and extract sensitive information from the database (e.g., user credentials, customer data, plugin configuration).
- The absence of CSRF and nonce validation on both
bookly_get_form_idandbookly_render_timeendpoints allows this two-step attack to be initiated from a malicious third-party website, making it a cross-site attack vector. - The attacker successfully exfiltrates sensitive database information, compromising the confidentiality of the WordPress site's data.
Impact
The successful exploitation of CVE-2026-14516 allows unauthenticated attackers to extract sensitive information from the database of affected WordPress sites. This can include, but is not limited to, customer details, booking information, and potentially hashed credentials or other confidential data stored by the Bookly plugin or WordPress itself. Given that the vulnerability facilitates a cross-site attack due to absent CSRF/nonce validation, a wide range of websites using the plugin could be targeted, leading to significant data breaches and privacy violations.
Recommendation
- Update the Bookly plugin for WordPress to a version greater than 27.5 immediately to patch CVE-2026-14516.
- Deploy the provided Sigma rule to detect suspicious web requests indicative of CVE-2026-14516 exploitation attempts.
- Monitor webserver logs for unusual HTTP GET or POST requests to
/wp-admin/admin-ajax.phpcontainingaction=bookly_get_form_idoraction=bookly_render_timecombined with SQL injection patterns in thestaff_ids[]parameter.
Detection coverage 1
Detects CVE-2026-14516 Exploitation - Bookly WordPress Plugin Time-Based SQLi
highDetects exploitation attempts against CVE-2026-14516, a time-based SQL Injection vulnerability in the Bookly WordPress plugin, by identifying specific admin-ajax.php actions combined with time-based SQLi payloads in the 'staff_ids[]' parameter.
Detection queries are available on the platform. Get full rules →