Perfmatters WordPress Plugin Arbitrary File Deletion (CVE-2026-4350)
by whyiamsobusy · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-4350
- Category
- web
- Affected product
- Perfmatters WordPress plugin
- Affected versions
- <= 2.5.9.1
- Disclosed
- 2026-07-05
- Patch status
- unpatched
Tags
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-06 |
| Author / Researcher | whyiamsobusy |
| CVE / Advisory | CVE-2026-4350 |
| Category | web |
| Severity | High |
| CVSS Score | 8.1 (per upstream repo; vector not published) |
| Status | PoC |
| Tags | wordpress, plugin, perfmatters, path-traversal, arbitrary-file-deletion, admin-ajax, dos, nuclei |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Perfmatters WordPress plugin |
| Versions Affected | <= 2.5.9.1 |
| Language / Platform | PHP / WordPress |
| Authentication Required | No (per PoC — unauthenticated admin-ajax.php request) |
| Network Access Required | Yes — HTTP access to the target WordPress site |
Summary
CVE-2026-4350 is a path traversal vulnerability in the Perfmatters WordPress performance plugin that allows arbitrary file deletion. The plugin’s perfmatters_delete AJAX action (reachable via wp-admin/admin-ajax.php) takes a delete parameter and passes it to a file-deletion routine without sanitizing directory-traversal sequences, allowing an attacker to delete arbitrary files on the server filesystem, including core WordPress files such as wp-config.php.
Vulnerability Details
Root Cause
The perfmatters_delete AJAX handler reads the delete request parameter ($_GET['delete']) directly and uses it to build a filesystem path for a delete operation, with no path-traversal sanitization or containment to an expected plugin-owned directory. Supplying a relative path such as ../../../../wp-config.php escapes the intended directory and targets arbitrary files relative to the WordPress webroot.
Attack Vector
- An attacker sends an HTTP GET request to
wp-admin/admin-ajax.php?action=perfmatters_delete&delete=<traversal-path>on a target running a vulnerable Perfmatters version. - The
deleteparameter is not validated/sanitized, so a traversal sequence like../../../../wp-config.phpresolves outside the plugin’s intended data directory. - The plugin deletes the resolved file. Deleting
wp-config.phpremoves the site’s database credentials/config, breaking the site (denial of service) and potentially enabling further compromise if the attacker can subsequently trigger WordPress’s setup wizard to supply their own database configuration (a known post-exploitation pattern for this class of bug, though not demonstrated in this PoC).
Impact
Unauthenticated arbitrary file deletion leading to denial of service (site outage via deletion of wp-config.php, .htaccess, or other critical files) and potential full site takeover if an attacker can re-run WordPress installation/setup against a database they control after deleting the configuration file.
Environment / Lab Setup
Target: WordPress site with Perfmatters plugin <= 2.5.9.1 installed and active.
Lab: vulnerable-setup/docker-compose.yml brings up a stock `wordpress` Docker
image on port 8080 (the Perfmatters plugin itself must be installed
separately into the WordPress instance to reproduce the vulnerable
configuration).
Run lab:
cd vulnerable-setup && docker compose up -d
Proof of Concept
PoC Script
See
exploit/exploit.py,poc/poc.sh, andnuclei/cve-2026-4350.yamlin this folder.
| |
Running the exploit sends unauthenticated requests to wp-admin/admin-ajax.php?action=perfmatters_delete with traversal payloads targeting wp-config.php and .htaccess; a vulnerable target returns an HTTP success status and the targeted file is removed from disk.
Detection & Indicators of Compromise
Web server / access log signature:
GET /wp-admin/admin-ajax.php?action=perfmatters_delete&delete=../../../../wp-config.php
GET /wp-admin/admin-ajax.php?action=perfmatters_delete&delete=../../../../.htaccess
Signs of compromise:
- Unexpected disappearance of
wp-config.php,.htaccess, or other core files, followed by site errors (“Error establishing a database connection” or similar). - Access log entries containing
action=perfmatters_deletecombined with../traversal sequences in thedeleteparameter. - WordPress setup/installation wizard (
wp-admin/setup-config.php) being accessed shortly after a file-deletion event (potential follow-on takeover attempt).
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update the Perfmatters plugin to a patched version beyond 2.5.9.1 that sanitizes/validates the delete parameter and restricts deletions to an expected directory. |
| Interim mitigation | Disable or remove the Perfmatters plugin until patched; use a WAF rule to block admin-ajax.php requests with action=perfmatters_delete containing ../ sequences; restrict filesystem permissions so the web server user cannot delete wp-config.php/.htaccess. |
References
Notes
Mirrored from https://github.com/whyiamsobusy/CVE-2026-4350 on 2026-07-05.