ACF Extended (ACFE) `prepare_form()` Unauthenticated RCE via Privilege Escalation (CVE-2025-13486)
by Sélim Lanouar (whattheslime); CVE discovered by Marcin Dudek (dudekmar) · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-13486
- Category
- web
- Affected product
- Advanced Custom Fields: Extended (ACFE) — WordPress plugin
- Affected versions
- 0.9.0.5 through 0.9.1.1
- Disclosed
- 2026-07-06
- Patch status
- unpatched
Tags
References
- https://github.com/whattheslime/CVE-2025-13486-exploit
- https://www.wordfence.com/blog/2025/12/100000-wordpress-sites-affected-by-remote-code-execution-vulnerability-in-advanced-custom-fields-extended-wordpress-plugin/
- https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/acf-extended/advanced-custom-fields-extended-0905-0911-unauthenticated-remote-code-execution-in-prepare-form
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07-06 |
| Author / Researcher | Sélim Lanouar (whattheslime); CVE discovered by Marcin Dudek (dudekmar) |
| CVE / Advisory | CVE-2025-13486 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (per NVD) |
| Status | Weaponized |
| Tags | wordpress, acf-extended, acfe, call_user_func_array, unauthenticated-rce, privilege-escalation, admin-account-creation, python, cwe-94 |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Advanced Custom Fields: Extended (ACFE) — WordPress plugin |
| Versions Affected | 0.9.0.5 through 0.9.1.1 |
| Language / Platform | Python 3 (httpx) exploit targeting a PHP/WordPress plugin |
| Authentication Required | No |
| Network Access Required | Yes (target must expose a page containing an ACFE-generated form) |
Summary
The ACF Extended (ACFE) plugin’s front-end form-rendering AJAX handler (wp_ajax_nopriv_acfe/form/render_form_ajax) resolves user-controlled form configuration through prepare_form(), which ultimately passes attacker-supplied data into call_user_func_array() without adequate validation. Because the AJAX action is registered as nopriv (reachable while unauthenticated) and ACFE ships a built-in wp_insert_user form renderer, an attacker can invoke that renderer directly with form[render]=wp_insert_user and forged parameters to create a new WordPress account with the administrator role, then immediately authenticate as that account via the same handler’s wp_signon renderer. The PoC first fingerprints the ACFE version from a static asset URL, then (with --exploit) creates the rogue admin and logs in, dumping a valid wordpress_logged_in_* cookie.
Vulnerability Details
Root Cause
The vulnerability chain, per the repository’s root-cause analysis:
includes/modules/form/module-form-front.php:24— the AJAX actionwp_ajax_nopriv_acfe/form/render_form_ajaxtriggersrender_form_ajax, reachable without authentication.includes/modules/form/module-form-front.php:492— theacfe/form/prepare_formfilter invokesprepare_form().includes/modules/form/module-form-front-render.php:151— user-controlled$formdata (including which internal “render” function to invoke and its arguments) is passed directly tocall_user_func_array()with no allow-list, letting an attacker select ACFE’s built-inwp_insert_userandwp_signonrenderers and supply their own field values (username, password, role).
Attack Vector
- Fetch a page containing an ACFE-generated form and extract the ACFE version (from
acfe-input.min.css?ver=) and the AJAX nonce embedded in the page ("ajaxurl":"...","nonce":"..."). - POST to
/wp-admin/admin-ajax.phpwithaction=acfe/form/render_form_ajax, the harvestednonce, andform[render]=wp_insert_userplusform[user_login],form[user_pass],form[role]=administrator— creating a new administrator account with attacker-chosen credentials. - POST again to the same endpoint with
form[render]=wp_signonand the same credentials to authenticate; the responseSet-Cookieheader contains a valid WordPress admin session cookie. - Use the cookie to fully control the WordPress site (plugin/theme editing, further RCE, etc.).
Impact
Unauthenticated remote code execution (via arbitrary administrator account creation and login), leading to complete WordPress site takeover.
Environment / Lab Setup
Target: WordPress site with ACFE plugin version 0.9.0.5-0.9.1.1, with at least one
page/post embedding an ACFE-generated front-end form (nopriv AJAX handler
must be reachable)
Attacker: python3 -m venv venv && venv/bin/pip install -r requirements.txt
(httpx, socksio, packaging)
Proof of Concept
PoC Script
See
CVE-2025-13486.pyin this folder.
| |
Detection & Indicators of Compromise
POST /wp-admin/admin-ajax.php HTTP/1.1
...
action=acfe%2Fform%2Frender_form_ajax&nonce=...&form%5Brender%5D=wp_insert_user&form%5Buser_login%5D=...&form%5Brole%5D=administrator
Signs of compromise:
- Newly created WordPress users with
administratorrole that do not correlate with any/wp-admin/user-new.phpactivity admin-ajax.phprequests withaction=acfe/form/render_form_ajaxandform[render]=wp_insert_userorwp_signonfrom unauthenticated/anonymous sessions- Unexpected admin logins immediately following an unauthenticated AJAX POST to a page containing an ACFE form
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade Advanced Custom Fields: Extended to a version beyond 0.9.1.1 that restricts which internal functions prepare_form()/render_form_ajax may invoke via call_user_func_array() |
| Interim mitigation | Disable or restrict ACFE front-end forms until patched; block unauthenticated access to admin-ajax.php actions matching acfe/form/render_form_ajax at the WAF layer; audit for unexpected administrator accounts |
References
- Source repository
- Wordfence blog: 100,000+ WordPress sites affected
- Wordfence vulnerability database entry
Notes
Mirrored from https://github.com/whattheslime/CVE-2025-13486-exploit on 2026-07-06. Detailed, CVE-specific root-cause analysis with working exploit code (version fingerprinting, nonce extraction, admin creation, and login all implemented and functional).
| |