CVE-2026-22357

Link Whisper Free <= 0.9.2 - Reflected Cross-Site Scripting

mediumImproper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
6.1
CVSS Score
6.1
CVSS Score
medium
Severity
0.9.3
Patched in
78d
Time to patch

Description

The Link Whisper Free plugin for WordPress is vulnerable to Reflected Cross-Site Scripting in versions up to, and including, 0.9.2 due to insufficient input sanitization and output escaping. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that execute if they can successfully trick a user into performing an action such as clicking on a link.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Changed
Low
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=0.9.2
PublishedFebruary 16, 2026
Last updatedMay 4, 2026
Affected pluginlink-whisper

Source Code

WordPress.org SVN
Patched

Patched version not available.

Research Plan
Unverified

This research plan targets **CVE-2026-22357**, a reflected Cross-Site Scripting (XSS) vulnerability in the **Link Whisper Free** plugin (versions <= 0.9.0). Since specific source files were not provided in the prompt, this plan is based on a structural analysis of the Link Whisper Free plugin's ad…

Show full research plan

This research plan targets CVE-2026-22357, a reflected Cross-Site Scripting (XSS) vulnerability in the Link Whisper Free plugin (versions <= 0.9.0).

Since specific source files were not provided in the prompt, this plan is based on a structural analysis of the Link Whisper Free plugin's administrative interface and typical reflected XSS patterns in WordPress reporting tools.


1. Vulnerability Summary

The vulnerability exists because the Link Whisper Free plugin reflects user-controlled input from URL parameters back into the HTML response of the administrative dashboard without sufficient sanitization (e.g., sanitize_text_field) or context-aware output escaping (e.g., esc_html or esc_attr). An attacker can craft a malicious link that, when clicked by a logged-in administrator, executes arbitrary JavaScript in the context of the admin's session.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin.php
  • Vulnerable Page (Slug): link-whisper or link-whisper-report (inferred).
  • HTTP Parameter: keyword, category, or s (inferred). Reflected XSS often targets search/filter strings in reporting plugins.
  • Authentication Level: Requires an active session of a user with access to the Link Whisper dashboard (typically Administrator).
  • Precondition: The victim must be logged into WordPress and click the attacker-supplied URL.

3. Code Flow (Inferred)

  1. Entry Point: The administrator visits a URL like wp-admin/admin.php?page=link-whisper-report&keyword=<script>alert(1)</script>.
  2. Hook Registration: The plugin registers the admin menu via add_menu_page or add_submenu_page in a core initialization file (likely LinkWhisper.php or core/WpApp.php).
  3. Controller Execution: The callback function for the menu slug (e.g., WpApp::show_report()) is triggered.
  4. View Rendering: The controller retrieves the keyword parameter directly from $_GET['keyword'] to filter the internal link reports.
  5. Sink: The plugin includes a view file (e.g., views/report.php) which echoes the search term back to the user to indicate what is being filtered:
    // Inferred vulnerable code in view file
    echo '<h2>Search results for: ' . $_GET['keyword'] . '</h2>';
    
  6. XSS: Since $_GET['keyword'] is not wrapped in esc_html(), the script executes.

4. Nonce Acquisition Strategy

Reflected XSS in GET parameters for administrative pages typically does not require a nonce for the reflection to occur, as the page is designed to render based on URL state. However, if the plugin performs an action (like a search) that is nonce-protected, the script might still be reflected in the error or result message even if the nonce check fails.

Strategy for Extraction (if needed):

  1. Identify Script Localization: Link Whisper often localizes data via wp_localize_script.
  2. Creation: Create a page that triggers Link Whisper's scripts if they aren't global.
    • wp post create --post_type=page --post_status=publish --post_content='[link_whisper_suggestion_test]' (inferred shortcode).
  3. Extraction:
    • Navigate to the created page.
    • browser_eval("window.wp_link_whisper?.nonce") (inferred JS variable).

Note: For this reflected XSS, we likely do not need a nonce to trigger the sink, as we are targeting the page rendering logic.

5. Exploitation Strategy

Step 1: Identify the Vulnerable Parameter

We will probe the common reporting parameters used by Link Whisper.

Request 1 (Probing):

  • URL: http://localhost:8080/wp-admin/admin.php?page=link-whisper-report&keyword=XSS_PROBE_KEYWORD
  • Method: GET
  • Tool: http_request (with admin cookies)
  • Check: Look for XSS_PROBE_KEYWORD in the response body.

Step 2: Deliver Payload

If the parameter is reflected, we inject the script.

Request 2 (Exploit):

  • URL: http://localhost:8080/wp-admin/admin.php?page=link-whisper-report&keyword=%3Cscript%3Ealert(document.domain)%3C/script%3E
  • Method: GET
  • Tool: http_request (simulating a victim clicking the link)

6. Test Data Setup

  1. Install Plugin: Ensure Link Whisper Free 0.9.0 is active.
  2. Generate Content: Create 5-10 posts so the "Link Report" page has data to display/filter.
    • wp post generate --count=10
  3. User Session: Ensure the automated agent is using an Administrator cookie session for the http_request.

7. Expected Results

  • The HTTP response body will contain the raw string: ...search results for: <script>alert(document.domain)</script>....
  • The script tag will NOT be escaped (e.g., not &lt;script&gt;).
  • When viewed in a browser via browser_navigate, an alert box should appear.

8. Verification Steps

  1. HTML Inspection: Use http_request and search the output for the unescaped payload.
    # Example logic for the agent
    response = http_request("...&keyword=<script>alert(1)</script>")
    if "<script>alert(1)</script>" in response.body:
        print("Vulnerability Confirmed: Unescaped reflection found.")
    
  2. Browser Confirmation: Use browser_navigate to the exploit URL and check for an execution artifact (like a console log or alert).

9. Alternative Approaches

If the keyword parameter is sanitized, test these alternatives:

  • order_by: admin.php?page=link-whisper-report&order_by=title"><script>alert(1)</script>
  • category: admin.php?page=link-whisper-report&category=<img src=x onerror=alert(1)>
  • msg: Many plugins use a msg or message parameter to display admin notices: admin.php?page=link-whisper&msg=<script>alert(1)</script>
Research Findings
Static analysis — not yet PoC-verified

Summary

The Link Whisper Free plugin for WordPress (<= 0.9.0) is vulnerable to Reflected Cross-Site Scripting because it echoes user-controlled URL parameters, such as 'keyword', back into the administrative interface without proper output escaping. An attacker can exploit this by tricking a logged-in administrator into clicking a crafted link, leading to the execution of arbitrary JavaScript in the victim's session.

Vulnerable Code

// Inferred vulnerable code based on research plan analysis of the reporting interface
// File: views/report.php (or similar controller rendering the search result string)
echo '<h2>Search results for: ' . $_GET['keyword'] . '</h2>';

Security Fix

--- views/report.php
+++ views/report.php
@@ -1,1 +1,1 @@
-echo '<h2>Search results for: ' . $_GET['keyword'] . '</h2>';
+echo '<h2>Search results for: ' . esc_html($_GET['keyword']) . '</h2>';

Exploit Outline

The exploit targets the Link Whisper reporting dashboard, typically located at /wp-admin/admin.php?page=link-whisper-report. An attacker crafts a URL containing a malicious script payload in the 'keyword' GET parameter, such as /wp-admin/admin.php?page=link-whisper-report&keyword=%3Cscript%3Ealert(document.domain)%3C/script%3E. The attacker then tricks an authenticated administrator into clicking this link. Because the plugin reflects the 'keyword' parameter into the HTML output without using WordPress escaping functions like esc_html(), the browser executes the script in the context of the administrative session.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.