<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Bookly - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/vendors/bookly/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Tue, 28 Jul 2026 09:23:53 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/vendors/bookly/feed.xml" rel="self" type="application/rss+xml"/><item><title>CVE-2026-14516 - Bookly WordPress Plugin Time-Based SQL Injection</title><link>https://feed.craftedsignal.io/briefs/2026-07-cve-2026-14516-bookly-sql/</link><pubDate>Tue, 28 Jul 2026 09:23:53 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-07-cve-2026-14516-bookly-sql/</guid><description>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.</description><content:encoded><![CDATA[<p>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 <code>bookly_get_form_id</code> action to seed a booking session with malicious <code>staff_ids</code> values. Subsequently, they trigger the <code>bookly_render_time</code> 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.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>An unauthenticated attacker identifies a WordPress website running a vulnerable version of the Bookly plugin (up to and including 27.5).</li>
<li>The attacker crafts an HTTP GET or POST request targeting the <code>/wp-admin/admin-ajax.php</code> endpoint with the <code>action=bookly_get_form_id</code> parameter. This request includes a <code>staff_ids[]</code> array parameter containing a time-based SQL injection payload (e.g., <code>' OR SLEEP(5)--</code>).</li>
<li>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 <code>staff_ids</code> value, effectively injecting the payload into the session data.</li>
<li>The attacker then sends a second HTTP GET or POST request to the same <code>/wp-admin/admin-ajax.php</code> endpoint, this time with the <code>action=bookly_render_time</code> parameter, which references the session initiated in the previous step.</li>
<li>The <code>bookly_render_time</code> action executes a vulnerable SQL query that incorporates the previously tainted <code>staff_ids</code> array, causing the injected time-based payload (e.g., <code>SLEEP(5)</code>) to execute within the database.</li>
<li>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).</li>
<li>The absence of CSRF and nonce validation on both <code>bookly_get_form_id</code> and <code>bookly_render_time</code> endpoints allows this two-step attack to be initiated from a malicious third-party website, making it a cross-site attack vector.</li>
<li>The attacker successfully exfiltrates sensitive database information, compromising the confidentiality of the WordPress site's data.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>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.</p>
<h2 id="recommendation">Recommendation</h2>
<ul>
<li>Update the Bookly plugin for WordPress to a version greater than 27.5 immediately to patch CVE-2026-14516.</li>
<li>Deploy the provided Sigma rule to detect suspicious web requests indicative of CVE-2026-14516 exploitation attempts.</li>
<li>Monitor webserver logs for unusual HTTP GET or POST requests to <code>/wp-admin/admin-ajax.php</code> containing <code>action=bookly_get_form_id</code> or <code>action=bookly_render_time</code> combined with SQL injection patterns in the <code>staff_ids[]</code> parameter.</li>
</ul>
]]></content:encoded><category domain="severity">high</category><category domain="type">advisory</category><category>web</category><category>sql-injection</category><category>wordpress</category><category>plugin</category><category>vulnerability</category><category>cve</category><category>exfiltration</category></item></channel></rss>