CVE-2025-68069
Executive Summary
CVE-2025-68069 is a Missing Authorization vulnerability in the wpWax Directorist WordPress plugin, affecting versions from n/a through 8.6.6. This flaw allows an unauthenticated attacker to exploit incorrectly configured access control security levels, potentially leading to unauthorized data access, modification, or privilege escalation. The vulnerability is classified under CWE-862 (Missing Authorization) and carries a CVSS score of 7.1 (High). As of the latest intelligence, no official patch has been released, and no public proof-of-concept (PoC) or exploit code is available. The EPSS score is 0.0%, indicating low exploitation likelihood in the wild, but the risk remains significant for unpatched installations.
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 the WordPress ecosystem via the Directorist plugin. Since it is a third-party plugin, the supply chain risk is elevated: site administrators must rely on the vendor (wpWax) for a patch. No known malicious packages or compromised updates have been reported, but the lack of a patch increases the attack surface for supply chain attacks targeting WordPress sites.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L
- Base Score: 7.1 (High)
- Attack Vector: Network (AV:N) – Exploitable remotely.
- Attack Complexity: Low (AC:L) – No special conditions required.
- Privileges Required: None (PR:N) – No authentication needed.
- User Interaction: None (UI:N) – No user action required.
- Scope: Unchanged (S:U) – Vulnerability does not affect other components.
- Confidentiality Impact: Low (C:L) – Limited data exposure.
- Integrity Impact: Low (I:L) – Limited data modification.
- Availability Impact: Low (A:L) – Limited service disruption.
Threat Level: High. The combination of network exploitability, low complexity, and no required privileges makes this a serious risk for any WordPress site using the Directorist plugin.
Deep Dive & Mechanics
The vulnerability resides in the Directorist plugin’s access control mechanisms. The plugin fails to properly validate user permissions before executing sensitive operations, such as viewing, editing, or deleting directory listings, categories, or user profiles. This is a classic Missing Authorization flaw (CWE-862), where the application does not enforce proper access controls on certain endpoints or functions.
Root Cause: The plugin likely uses current_user_can() checks inconsistently or omits them entirely in some REST API endpoints or AJAX handlers. An attacker can craft HTTP requests to these unprotected endpoints to perform actions that should require administrative or editor-level privileges.
Attack Vector: An unauthenticated attacker sends specially crafted HTTP requests (e.g., POST/GET to /wp-json/directorist/v1/... or AJAX actions) to exploit the missing authorization. The attack does not require any prior knowledge or credentials.
Impact: Successful exploitation could allow an attacker to:
- View or modify directory listings.
- Access sensitive user data (e.g., email addresses, phone numbers).
- Escalate privileges by creating new admin users (if the plugin exposes user management endpoints).
- Deface or manipulate directory content.
Vulnerable vs. Patched Code
Since no patch is available, we can only infer the vulnerable code pattern. The issue likely involves a function like directorist_ajax_handler() or a REST API callback that lacks proper capability checks.
Vulnerable Code (Hypothetical):
add_action('wp_ajax_nopriv_directorist_delete_listing', 'directorist_delete_listing');
function directorist_delete_listing() {
$listing_id = $_POST['listing_id'];
// Missing current_user_can() check
wp_delete_post($listing_id);
wp_die();
}
Patched Code (Expected):
add_action('wp_ajax_nopriv_directorist_delete_listing', 'directorist_delete_listing');
function directorist_delete_listing() {
if (!current_user_can('edit_posts')) {
wp_die('Unauthorized', 403);
}
$listing_id = $_POST['listing_id'];
wp_delete_post($listing_id);
wp_die();
}
The patch would add current_user_can() checks to all sensitive endpoints, ensuring only authorized users can perform privileged actions.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A WordPress site with Directorist plugin version <= 8.6.6.
- No authentication required.
Exploitation Steps:
- Identify vulnerable endpoints by analyzing the plugin’s REST API routes (e.g.,
/wp-json/directorist/v1/). - Send a crafted HTTP request to an unprotected endpoint. For example, to delete a listing:
curl -X POST https://target.com/wp-admin/admin-ajax.php \ -d 'action=directorist_delete_listing&listing_id=123' - If successful, the listing is deleted without authentication.
Note: No public exploit code is available. The above is a hypothetical example based on common patterns.
Blue Team (Detection & Defense)
Detection:
- Monitor for unusual HTTP requests to
/wp-admin/admin-ajax.phpor/wp-json/directorist/v1/with unexpected parameters. - Look for spikes in 403 errors (if plugin partially blocks) or successful operations without prior authentication.
Defense:
- Immediately update the plugin if a patch becomes available.
- Implement a Web Application Firewall (WAF) rule to block requests to sensitive Directorist endpoints from unauthenticated users.
- Use a security plugin (e.g., Wordfence) to add virtual patching.
- Restrict access to
/wp-admin/via IP whitelisting or VPN.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests to
/wp-admin/admin-ajax.phpwithaction=directorist_*parameters from unauthenticated sources. - Unusual POST requests to
/wp-json/directorist/v1/endpoints.
- HTTP requests to
- File IOCs:
- Modified or deleted directory listings in the database.
- New user accounts with elevated privileges (if exploited for privilege escalation).
- Log IOCs:
- Access logs showing 200 responses to sensitive endpoints from IPs not associated with admin users.
- Error logs with
directoristfunction calls without proper capability checks.
Detection Engineering
YARA Rule
rule Detect_Directorist_Missing_Auth {
meta:
description = "Detects attempts to exploit CVE-2025-68069 in Directorist plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-68069"
strings:
$s1 = "directorist_delete_listing" ascii wide nocase
$s2 = "directorist_edit_listing" ascii wide nocase
$s3 = "directorist_create_user" ascii wide nocase
condition:
any of them
}
Sigma Rule
title: Directorist Missing Authorization Exploitation
id: 8a4b3c2d-1e5f-6a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects HTTP requests targeting Directorist plugin endpoints without authentication
author: Valters IT
date: 2025/04/10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains:
- 'action=directorist_'
- '/wp-json/directorist/v1/'
condition: selection
falsepositives:
- Legitimate admin actions (if authenticated)
level: high
Suricata Rule
alert http any any -> $HOME_NET any (
msg:"CVE-2025-68069 - Directorist Missing Authorization Attempt";
flow:to_server,established;
content:"POST";
http_method;
content:"action=directorist_";
http_client_body;
sid:1000001;
rev:1;
reference:cve,2025-68069;
classtype:attempted-admin;
priority:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable the Directorist plugin until a patch is released.
- If disabling is not possible, restrict access to the plugin’s endpoints using a WAF or
.htaccessrules. - Monitor logs for any signs of exploitation.
Long-term Fix:
- Apply the official patch from wpWax as soon as it becomes available.
- Implement a least privilege access control policy for all WordPress plugins.
- Regularly audit plugin code for missing authorization checks.
Workaround:
- Add a custom function to your theme’s
functions.phpto block unauthenticated access to Directorist AJAX actions:add_action('init', function() { if (defined('DOING_AJAX') && DOING_AJAX) { $action = $_POST['action'] ?? ''; if (strpos($action, 'directorist_') === 0 && !is_user_logged_in()) { wp_die('Unauthorized', 403); } } });
Valters IT
Securing Digital Frontiers
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.