H1RD SECURITY

Empezando con XML External Entity (XXE 2)

Como vimos en el primer articulo de la serie sobre XXE, la vulnerabilidad de XML External Entity o XXE (como se la conoce) se basa en un sistema deficiente al parsear los XMLs que recibe la aplicación web, en este post veremos como ejecutar un ataque para explotar esta vulnerabilidad.

Ejemplo de un ataque usando la vulnerabilidad Xml External Entity (XXE)
Ejemplo de un ataque usando la vulnerabilidad Xml External Entity (XXE)

Atacando un XML External Entity (XXE)

Para nuestras pruebas de como explotar un XXE usaremos WebGoat 8.0 en su sección de XXE y para interceptar y modificar las peticiones usaremos BurpSuite. Puedes descargarte el CTF WebGoat en su pagina de github

Usando el CTF WebGoat 8.0 para explotar el XXE
Usando el CTF WebGoat 8.0 para explotar la vulnerabilidad Xml External Entity (XXE)

Primero haremos una petición legitima para ver que formato tendría:

Haciendo una petición correcta para ver el formato
Haciendo una petición correcta para ver el formato

Como podemos ver el texto que hemos introducido se incluye en el cuerpo de la petición dentro del tag <text> y del tag <comment>

Si modificamos la petición usando el repeater de Burp y creando una GENERAL EXTERNAL entity (sin olvidarnos de usar los tags validos) que referencia a la raíz del sistema de archivos como nos pide WebGoat obtenemos:

XXE ejecutado con éxito
XXE ejecutado con éxito

En una maquina que tuviera un XXE y no estuviera especialmente preparada para ello como WebGoat podríamos leer cualquier archivo con los permisos del usuario que ejecuta el parser (normalmente los del servidor web) por ejemplo /etc/passwd. En el caso de WebGoat solo podemos leer la raíz del sistema de ficheros "file:///".

Por ejemplo, el payload para extraer el fichero /etc/password seria asi:

1
2
3
4
5
6
         <?xml version="1.0"?>
            <!DOCTYPE data [
             <!ELEMENT data (#ANY)>
                <!ENTITY file SYSTEM "file:///etc/passwd">
                        ]>
                <data>&file;</data>

También podríamos usarlo en sistemas windows:

1
2
3
4
        <?xml version="1.0" encoding="ISO-8859-1"?>
        <!DOCTYPE foo [  
        <!ELEMENT foo ANY >
        <!ENTITY xxe SYSTEM "file:///c:/boot.ini" >]><foo>&xxe;</foo>

Puedes encontrar más payloads aquí

Hasta aquí, este post, seguiré avanzando más sobre XXE en el proximo de la serie.

En este post ha colaborado un amigo pentester llamado Rafa Marti.