Explotación de la Vulnerabilidad de Inyección XML External Entity (XXE)

    Una vulnerabilidad XML External Entity (XXE) Injection es una brecha de seguridad que aprovecha el procesamiento de archivos XML para acceder a recursos a los que normalmente no se debería tener acceso. Esto ocurre cuando un atacante introduce datos XML manipulados en una solicitud, logrando exponer información confidencial o acceder a recursos del sistema, como archivos locales o servicios de red.

    Un ataque XXE implica inyectar entidades XML maliciosas en las solicitudes HTTP. Por ejemplo, un atacante podría usar una entidad XML para apuntar a archivos en el servidor y extraer información sensible, como contraseñas o nombres de usuario.

    La debilidad se presenta cuando un servidor web no valida correctamente la entrada XML, permitiendo que un atacante inyecte entidades maliciosas para acceder a archivos del sistema a los que el servidor tiene acceso. Esto facilita la obtención de datos confidenciales.

    A veces, los ataques XXE no revelan información sensible de inmediato. En estos casos, el atacante puede usar técnicas "a ciegas", como enviar peticiones especialmente diseñadas para conectarse a un Document Type Definition (DTD) externo que valida la estructura del XML y puede hacer referencia a recursos del sistema.

    El enfoque "a ciegas" requiere más tiempo y esfuerzo, pero puede ser efectivo si el atacante tiene cierta información sobre los recursos disponibles en el sistema y busca obtener datos específicos sin levantar sospechas.

    Además, un ataque XXE puede ser utilizado como punto de partida para explotar una vulnerabilidad como un Server-Side Request Forgery (SSRF). Esta técnica permite al atacante escanear puertos internos, normalmente protegidos por un firewall, al inyectar una entidad XML que apunta a direcciones IP o puertos internos en la red del servidor.

    Al explotar con éxito un SSRF, el atacante puede enviar solicitudes HTTP a servicios internos y obtener información sensible o incluso tomar el control de estos servicios.

    
    Usaremos el laboratorio de XXELab para el ejercicio:

Ahora debería tener la aplicación Web vulnerable creada con Docker en la siguiente URL:
"http://localhost:5000"

Nos registramos en la pagina capturándolo con Burpsuite:


    Cuando enviamos una solicitud al servidor web vemos que se envía en formato XML, cuando vemos esto podemos intuir una vulnerabilidad de XXE.


    Para comenzar, vamos a declarar una entidad interna con DTD, para declararla vamos a usar el siguiente código:

<!DOCTYPE foo [ <!ENTIDAD prueba[email protected] ” > ] >

Para usar la entidad solo necesita ejecutar el nombre de la entidad con "&" y ";"


    Esta es la inyección XXE más básica, es la inyección de un archivo, en este caso, modificaremos la entidad creada con un wrapper para obtener acceso a un archivo de la máquina victima y finalmente podremos mostrarlo por pantalla gracias al campo de el correo electrónico que, como puede ver, es el que se refleja en la salida. En este caso hemo llamado a la entidad "&Curiosos" (puedes nombrarla como quieras).


El servidor interpreta estas etiquetas como output lo que hayas introducido como input


XXE OOB BLIND

    Este caso es un poco especial, hay momentos en los que no  permitirá crear entidades o usarlas en el XML. A veces no las muestra y entran en juego las XXE OOB (a ciegas), así que montaremos un servidor con Python y las almacenarías en nuestro equipo.
    
   En ese momento, debemos usar un DTD externo, que puede alojar en una máquina que tenga conexión con la víctima.

    Lo primero que hay que hacer es crear un servidor Python con el que podamos recibir los datos y las conexiones, y también sirven para alojar el DTD malicioso que necesitamos para realizar el ataque.  

En el caso de que no pueda declarar la entidad con los "%" podría ponerlas de la siguiente manera:


    Aquí lo que estamos haciendo es una inyección  a ciegas mandándonos el output a nuestro servidor Python

    Como atacante vamos a declara un archivo.dtd indicando lo que queremos que haga:
    La primera línea del DTD va a ser declarar el archivo que queremos leer, para ello usaremos Base64, esto básicamente convertirá el archivo /etc/passwd a base64 para poder transportarlo fácilmente con peticiones web.


*&#x25;es lo mismo % pero en hexadecimal*

    Llamamos a la entidad "eval" y "exfil" para que cargue puesto que es una entidad externa, este archivo lo vamos a llamar "curiosidadesdehackers.dtd"

    Posteriormente nos va enviar en base64 el output del contenido "/etc/passwd" a nuestro servidor:


   
     Y lo recibimos en base 64 en nuestro servidor en Python, solo falta de decodearlo


Más información en:

        • PayloadsAllTheThings
        Hacktricks


No hay comentarios:

Publicar un comentario