Slider Responsive Slideshow – Image slider, Gallery slideshow <= 1.5.4 - Authenticated (Contributor+) PHP Object Injection
Description
The Slider Responsive Slideshow – Image slider, Gallery slideshow plugin for WordPress is vulnerable to PHP Object Injection in versions up to, and including, 1.5.4 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:HTechnical Details
<=1.5.4This research plan outlines the steps to investigate and exploit **CVE-2026-22346**, a PHP Object Injection vulnerability in the **Slider Responsive Slideshow** plugin. --- ### 1. Vulnerability Summary The **Slider Responsive Slideshow** plugin (<= 1.5.4) is vulnerable to PHP Object Injection. Thi…
Show full research plan
This research plan outlines the steps to investigate and exploit CVE-2026-22346, a PHP Object Injection vulnerability in the Slider Responsive Slideshow plugin.
1. Vulnerability Summary
The Slider Responsive Slideshow plugin (<= 1.5.4) is vulnerable to PHP Object Injection. This occurs when the plugin takes user-supplied input—likely slider configuration, settings, or import data—and passes it to the PHP unserialize() function without adequate validation. While the plugin itself may not contain a usable POP (Property Oriented Programming) chain, an attacker with Contributor-level permissions can inject a serialized object that triggers a chain in other active plugins or WordPress core, potentially leading to Remote Code Execution (RCE) or file deletion.
2. Attack Vector Analysis
- Endpoint: Likely a WordPress AJAX handler (
admin-ajax.php) or an admin-post handler (admin-post.php). - Vulnerable Parameter: Likely a POST parameter named
data,slider_data,settings, orcontent(inferred). - Action Hook: Likely
wp_ajax_save_slider_data,wp_ajax_create_slider, or a similar administrative action (inferred). - Authentication: Requires a user with at least
Contributorrole. - Preconditions: The attacker must have a valid session and, usually, a valid WordPress nonce associated with the slider management functionality.
3. Code Flow (Inferred)
- Entry Point: An authenticated user (Contributor+) sends a request to
wp-admin/admin-ajax.php. - Hook Registration: The plugin registers an AJAX action:
add_action('wp_ajax_XYZ', '...handler_function...'). - Data Retrieval: The handler function retrieves a POST parameter containing serialized data:
$raw_data = $_POST['slider_data']; - Vulnerable Sink: The handler (or a function it calls) passes this data to
unserialize():$decoded_data = unserialize(base64_decode($raw_data));or$decoded_data = unserialize(stripslashes($raw_data)); - Injection: The PHP engine instantiates the object defined in the payload, triggering
__wakeup()or__destruct()magic methods.
4. Nonce Acquisition Strategy
Since the vulnerability is Contributor+, we can access the WordPress admin dashboard to retrieve the necessary nonce.
- Identify the Shortcode: Search the plugin code for
add_shortcodeto find how sliders are rendered.- Target:
grep -r "add_shortcode" .(Likely[responsive-slider]).
- Target:
- Identify the Localization Key: Search for where the plugin enqueues scripts and localizes data.
- Target:
grep -r "wp_localize_script" .
- Target:
- Creation of Test Page:
wp post create --post_type=page --post_status=publish --post_title="Exploit Page" --post_content='[responsive-slider]' --post_author=CONTRIBUTOR_ID - Browser Extraction:
- Navigate to the newly created page or the plugin's admin settings page.
- Use
browser_evalto extract the nonce. - Inferred Variable:
window.slider_ajax_object?.nonceorwindow.responsive_slider_vars?.ajax_nonce.
5. Exploitation Strategy
The goal is to demonstrate that a serialized string reaches unserialize().
- Login as Contributor: Use the
http_requesttool to obtain session cookies. - Discovery:
- Examine the plugin's AJAX handlers:
grep -r "wp_ajax_" . - Look specifically for handlers that call
unserialize():grep -rn "unserialize" .
- Examine the plugin's AJAX handlers:
- Craft Payload:
- Since no internal POP chain is confirmed, use a simple "Standard Injection" payload that triggers a recognizable PHP error if it fails (e.g., an O:8:"NonExist":0:{}) or a known core chain if available.
- Example Payload:
O:8:"Wp_Theme":0:{}(Standard core class).
- Execute Request:
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]&slider_data=[SERIALIZED_PAYLOAD] - Verification of Sink: If
WP_DEBUGis on, look for "Class 'NonExist' not found" or similar serialization errors in the response.
6. Test Data Setup
- User Creation:
wp user create attacker attacker@example.com --role=contributor --user_pass=password - Plugin Activation:
wp plugin activate slider-responsive-slideshow - Slider Creation: If the plugin requires an existing slider to trigger the code path:
- Navigate to the plugin menu.
- Create a dummy slider.
- Note the Slider ID.
7. Expected Results
- Success: The server processes the request. If the payload contains an invalid class, a PHP warning/error may be generated in
wp-content/debug.log. If a valid POP chain is used, the side effects of that chain (e.g., file creation) should be visible. - Response: Often a
200 OKorwp_die()message, but the magic happens in the PHP background during theunserialize()call.
8. Verification Steps
- Monitor Logs: Check
/var/www/html/wp-content/debug.logfor serialization errors. - Trace Invocation: If possible, add temporary logging to the plugin code to confirm the input reaches the sink:
file_put_contents('/tmp/sink.txt', "Input: " . $_POST['vulnerable_param']); - Database State: Check if the injected string was stored in
wp_postmetaorwp_options.wp db query "SELECT * FROM wp_postmeta WHERE meta_value LIKE '%O:%'"
9. Alternative Approaches
- Check Import Functionality: Slider plugins often have an "Import Slider" feature. This is a common place for
unserialize()to be used on uploaded file contents.- Path: Search for
move_uploaded_fileor$_FILEScombined withunserialize.
- Path: Search for
- Settings Saving: Check if slider settings are sent as a JSON/Serialized blob in a single POST field.
- If the plugin uses
maybe_unserialize(), ensure the input starts witha:orO:to trigger the deserialization logic.
- If the plugin uses
Summary
The Slider Responsive Slideshow plugin for WordPress is vulnerable to PHP Object Injection in versions up to 1.5.4. This occurs because the plugin uses the PHP unserialize() function on user-supplied data, allowing authenticated attackers with Contributor-level permissions to inject arbitrary PHP objects that can trigger malicious property-oriented programming (POP) chains.
Exploit Outline
1. Authenticate to the WordPress site as a user with at least Contributor-level permissions. 2. Access the WordPress admin dashboard and identify the AJAX nonce used by the plugin for slider management, typically located in the source code or via localized JavaScript variables (e.g., window.responsive_slider_vars.ajax_nonce). 3. Craft a serialized PHP object payload. If a specific POP chain is known to exist in the environment (e.g., in WordPress core or other installed plugins), use it to achieve remote code execution or file manipulation. 4. Send a POST request to /wp-admin/admin-ajax.php with the action set to the plugin's vulnerable handler (e.g., related to saving or importing slider settings) and the serialized payload in the corresponding data parameter. 5. Monitor the server's response or error logs to confirm the object was successfully deserialized and the injection occurred.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.