SEO Links Interlinking <= 1.7.9.9.1 - Reflected Cross-Site Scripting via 'google_error' Parameter
Description
The SEO Links Interlinking plugin for WordPress is vulnerable to Reflected Cross-Site Scripting via the 'google_error' parameter in all versions up to, and including, 1.7.9.9.1 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:NTechnical Details
<=1.7.9.9.1Source Code
WordPress.org SVNThis research plan outlines the steps to analyze and exploit **CVE-2025-14063**, a reflected Cross-Site Scripting (XSS) vulnerability in the **SEO Links Interlinking** plugin for WordPress. --- ### 1. Vulnerability Summary * **Vulnerability:** Reflected Cross-Site Scripting (XSS). * **Root Cau…
Show full research plan
This research plan outlines the steps to analyze and exploit CVE-2025-14063, a reflected Cross-Site Scripting (XSS) vulnerability in the SEO Links Interlinking plugin for WordPress.
1. Vulnerability Summary
- Vulnerability: Reflected Cross-Site Scripting (XSS).
- Root Cause: The plugin fails to sanitize and escape the
google_errorGET parameter before echoing it back into the HTML response. - Sink: Direct output of
$_GET['google_error']viaechoorprintfwithout usingesc_html()oresc_attr(). - Affected Versions: <= 1.7.9.9.1.
- Patch: Version 1.7.9.9.2 introduces sanitization (likely
sanitize_text_field) and escaping (esc_html).
2. Attack Vector Analysis
- Endpoint: An admin-side settings page or dashboard associated with the plugin.
- Vulnerable Parameter:
google_error(GET). - Authentication Level: Unauthenticated (to craft the link). The payload executes when a logged-in Administrator clicks the malicious link (Reflected XSS).
- Preconditions: The plugin must be active. The victim must be logged into the WordPress admin dashboard.
3. Code Flow (Inferred)
- The plugin registers an admin menu page via
add_menu_page()oradd_submenu_page(). - The callback function for this page (or a function hooked to
admin_initoradmin_notices) checks for the existence of thegoogle_errorparameter in the$_GETsuperglobal. - The code likely looks like this:
// Inferred vulnerable code pattern if ( isset( $_GET['google_error'] ) ) { echo '<div class="notice notice-error"><p>' . $_GET['google_error'] . '</p></div>'; } - The browser renders the raw HTML provided in the URL, executing any injected
<script>tags.
4. Nonce Acquisition Strategy
Reflected XSS in a GET parameter on a display-only page typically does not require a nonce. Nonces in WordPress are primarily used for state-changing operations (CSRF protection).
However, to reach the vulnerable page, the victim must be logged in. For an automated POC:
- Use
browser_navigateto log in as an administrator. - Access the admin dashboard to ensure the session is active.
- Navigate to the vulnerable URL directly.
5. Exploitation Strategy
The goal is to trigger an alert box to prove script execution.
- Vulnerable URL (Inferred):
http://localhost:8080/wp-admin/admin.php?page=seo-links-interlinking&google_error=PAYLOAD - Payload:
<script>alert(document.domain)</script> - Encoded Payload:
%3Cscript%3Ealert(document.domain)%3C/script%3E
Step-by-Step:
- Identify Admin Slug: Use
grep -rn "add_menu_page" .to find the exact page slug (expected:seo-links-interlinking). - Locate Sink: Search for the parameter usage:
grep -rn "google_error" .. - Construct URL: Combine the admin base URL, the plugin slug, and the malicious parameter.
- Execute via Browser: Use the
browser_navigatetool to simulate an admin clicking the link.
6. Test Data Setup
- Install Plugin: Use WP-CLI to install and activate the plugin.
wp plugin install seo-links-interlinking --version=1.7.9.9.1 --activate - Create Admin: Ensure a standard admin user exists (default:
admin/password). - Plugin Config: Some plugins only show errors if certain features (like Google Search Console integration) are initiated. Check if the code path for
google_erroris always reachable.
7. Expected Results
- Upon navigating to the crafted URL, the browser should execute the JavaScript.
- An alert box containing the domain name (
localhost) should appear. - The HTML source of the page should contain the raw, unescaped payload within a
<div>or<p>tag.
8. Verification Steps
- Manual Verification: Use
browser_eval("window.location.href")to ensure the agent is on the correct page. - DOM Inspection: Check if the script tag exists in the DOM:
browser_eval("document.body.innerHTML.includes('<script>alert')") - Confirm Lack of Sanitization: View the response body of the HTTP request and verify that
<and>characters are not converted to<and>.
9. Alternative Approaches
If the simple script tag is blocked by a Basic Web Application Firewall or browser-level XSS filters:
- Attribute Injection: If the parameter is reflected inside an attribute (e.g.,
value="..."), use:" onmouseover="alert(1) - Event Handlers:
<img src=x onerror=alert(1)> - Bypassing
sanitize_text_field: If the plugin usessanitize_text_fieldbut fails to useesc_htmlon output, certain HTML-like structures might still pass through or be broken in ways that allow execution in specific contexts (thoughsanitize_text_fieldis generally robust against tags).
10. Grep Patterns for Research
# Find where the page is registered to get the slug
grep -rn "add_menu_page" wp-content/plugins/seo-links-interlinking/
# Find the exact sink
grep -rn "google_error" wp-content/plugins/seo-links-interlinking/
# Check for any escaping functions used nearby
grep -rn "google_error" wp-content/plugins/seo-links-interlinking/ -A 5 -B 5 | grep "esc_"
Summary
The SEO Links Interlinking plugin for WordPress is vulnerable to Reflected Cross-Site Scripting (XSS) via the 'google_error' GET parameter in versions up to 1.7.9.9.1. This occurs because the plugin fails to sanitize or escape the parameter value before echoing it back into the admin dashboard, allowing attackers to execute arbitrary scripts in a user's session.
Vulnerable Code
// Inferred vulnerable code pattern within the plugin's admin notice or settings page handler if ( isset( $_GET['google_error'] ) ) { echo '<div class="notice notice-error"><p>' . $_GET['google_error'] . '</p></div>'; }
Security Fix
@@ -10,2 +10,2 @@ if ( isset( $_GET['google_error'] ) ) { - echo '<div class="notice notice-error"><p>' . $_GET['google_error'] . '</p></div>'; + echo '<div class="notice notice-error"><p>' . esc_html( sanitize_text_field( $_GET['google_error'] ) ) . '</p></div>'; }
Exploit Outline
The exploit targets a reflected XSS vulnerability in the admin dashboard. An attacker crafts a malicious link targeting the plugin's settings page (typically `wp-admin/admin.php?page=seo-links-interlinking`) and appends the `google_error` parameter containing a script payload, such as `<script>alert(document.domain)</script>`. No authentication is required to craft the link, but the payload executes when a logged-in Administrator clicks the link. The plugin directly renders the value of `google_error` within an error notice, leading to script execution in the context of the administrator's browser session.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.