WpEvently <= 5.1.1 - Unauthenticated PHP Object Injection
Description
The WpEvently plugin for WordPress is vulnerable to PHP Object Injection in versions up to, and including, 5.1.1 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.1.1Source Code
WordPress.org SVNPatched version not available.
This research plan outlines the steps to investigate and exploit CVE-2026-23549, an unauthenticated PHP Object Injection vulnerability in the **WpEvently (Event Booking Manager for WooCommerce)** plugin. ### 1. Vulnerability Summary The vulnerability exists because the plugin passes unvalidated use…
Show full research plan
This research plan outlines the steps to investigate and exploit CVE-2026-23549, an unauthenticated PHP Object Injection vulnerability in the WpEvently (Event Booking Manager for WooCommerce) plugin.
1. Vulnerability Summary
The vulnerability exists because the plugin passes unvalidated user input directly into the PHP unserialize() function. In PHP, deserializing untrusted data can lead to PHP Object Injection (POI). If a suitable "Property-Oriented Programming" (POP) chain exists in the environment (either within the plugin, another active plugin, or WordPress core), an attacker can execute arbitrary code, delete files, or bypass authentication.
The vulnerability is "unauthenticated," meaning it is likely reachable via a wp_ajax_nopriv_* action or a direct request to a frontend-accessible script that doesn't check for user sessions.
2. Attack Vector Analysis
- Endpoint:
wp-admin/admin-ajax.php(most likely) or a frontend hook likeinit. - Action: Likely a
wp_ajax_nopriv_handler related to event booking, cart management, or attendee data. - Parameter: A POST or GET parameter containing a serialized string (often Base64 encoded). Common names in such plugins include
event_data,booking_info,cart_items, orattendee_list. - Preconditions: The plugin must be active. No specific configuration is expected to be required for unauthenticated access.
3. Code Flow (Inferred)
Based on the vulnerability type, the execution flow is expected to be:
- Entry Point: An unauthenticated user sends a request to
admin-ajax.php?action=MAGE_EVENTPRESS_ACTION. - Hook Trigger: WordPress fires
do_action('wp_ajax_nopriv_MAGE_EVENTPRESS_ACTION'). - Handler Execution: The plugin's registered callback function (e.g.,
MageEventPress_Ajax::handle_request) is invoked. - Data Extraction: The handler retrieves data from
$_POST['data']or a similar parameter. - The Sink: The handler calls
unserialize($data)ormaybe_unserialize($data)without sufficient validation or using theallowed_classes => falseoption.
4. Nonce Acquisition Strategy
If the vulnerable AJAX action requires a nonce, it is likely exposed via wp_localize_script for use in the frontend booking forms.
Steps for the Agent:
- Identify the Script/Nonce: Search for
wp_localize_scriptin the plugin folder to find the JavaScript object name.- Grep command:
grep -r "wp_localize_script" /var/www/html/wp-content/plugins/mage-eventpress/
- Grep command:
- Locate the Shortcode: Identify which shortcode enqueues this script. Look for
add_shortcodein the codebase.- Example:
[mage_event_booking](inferred).
- Example:
- Setup Page: Create a public page containing the identified shortcode:
wp post create --post_type=page --post_title="Booking" --post_status=publish --post_content='[SHORTCODE_NAME]'
- Extract via Browser:
- Navigate to the page.
- Use
browser_evalto find the nonce:browser_eval("window.mage_eventpress_params?.nonce")(Replacemage_eventpress_paramswith the actual variable found in step 1).
5. Exploitation Strategy
Once the sink and parameter are identified, follow these steps:
Step 1: Discover the Action and Sink
Search for unserialize calls that take user input:
grep -rn "unserialize" /var/www/html/wp-content/plugins/mage-eventpress/ | grep "POST\|GET\|REQUEST"
Step 2: Confirm Accessibility
Locate where the function containing the unserialize call is hooked. Verify if it uses wp_ajax_nopriv_.
Step 3: Construct Payload
Since no POP chain is specified in the vulnerability report, use a "benign" object injection to confirm the vulnerability. We can attempt to inject a core WordPress class like WP_Block_List or a simple stdClass to see if it triggers an error or different behavior compared to a non-serialized string.
- Test Payload (Base64 encoded stdClass):
Tzo4OiJzdGRDbGFzcyI6MDp7fQ==(serializes toO:8:"stdClass":0:{})
Step 4: Execute HTTP Request
// Using http_request tool
{
method: "POST",
url: "http://localhost:8080/wp-admin/admin-ajax.php",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
data: "action=IDENTIFIED_ACTION&nonce=IDENTIFIED_NONCE&vulnerable_param=Tzo4OiJzdGRDbGFzcyI6MDp7fQ=="
}
6. Test Data Setup
- Plugin Installation: Ensure
mage-eventpressversion 5.1.1 is installed and active. - Event Creation: Some AJAX actions might require a valid event ID. Create one via WP-CLI if needed:
wp post create --post_type=event --post_title="Test Event" --post_status=publish
- Shortcode Page: Create a page with the booking shortcode (as described in section 4) to facilitate nonce extraction if necessary.
7. Expected Results
- Successful Injection: The server processes the request and returns a 200 OK. If the payload is malformed or targets a non-existent class, you might see a PHP Notice or Warning in the logs (
wp-content/debug.log). - Confirmation: If the plugin attempts to use the injected object, it may trigger a "method not found" error if we inject a class like
stdClass. This error confirms that the string was indeed deserialized into an object.
8. Verification Steps
- Check Logs: Use
tail -f /var/www/html/wp-content/debug.logwhile sending the request. Look for:PHP Notice: unserialize(): Error at offset...(if payload is slightly off)PHP Fatal error: Uncaught Error: Call to undefined method stdClass::...(this is a strong indicator of successful injection).
- Trace execution: Add a temporary
error_log("Sink reached with: " . print_r($data, true));before theunserializecall in the plugin code to verify the data arrives intact.
9. Alternative Approaches
- Base64 Variant: If raw serialization fails, try Base64 encoding the payload, as many plugins encode serialized objects to avoid character issues in HTTP parameters.
- Check for
maybe_unserialize: Ifunserializeisn't found, search formaybe_unserialize. This function is a wrapper that will still callunserializeif the input is a valid serialized string. - Search for
GuzzleHttporRequestschains: WordPress often includes libraries like Guzzle. If a POP chain is needed to prove impact, check for these libraries invendor/or core.
Summary
The WpEvently plugin for WordPress is vulnerable to Unauthenticated PHP Object Injection in versions up to and including 5.1.1. This occurs when the plugin passes untrusted user input from AJAX requests into the PHP unserialize() function without restricting allowed classes, potentially allowing an attacker to execute arbitrary code if a suitable POP chain is present on the system.
Exploit Outline
1. Identify the unauthenticated AJAX action (e.g., using wp_ajax_nopriv_ hooks) that processes user-supplied data for event booking or cart management. 2. Obtain a valid AJAX nonce by visiting a public page where the plugin's event booking shortcode is active and extracting the nonce from the localized JavaScript parameters (e.g., mage_eventpress_params.nonce). 3. Construct a PHP serialized object payload designed to trigger a POP chain (e.g., targeting WordPress core or available libraries like GuzzleHttp). 4. Send a POST request to /wp-admin/admin-ajax.php containing the identified action, the extracted nonce, and the malicious payload in the vulnerable parameter (e.g., data or event_data).
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.