Bus Ticket Booking with Seat Reservation <= 5.6.2 - Unauthenticated PHP Object Injection
Description
The Bus Ticket Booking with Seat Reservation plugin for WordPress is vulnerable to PHP Object Injection in versions up to, and including, 5.6.2 via deserialization of untrusted input. This makes it possible for unauthenticated attackers 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:N/UI:N/S:U/C:H/I:H/A:HTechnical Details
<=5.6.2This research plan outlines the steps to investigate and exploit **CVE-2026-27095**, a PHP Object Injection vulnerability in the "Bus Ticket Booking with Seat Reservation" plugin. ### 1. Vulnerability Summary The vulnerability is an **Unauthenticated PHP Object Injection** vulnerability. It occurs …
Show full research plan
This research plan outlines the steps to investigate and exploit CVE-2026-27095, a PHP Object Injection vulnerability in the "Bus Ticket Booking with Seat Reservation" plugin.
1. Vulnerability Summary
The vulnerability is an Unauthenticated PHP Object Injection vulnerability. It occurs because the plugin accepts user-controlled serialized data via an HTTP parameter and passes it to the PHP unserialize() function without adequate validation or sanitization. Since this happens in a context reachable by unauthenticated users (likely a wp_ajax_nopriv_* handler), an attacker can supply a crafted serialized string. If a suitable Property-Oriented Programming (POP) chain exists in the environment (via other plugins or WordPress core), this can lead to remote code execution (RCE), file deletion, or data theft.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action: Likely
wppb_bus_booking_get_seat_layoutorwppb_process_booking(inferred). - Vulnerable Parameter: Likely
bus_data,extra_info, orsearch_criteria(inferred). - Authentication: None required (unauthenticated).
- Preconditions: The plugin must be active. A valid WordPress nonce may be required depending on the specific handler's implementation.
3. Code Flow
- Entry Point: An unauthenticated user sends a POST request to
admin-ajax.phpwith a specificaction. - Hook Registration: The plugin registers a handler using
add_action('wp_ajax_nopriv_[ACTION_NAME]', 'handler_function'). - Input Acquisition: The
handler_functionretrieves data from$_POSTor$_GET. - The Sink: The retrieved data is passed through
unserialize()ormaybe_unserialize().- Likely Pattern:
$data = unserialize(stripslashes($_POST['parameter']));or$data = unserialize(base64_decode($_POST['parameter']));
- Likely Pattern:
4. Nonce Acquisition Strategy
To exploit AJAX handlers, a nonce is often required.
- Identify the Script Localization: Search the plugin code for
wp_localize_script.- Command:
grep -rn "wp_localize_script" wp-content/plugins/bus-ticket-booking-with-seat-reservation/
- Command:
- Identify the Shortcode: Find the shortcode that enqueues the booking script.
- Command:
grep -rn "add_shortcode" wp-content/plugins/bus-ticket-booking-with-seat-reservation/ - Likely Shortcode:
[bus_ticket_booking](inferred).
- Command:
- Create a Trigger Page:
- Use WP-CLI:
wp post create --post_type=page --post_status=publish --post_title="Booking" --post_content='[bus_ticket_booking]'
- Use WP-CLI:
- Extract Nonce via Browser:
- Navigate to the newly created page.
- Use
browser_evalto find the nonce in the global JS object (e.g.,window.wppb_ajax_obj.nonce- verify name in source).
5. Exploitation Strategy
Since the vulnerability is a PHP Object Injection and no specific POP chain is identified in the plugin itself, the PoC will focus on triggering the unserialize call and demonstrating control.
Step 1: Discovery
Locate the exact sink using grep:
grep -rn "unserialize" wp-content/plugins/bus-ticket-booking-with-seat-reservation/ | grep "POST\|GET\|REQUEST"
Step 2: Crafting the Request
Once the parameter and action are identified (assume action wppb_get_layout and parameter bus_info for this example):
HTTP Request:
- Method: POST
- URL:
http://<target>/wp-admin/admin-ajax.php - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
action=wppb_get_layout&nonce=[EXTRACTED_NONCE]&bus_info=O:8:"stdClass":0:{}
Step 3: Confirming Injection
To confirm the unserialize call without a full RCE chain, you can use a "Logger" class if available, or attempt to trigger a PHP error by providing an invalidly serialized object (e.g., O:1:"A":0:{ without the closing brace) and checking if the response or debug.log reflects a deserialization error.
6. Test Data Setup
- Plugin Installation: Ensure version
<= 5.6.2is installed. - Booking Configuration: Use WP-CLI to ensure at least one bus/route is created if the handler requires it to reach the sink.
- Command:
wp post create --post_type=wppb_bus --post_status=publish --post_title="Test Bus"(inferred post type).
- Command:
- Public Page: Create a page with the booking shortcode to ensure nonces are generated for unauthenticated sessions.
7. Expected Results
- The server processes the
unserialize()call. - If using a simple
stdClassobject, the server should respond with its typical JSON/HTML response (e.g.,200 OK). - If using a malformed object, the server may return a PHP warning (if
WP_DEBUGis on) or a500error, confirming the string reached theunserializesink.
8. Verification Steps
- Check Debug Logs:
tail -f wp-content/debug.logwhile sending the request. Look for "unserialize(): Error at offset...". - Monitor Filesystem: If using a POP chain that targets file creation (like some older WordPress core chains), check for the presence of the created file:
ls /var/www/html/proof.txt. - Review Response: If the
unserializeoutput is reflected back (unlikely but possible), verify the structure of the returned data.
9. Alternative Approaches
- Base64 Encoding: Check if the parameter expects a Base64-encoded serialized string (common in WordPress plugins to avoid truncation).
- Test:
bus_info=Tzo4OiJzdGRDbGFzcyI6MDp7fQ==
- Test:
- Different Actions: If
wppb_bus_booking_get_seat_layoutdoes not contain the sink, check handlers related to:- Searching:
wppb_bus_search - Cart/Checkout:
wppb_add_to_cart - Custom Fields:
wppb_save_extra_fields
- Searching:
Summary
The Bus Ticket Booking with Seat Reservation plugin for WordPress is vulnerable to unauthenticated PHP Object Injection in versions up to and including 5.6.2. This occurs due to the plugin deserializing untrusted user input via the `unserialize()` function, typically within AJAX handlers. An attacker can exploit this to execute arbitrary code or perform file operations if a suitable Property-Oriented Programming (POP) chain is present in the system.
Vulnerable Code
// Inferred likely pattern based on research plan analysis of AJAX handlers $data = unserialize(stripslashes($_POST['parameter']));
Security Fix
@@ -10,1 +10,1 @@ - $data = unserialize(stripslashes($_POST['parameter'])); + $data = json_decode(stripslashes($_POST['parameter']), true);
Exploit Outline
1. Locate a page containing the `[bus_ticket_booking]` shortcode to trigger script localization. 2. Extract a valid AJAX nonce from the frontend global JS objects (e.g., `wppb_ajax_obj.nonce`). 3. Construct a POST request to `/wp-admin/admin-ajax.php` with the identified vulnerable action (such as `wppb_bus_booking_get_seat_layout`). 4. Include a crafted PHP serialized object payload in the vulnerable parameter (e.g., `bus_data` or `extra_info`). 5. If a POP chain is available from other installed plugins or WordPress core, the `unserialize()` call will trigger the chain's magic methods to achieve the desired impact (e.g., RCE).
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.