Smart Slider 3 <= 3.5.1.37 - Missing Authorization to Authenticated (Contributor+) Sensitive Information Exposure via WP_Query Parameter Injection via 'keyword' Parameter
Description
The Smart Slider 3 plugin for WordPress is vulnerable to Sensitive Information Exposure in all versions up to, and including, 3.5.1.37 via the 'keyword' parameter. This makes it possible for authenticated attackers, with contributor-level access and above, to extract titles and full content excerpts of private, draft, pending, trashed, and auto-draft posts authored by any user, including Administrators and Editors. The required nonce is emitted on /wp-admin/post-new.php, which is accessible to Contributor-level users via the edit_posts capability, meaning any Contributor can obtain the nonce needed to trigger the injection.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:NTechnical Details
<=3.5.1.37What Changed in the Fix
Changes introduced in v3.5.1.38
Source Code
WordPress.org SVN# Exploitation Research Plan - CVE-2026-12385 ## 1. Vulnerability Summary The **Smart Slider 3** plugin (up to version 3.5.1.37) is vulnerable to **Sensitive Information Exposure** via a `WP_Query` parameter injection. The vulnerability exists because the `keyword` parameter provided to AJAX search…
Show full research plan
Exploitation Research Plan - CVE-2026-12385
1. Vulnerability Summary
The Smart Slider 3 plugin (up to version 3.5.1.37) is vulnerable to Sensitive Information Exposure via a WP_Query parameter injection. The vulnerability exists because the keyword parameter provided to AJAX search actions is concatenated directly into a query string used to instantiate a WP_Query object. Since WP_Query parses string inputs similar to URL query strings, an attacker can inject additional parameters (separated by &) to override hardcoded constraints like post_status=publish. This allows authenticated users with Contributor permissions to retrieve the titles and excerpts of private, draft, or trashed posts authored by any user.
2. Attack Vector Analysis
- Target Endpoint:
/wp-admin/admin-ajax.php - AJAX Action:
nextend-smartslider3(via the Nextend Framework's AJAX routing). - Vulnerable Parameters:
nextendcontroller:contentnextendaction:SearchContent(orSearchLink)keyword: The injection point.
- Authentication: Authenticated (Contributor level or higher).
- Preconditions: The attacker must obtain a valid Nextend security token (nonce).
3. Code Flow
- Entry Point: A request is sent to
admin-ajax.php?action=nextend-smartslider3. - Routing: The Nextend framework routes this to
Nextend\Framework\Content\ControllerAjaxContent. - Controller Logic: In
ControllerAjaxContent.php, the methodactionSearchContent()is called:- It calls
$this->validateToken()to verify the nonce. - It retrieves
$keywordfromRequest::$REQUEST->getVar('keyword', ''). - It calls
Content::searchContent($keyword).
- It calls
- Sink: In
Nextend\Framework\Content\WordPress\WordPressContent.php, thesearchContent($keyword)method is executed:- It constructs a query string:
'post_type=any&posts_per_page=20&post_status=publish&s=' . $keyword. - It passes this string to
new WP_Query(...).
- It constructs a query string:
- Injection: If
$keywordis set to&post_status=any, the resulting string ispost_type=any&posts_per_page=20&post_status=publish&s=&post_status=any. - Execution:
WP_Queryparses this string. When duplicate keys exist in a query string, the later values typically override earlier ones. Thus,post_statusbecomesany, causing the query to return non-public posts.
4. Nonce Acquisition Strategy
The plugin emits the required security token (nonce) on pages where the Smart Slider editor interface or post-insertion tools are loaded. Per the vulnerability description, this occurs on /wp-admin/post-new.php.
Strategy:
- Log in as a Contributor.
- Navigate to
http://<TARGET>/wp-admin/post-new.php. - The token is typically localized in a global JavaScript object named
nextendor passed viawp_localize_script. - Use
browser_evalto find the token:- Target Variable:
window.nextend.token(orwindow.N2Wordpress.token). - Based on Nextend framework history, the key is often stored in
window.nextend.token.
- Target Variable:
5. Exploitation Strategy
Step 1: Authentication & Nonce Extraction
- Use
http_requestto log in as a Contributor. - Use
browser_navigateto go to/wp-admin/post-new.php. - Use
browser_evalto extract the token:window.nextend?.token || "Not Found"
Step 2: Sensitive Information Extraction
Perform a POST request to admin-ajax.php injecting the post_status parameter.
- URL:
http://<TARGET>/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Parameters:
action:nextend-smartslider3nextendcontroller:contentnextendaction:SearchContentn2token:[EXTRACTED_TOKEN]keyword:&post_status=any
Step 3: Specific Post Retrieval (Targeted)
To leak the content of a specific private post (e.g., ID 1234):
- keyword:
&p=1234&post_status=any
6. Test Data Setup
- Administrator Actions:
- Create a post with
post_statusset toprivate. - Title:
SECRET_ADMIN_POST_TITLE - Content:
This is sensitive administrator information that contributors should not see.
- Create a post with
- Contributor User:
- Create a user with the
contributorrole.
- Create a user with the
7. Expected Results
- Success: The AJAX response (JSON) will contain an array of objects. One of these objects will have:
title:SECRET_ADMIN_POST_TITLEdescription: The excerpt/content of the private post.info:Post(or the post type label).
- Failure: The response returns only public posts or an error indicating an invalid token/permissions.
8. Verification Steps
- Check Output: Inspect the JSON response from the
http_requesttool to confirm the presence of theSECRET_ADMIN_POST_TITLE. - WP-CLI Verification: Confirm the post's status is indeed private:
wp post list --post_type=post --post_status=private --fields=ID,post_title
9. Alternative Approaches
- Action
SearchLink: IfSearchContentis restricted, testnextendaction=SearchLink. It uses the sameWP_Querylogic but returns only titles and permalinks. - Bypassing
s=: If the search termsinterferes, trykeywordas&post_status=private&posts_per_page=-1to list all private posts regardless of search relevance. - Post Type Enumeration: Inject
&post_type=page&post_status=draftto find draft pages specifically.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.