Merge + Minify + Refresh <= 2.14 - Cross-Site Request Forgery
Description
The Merge + Minify + Refresh plugin for WordPress is vulnerable to Cross-Site Request Forgery in all versions up to, and including, 2.14. This is due to missing or incorrect nonce validation on a function. This makes it possible for unauthenticated attackers to perform an unauthorized action granted they can trick a site administrator into performing an action such as clicking on a link.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:NTechnical Details
<=2.14Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2026-24384 (Merge + Minify + Refresh CSRF) ## 1. Vulnerability Summary The **Merge + Minify + Refresh** plugin (up to version 2.14) is vulnerable to Cross-Site Request Forgery (CSRF). The vulnerability exists because the plugin registers a function to handle cache …
Show full research plan
Exploitation Research Plan: CVE-2026-24384 (Merge + Minify + Refresh CSRF)
1. Vulnerability Summary
The Merge + Minify + Refresh plugin (up to version 2.14) is vulnerable to Cross-Site Request Forgery (CSRF). The vulnerability exists because the plugin registers a function to handle cache purging or settings updates via the admin_init or admin_post hooks without implementing proper nonce validation (e.g., check_admin_referer). This allows an unauthenticated attacker to trick a logged-in administrator into triggering administrative actions, such as clearing the plugin's optimization cache, by visiting a malicious link.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/index.phpor any admin page (triggered viaadmin_init). - Hook:
admin_init. - Vulnerable Function: Likely
purge_cache()or a similar administrative action handler. - HTTP Parameter:
mmr_purge(inferred from common plugin patterns and version 2.14 logic). - Authentication Level: Administrator (victim must be logged in).
- Preconditions: The plugin must be active.
3. Code Flow
- The plugin initializes and registers a method (e.g.,
purge_cache) to theadmin_inithook. - When any admin page is loaded, the
admin_inithook fires. - The vulnerable function checks for the presence of a specific GET parameter (e.g.,
$_GET['mmr_purge']). - If the parameter is present, the function proceeds to delete files in the cache directory (
wp-content/cache/mmr/). - Vulnerability: The function fails to call
check_admin_referer()orwp_verify_nonce()before performing the file deletions.
4. Nonce Acquisition Strategy
This vulnerability is characterized by missing nonce validation. Therefore, no nonce is required to exploit the vulnerability. The goal of the CSRF is to trigger the action using the administrator's existing session without providing a valid security token.
5. Exploitation Strategy
The goal is to trigger the cache purge action remotely via the administrator's browser.
Step-by-Step Plan:
- Identify the Trigger: Verify the exact GET parameter used for purging. Based on version 2.14, it is likely
mmr_purge. - Determine the Cache Directory: Confirm the location of the cached files (usually
wp-content/cache/mmr/). - Populate Cache: Visit the site frontend as an anonymous user to ensure the plugin generates some merged/minified files.
- Execute CSRF: Use the
http_requesttool to simulate the administrator's browser sending a GET request to the purge endpoint.
Exploit Request (Simulated via Admin Session):
GET /wp-admin/index.php?mmr_purge=1 HTTP/1.1
Host: localhost:8080
Cookie: [Admin Session Cookies]
Payload Details:
- Method:
GET - URL:
http://localhost:8080/wp-admin/index.php?mmr_purge=1 - Expected Outcome: The plugin deletes all files in the MMR cache directory.
6. Test Data Setup
- Install Plugin: Install Merge + Minify + Refresh version 2.14.
- Enable Optimization: Ensure JS/CSS merging is enabled in the plugin settings.
- Generate Cache:
- Use
browser_navigateto visit the homepage:http://localhost:8080/. - Verify files exist in the cache:
ls -la /var/www/html/wp-content/cache/mmr/.
- Use
- Create Admin User: Ensure a standard administrator user exists for the session context.
7. Expected Results
- Before the request,
/wp-content/cache/mmr/should contain several.jsand.cssfiles. - After the administrator (simulated by the agent) sends the request with
?mmr_purge=1, the response should typically redirect back to the admin dashboard or show a success message. - The directory
/wp-content/cache/mmr/should now be empty or significantly cleared of files.
8. Verification Steps
After performing the exploit with the http_request tool:
- Check Filesystem:
A result ofwp eval 'echo count(glob(WP_CONTENT_DIR . "/cache/mmr/*"));'0(or a lower count than before) indicates the purge was successful. - Check Plugin Options (if applicable): Check if any "last purge" timestamp option was updated in the database.
wp option get mmr_last_purge (inferred)
9. Alternative Approaches
If mmr_purge via GET does not work, investigate:
- POST-based actions: Check if the purge or settings save requires a
POSTrequest toadmin-post.phpwithaction=mmr_save_settings. - Different Parameters: Check for
action=mmr_refreshormmr_flush. - AJAX Endpoint: Search for
wp_ajax_mmr_hooks. If an AJAX handler likewp_ajax_mmr_purgeexists withoutcheck_ajax_referer, it can be exploited via a CSRF POST request to/wp-admin/admin-ajax.php.
Alternative POC (POST AJAX):
// To be executed via browser_eval in an admin context
fetch('/wp-admin/admin-ajax.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'action=mmr_purge_cache' // (inferred action name)
});
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.