CVE-2025-28894 Overview
CVE-2025-28894 is a Cross-Site Request Forgery (CSRF) vulnerability in the "List of Posts from each Category" WordPress plugin developed by frucomerci. This vulnerability allows attackers to chain CSRF with Stored Cross-Site Scripting (XSS), enabling malicious actors to inject persistent JavaScript code into the affected WordPress site by tricking authenticated administrators into performing unintended actions.
Critical Impact
Successful exploitation allows attackers to inject malicious scripts that persist on the WordPress site, potentially leading to session hijacking, administrative account takeover, malware distribution to site visitors, and defacement of the affected website.
Affected Products
- List of Posts from each Category plugin for WordPress version 2.0 and earlier
- All WordPress installations using the vulnerable plugin versions
Discovery Timeline
- 2025-03-11 - CVE-2025-28894 published to NVD
- 2026-04-15 - Last updated in NVD database
Technical Details for CVE-2025-28894
Vulnerability Analysis
This vulnerability combines two distinct attack vectors: Cross-Site Request Forgery (CSRF) and Stored Cross-Site Scripting (XSS). The plugin fails to implement proper CSRF token validation on forms that process user input, and simultaneously lacks adequate output encoding for data rendered on the page. This dual weakness creates a chained attack scenario where an attacker can craft a malicious page that, when visited by an authenticated WordPress administrator, submits a forged request containing XSS payloads that get stored in the database and executed whenever the affected content is viewed.
The CSRF component (CWE-352) stems from the absence of nonce verification on critical plugin operations, allowing cross-origin requests to modify plugin settings or content. The stored XSS component arises from improper sanitization of input data before storage and insufficient escaping during output rendering.
Root Cause
The root cause is twofold: First, the plugin does not validate WordPress nonces on form submissions, failing to verify that requests originate from legitimate user actions within the WordPress admin interface. Second, user-supplied input is stored without proper sanitization using functions like sanitize_text_field() or wp_kses(), and is later rendered without escaping via esc_html() or esc_attr(). This allows JavaScript payloads to persist in the database and execute in the context of any user viewing the affected pages.
Attack Vector
The attack follows a multi-stage process. An attacker first crafts a malicious HTML page containing a hidden form that submits to the vulnerable plugin endpoint. This form includes XSS payloads in the input fields. When an authenticated WordPress administrator visits the attacker-controlled page, the form auto-submits via JavaScript, sending the malicious request with the admin's session cookies. The plugin processes this request without verifying the nonce, stores the XSS payload, and subsequently renders the malicious script to all users viewing the affected content.
The attack does not require authentication from the attacker's perspective—they only need to lure an authenticated administrator to their malicious page. Once the stored XSS payload is in place, it can steal session cookies, create rogue administrator accounts, or redirect visitors to phishing sites.
Detection Methods for CVE-2025-28894
Indicators of Compromise
- Unexpected JavaScript code or <script> tags appearing in plugin-managed content or database entries
- Suspicious outbound requests to unknown domains originating from the WordPress admin interface
- New administrator accounts created without authorization
- Modified plugin settings that administrators did not change
Detection Strategies
- Review database entries managed by the List of Posts from each Category plugin for unexpected HTML or JavaScript content
- Monitor WordPress audit logs for configuration changes to the affected plugin that lack corresponding admin activity
- Implement Content Security Policy (CSP) headers to detect and block unauthorized inline script execution
- Use web application firewalls (WAF) to identify and block CSRF attack patterns and XSS payloads
Monitoring Recommendations
- Enable and regularly review WordPress activity logs for plugin setting modifications
- Configure alerts for new user account creation, especially administrator-level accounts
- Monitor client-side errors and CSP violation reports that may indicate XSS execution attempts
- Periodically scan plugin database tables for injection patterns using security scanning tools
How to Mitigate CVE-2025-28894
Immediate Actions Required
- Deactivate and remove the "List of Posts from each Category" plugin if version 2.0 or earlier is installed
- Audit the WordPress database for any stored XSS payloads that may have been injected
- Review user accounts and remove any unauthorized administrator accounts
- Change passwords for all administrator accounts as a precautionary measure
Patch Information
At the time of publication, no patch has been confirmed for this vulnerability. Website administrators should monitor the Patchstack vulnerability database for updates regarding a security fix. Until a patch is available, removing the plugin is the recommended remediation.
Workarounds
- Remove the vulnerable plugin entirely until a patched version is released
- If the plugin functionality is essential, implement a Web Application Firewall (WAF) rule to block requests without valid nonces
- Restrict admin access to trusted IP addresses to reduce the attack surface for CSRF exploitation
- Educate administrators to avoid clicking unknown links while logged into the WordPress dashboard
# WordPress CLI command to deactivate the vulnerable plugin
wp plugin deactivate list-posts-by-category
# Verify plugin is deactivated
wp plugin list --status=inactive | grep list-posts-by-category
# Optional: Remove the plugin entirely
wp plugin delete list-posts-by-category
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.


