CVE-2025-29013
Executive Summary
CVE-2025-29013 is a Missing Authorization vulnerability in the faaiq Custom Category/Post Type Post order WordPress plugin (slug: custom-post-order-category). This flaw allows an unauthenticated attacker to exploit incorrectly configured access control security levels, potentially reordering or manipulating custom post type and category display orders without proper permissions. The vulnerability affects all versions up to and including 1.6.0. As of this report, no official patch has been released, and no public proof-of-concept (PoC) or exploit code is available. The CVSS score is 5.4 (Medium), with a low EPSS probability (0.0%), indicating limited active exploitation at this time.
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 resides in a WordPress plugin ecosystem. The plugin is distributed via the official WordPress Plugin Directory and third-party repositories. Since no patch is available, users are advised to:
- Immediately disable or remove the plugin if not critical.
- Monitor the plugin’s official page for updates.
- Implement virtual patching via Web Application Firewall (WAF) rules.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): None (N) – No user action required.
- Scope (S): Unchanged (U) – Impact confined to the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure (e.g., order metadata).
- Integrity (I): Low (L) – Attacker can modify post/category order.
- Availability (A): None (N) – No denial-of-service impact.
Threat Level: Medium. Exploitation is trivial due to missing authorization checks, but the impact is limited to reordering content, not data theft or RCE.
Deep Dive & Mechanics
The vulnerability stems from the plugin’s failure to enforce proper capability checks on AJAX handlers or REST endpoints that process reordering requests. In WordPress, actions like wp_ajax_update_menu_order or custom hooks should verify current_user_can('edit_posts') or similar. The plugin custom-post-order-category exposes endpoints that allow any visitor (including unauthenticated users) to send crafted POST requests to reorder custom post types and categories.
Root Cause: The plugin registers AJAX actions without checking user capabilities. For example:
add_action('wp_ajax_update_custom_order', 'handle_order_update');
add_action('wp_ajax_nopriv_update_custom_order', 'handle_order_update'); // Missing auth check
The nopriv hook allows unauthenticated access, and the handler function does not verify permissions before updating the database.
Attack Vector: An attacker sends a POST request to /wp-admin/admin-ajax.php with action update_custom_order and parameters specifying the new order of posts/categories. The server processes the request without authentication.
Vulnerable vs. Patched Code
Vulnerable Code (<=1.6.0):
// In custom-post-order-category.php
add_action('wp_ajax_update_custom_order', 'custom_order_update');
add_action('wp_ajax_nopriv_update_custom_order', 'custom_order_update');
function custom_order_update() {
// No capability check
$order = $_POST['order'];
update_option('custom_post_order', $order);
wp_die();
}
Patched Code (Hypothetical):
add_action('wp_ajax_update_custom_order', 'custom_order_update');
// Remove nopriv hook to require authentication
function custom_order_update() {
// Verify user can edit posts
if (!current_user_can('edit_posts')) {
wp_die('Unauthorized', 403);
}
// Verify nonce
if (!wp_verify_nonce($_POST['_wpnonce'], 'custom_order_nonce')) {
wp_die('Invalid nonce', 403);
}
$order = sanitize_text_field($_POST['order']);
update_option('custom_post_order', $order);
wp_die();
}
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites: A WordPress site with the vulnerable plugin installed and active.
Step 1: Identify the AJAX action. Use browser developer tools or inspect plugin source code to find the action name (e.g., update_custom_order).
Step 2: Craft a POST request. Using curl:
curl -X POST http://target.com/wp-admin/admin-ajax.php \
-d "action=update_custom_order&order=3,2,1"
Step 3: Verify. Check the frontend or admin panel to see if the order of posts/categories has changed.
Note: No public exploit code is available. This is a conceptual demonstration.
Blue Team (Detection & Hardening)
Detection:
- Monitor
admin-ajax.phprequests for unknown or suspiciousactionparameters. - Look for repeated POST requests to
admin-ajax.phpwithaction=update_custom_orderfrom unauthenticated IPs.
Hardening:
- Disable the plugin immediately.
- Implement a WAF rule to block requests to
admin-ajax.phpwithactioncontainingcustom_orderunless from authenticated users. - Add custom code to
functions.phpto enforce capability checks:
add_action('init', function() {
if (isset($_POST['action']) && $_POST['action'] === 'update_custom_order') {
if (!current_user_can('edit_posts')) {
wp_die('Unauthorized', 403);
}
}
});
Indicators of Compromise (IOCs)
- Network: POST requests to
/wp-admin/admin-ajax.phpwith body containingaction=update_custom_order. - File: Presence of plugin directory
/wp-content/plugins/custom-post-order-category/with version <= 1.6.0. - Log: WordPress debug log entries showing
custom_order_updatefunction calls without authentication. - Database: Modified
wp_optionstable entrycustom_post_orderwith unexpected values.
Detection Engineering
YARA Rule
rule CVE_2025_29013_WordPress_Plugin {
meta:
description = "Detects vulnerable custom-post-order-category plugin files"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-29013"
strings:
$s1 = "add_action('wp_ajax_nopriv_update_custom_order'" nocase
$s2 = "function custom_order_update()" nocase
$s3 = "update_option('custom_post_order'" nocase
condition:
all of ($s1, $s2, $s3)
}
Sigma Rule
title: CVE-2025-29013 - Missing Authorization in custom-post-order-category
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects unauthenticated POST requests to admin-ajax.php with suspicious action parameter
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: '/wp-admin/admin-ajax.php'
cs-uri-query|contains: 'action=update_custom_order'
condition: selection
falsepositives:
- Legitimate admin actions (rare)
level: high
Suricata Rule
alert http $EXTERNAL_NET any -> $HOME_NET any (
msg:"CVE-2025-29013 - Missing Authorization in custom-post-order-category";
flow:to_server,established;
content:"POST"; http_method;
content:"/wp-admin/admin-ajax.php"; http_uri;
content:"action=update_custom_order"; http_client_body;
classtype:attempted-admin;
sid:10000001;
rev:1;
reference:cve,2025-29013;
)
Remediation & Mitigation
- Immediate Action: Disable and remove the plugin
custom-post-order-categoryuntil a patch is released. - Virtual Patching: Deploy WAF rules to block requests to
admin-ajax.phpwithaction=update_custom_orderfrom unauthenticated sources. - Code Fix: If you must keep the plugin, manually edit the plugin file to add capability checks (see patched code example above).
- Monitoring: Enable detailed logging for
admin-ajax.phpand review for suspicious activity. - Update: Watch the WordPress Plugin Directory for an official update. Subscribe to CVE alerts.
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.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.