WordPress Service Finder Bookings ≤ 6.0 Authentication Bypass via `original_user_id` Cookie (CVE-2025-5947)
by xxconi · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-5947
- Category
- web
- Affected product
- WordPress plugin "Service Finder Bookings" (sf-booking)
- Affected versions
- ≤ 6.0
- Disclosed
- 2026-07-06
- Patch status
- unpatched
Tags
References
- https://github.com/xxconi/CVE-2025-5947
- https://patchstack.com/database/wordpress/plugin/sf-booking/vulnerability/wordpress-service-finder-bookings-plugin-6-0-authentication-bypass-via-user-switch-cookie-vulnerability
- https://github.com/advisories/GHSA-x2xx-4qhp-2vqx
- https://nvd.nist.gov/vuln/detail/CVE-2025-5947
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07 |
| Author / Researcher | xxconi |
| CVE / Advisory | CVE-2025-5947 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (CVSSv3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| Status | Weaponized |
| Tags | wordpress, service-finder-bookings, sf-booking, authentication-bypass, cookie-forgery, privilege-escalation, cwe-639 |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | WordPress plugin “Service Finder Bookings” (sf-booking) |
| Versions Affected | ≤ 6.0 |
| Language / Platform | PHP / WordPress (target); Python 3.6+ (PoC exploit) |
| Authentication Required | No — unauthenticated |
| Network Access Required | Yes (HTTP/HTTPS access to wp-admin/admin-ajax.php on the target) |
Summary
The Service Finder Bookings WordPress plugin implements a “switch back to original user” feature (intended for admin-to-user account switching) via the service_finder_switch_back() AJAX handler, registered under the service_finder_switch_back action. This handler trusts a client-supplied original_user_id cookie and calls wp_set_current_user($user_id) using that value directly, with no verification that the requesting session actually has the right to switch to (or from) that account. Any unauthenticated attacker can send a single request with Cookie: original_user_id=1 and be logged in as user ID 1 (typically the first administrator account), achieving full authentication bypass and, from there, complete site takeover (CWE-639, Authorization Bypass Through User-Controlled Key).
Vulnerability Details
Root Cause
service_finder_switch_back() reads the original_user_id cookie directly from client-controlled input and passes it to wp_set_current_user() without any cryptographic verification (e.g. a signed/nonce-protected token tying the cookie to a legitimate prior admin session):
| |
Since wp_set_current_user() establishes the current WordPress session as the given user ID with no further checks, an attacker can set this cookie to any user ID (most impactfully 1, the default admin) and be authenticated as that user.
Attack Vector
- Identify a WordPress site running Service Finder Bookings ≤ 6.0.
- Send a GET request to
admin-ajax.phpwithaction=service_finder_switch_backand a forgedoriginal_user_idcookie set to a target user ID (e.g.1for the default administrator):
| |
- The plugin sets the current session’s user to the requested ID with no validation.
- The response redirects to
/wp-admin/with a validwordpress_logged_in_*authentication cookie, completing the takeover of that account.
Impact
Unauthenticated attackers can impersonate any WordPress user, including administrators — leading to full admin panel access, arbitrary plugin/theme installation (remote code execution), data exfiltration, and complete site compromise.
Environment / Lab Setup
Target: WordPress with the Service Finder Bookings plugin (sf-booking) ≤ 6.0 installed and active
Attacker: Python 3.6+ with `requests` (see requirements.txt)
Proof of Concept
PoC Script
See
CVE-2025-5947.pyin this folder.
| |
The script first probes the target for a WordPress install and the presence of the sf-booking plugin, then sends the service_finder_switch_back AJAX request with a forged original_user_id cookie. Success is determined by a 301/302 redirect to /wp-admin/ combined with a Set-Cookie: wordpress_logged_in_* response header, at which point the attacker holds a valid authenticated session for that user ID. A -b/--brute-force mode iterates a range of user IDs to enumerate every account that can be hijacked this way.
Detection & Indicators of Compromise
Signs of compromise:
- Access log entries for
admin-ajax.php?action=service_finder_switch_backfrom unauthenticated/anonymous clients - Unexpected
wordpress_logged_in_*cookies issued in response to requests carrying a client-suppliedoriginal_user_idcookie - Unexplained administrator logins or new admin accounts/content changes correlating with the above requests
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update Service Finder Bookings (sf-booking) to a patched version that validates the switch-back request against a legitimate, server-verified prior session (e.g. a signed token) rather than a raw client-supplied cookie |
| Interim mitigation | Deactivate or remove the sf-booking plugin until patched; block /wp-admin/admin-ajax.php?action=service_finder_switch_back at the WAF; audit admin accounts and access logs for signs of exploitation |
References
Notes
Mirrored from https://github.com/xxconi/CVE-2025-5947 on 2026-07-06.
| |