¿Qué es XML?

XML (Extensible Markup Language) es un lenguaje de marcas derivado de SGML (Standard Generalized Markup Language), el cual es el mismo estándar en el que está basado HTML. XML es usado típicamente por aplicaciones para guardar y transportar información en un formato que sea legible para los humanos y parseable para las máquinas. Es flexible y ampliamente usado para intercambiar información entre diferentes sistemas y aplicaciones. XML consta de elementos, atributos e información, que son usados para representar información de forma estructurada.


Sintaxis y Estructura de XML

Los elementos XML se representan con etiquetas, que se rodean por los símbolos < y >. Las etiquetas suelen venir en pares, con la apertura precediendo al contenido y la cola al final. Por ejemplo:

xml
<?xml version="1.0" encoding="UTF-8"?>
<user id="1">
   <name>John</name>
   <age>30</age>
   <address>
      <street>123 Main St</street>
      <city>Anytown</city>
   </address>
</user>

El tag <name>John</name> representa un elemento llamado "name" con el contenido "John". Los atributos ofrecen información adicional sobre los elementos y se especifican en el tag de apertura. El tag <user id='1'> especifica un atributo "id" con valor "1" para el elemento "user". La información de caracteres se refiere al contenido como "John".

El ejemplo de arriba muestra un XML con elementos, atributos e información de caracteres. La declaración del tag <?xml version="1.0" encoding="UTF-8"?> indica la versión XML y el elemento contiene varios subelementos y atributos que representan la información del usuario.


Casos de Uso Comunes en Aplicaciones Web

Es ampliamente usado en las aplicaciones web para intercambiar informaciión, almacenamiento y configuración. Se usa comúnmente en servicios web y APIs, como SOAP y REST, para intercambiar información entre sistemas. XML también se usa para los archivos de configuración como la de los servidores web o aplicaciones.


¿Qué es XSLT?

XSLT (Extensible Stylesheet Language Transformations) es un lenguaje usado para transformar y formatear documentos XML. Mientras que XSLT es principalmente usado para transformar información y formateo, también es relevante para los ataques XXE.

XLST puede ser usado para facilitar los ataques XXE de varias maneras:

  1. Extracción de Información: XSLT puede ser usado para extraer información sensible de un documento XML, lo que puede ser usado en un ataque XXE, como por ejemplo credenciales de usuario.
  2. Expansión de Entidad: XSLT puede expandir entidades definidas en un documento XML, incluyendo entidades externas. Esto puede permitir que un atacante inyecte entidades maliciosas llevando a una vulnerabilidad XXE.
  3. Manipulación de Información: XSLT puede manipular la información en un documento XML, potencialmente permitiendo que un atacante pueda inyectar o modificar información existente para explotar una vulnerabilidad XXE.
  4. XXE a Ciegas: XSLT puede ser usado para realizar ataques XXE a ciegas, en los que el atacante inyecta entidades maliciosas sin ver la respuesta del servidor.

¿Qué son los DTDs?

DTDs o Document Type Definitions definen la estructura y restricciones de un documento XML. Especifican los elementos permitidos, atributos y relaciones entre ellos. Los DTDs pueden ser internoes en el documento XML o externos en un archivo separado.

El propósito de usar DTDs es:

  • Validación: Los DTDs validan la estructura de un XML para asegurar que encaja con los criterios especificados antes de procesarlo, lo que es crucial en entornos donde la integridad es clave.
  • Declaración de Entidades: Los DTDs definen entidades que pueden usarse a través del documento CML incluyendo las entidades externas que son clave en ataques XXE.

Los DTDs internos se especifican usando la declaración <!DOCTYPE, mientras que los DTDs externos se referencian usando la palabra clave "SYSTEM".

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config [
<!ELEMENT config (database)>
<!ELEMENT database (username, password)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
]>
<config>
<!-- configuration data -->
</config>

El ejemplo muestra un DTD interno definiendo la estructura de un archivo de configuración. Las declaraciones <!ELEMENT especifican los elementos permitids y sus relaciones.


DTDs y XXE

Los DTDs juegan un rol crucial en la inyección XXE, ya que pueden usarse para declarar entidades externas. Las entidades externas pueden referenciar los archivos externos o URLs, las cuales pueden llevar a información maliciosa o inyección de código.


Entidades XML

Las entidades XML son placeholders de información o código que puede ser expandido en un documento XML. Hay 5 tipos de entidades: Internas, externas, paramétricas, generales y de caracteres.

Ejemplo de entidad externa:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY external SYSTEM "http://example.com/test.dtd">
<config>
&external;
</config>

Esto muestra una entidad externa referenciando una URL. La referencia &external; en el documento XML será expandida a los contenidos de la URL referenciada.


Tipos de Entidades

  1. Las entidades internas son esencialemente variables usadas en un documento SML para definir y sustituir contenido que puede haber sido repetido múltiples veces. Se definen en los DTDs y pueden simplificar el manejo de información repetitiva. Por ejemplo:
xml
<!DOCTYPE note [
<!ENTITY inf "This is a test.">
]>
<note>
        <info>&inf;</info>
</note>

En este ejemplo la entidad &inf; es reemplazada por su valor allá donde aparezca en el documento.

  1. Las entidades externas son similares a las internas, pero sus contenidos están referenciados desde fuera del documento XML como desde un archivo o URL separada. Esta funcionalidad puede ser explotada en ataques XXE (XML External Entity) si el procesador está configurado para resolver entidades externas. Por ejemplo:
xml
<!DOCTYPE note [
<!ENTITY ext SYSTEM "http://example.com/external.dtd">
]>
<note>
        <info>&ext;</info>
</note>

Aquí, &ext; coge contenido de la URL especificada, lo que podría ser un riesgo de seguridad si la URL estuviese controlada por el atacante.

  1. Las entidades paramétricas son un tipo de entidad especial usado en los DTDs para definir estructuras reutilizables o incluir subconjunts DTD externos. Son particularmente útil oara modular los DTDs y para mantener aplicaciones XML a gran escala. Por ejemplo:
xml
<!DOCTYPE note [
<!ENTITY % common "CDATA">
<!ELEMENT name (%common;)>
]>
<note>
        <name>John Doe</name>
</note>

En este caso %common; se usa en el DTD para definir el tipo de dinformación que el elemento name debería contener.

  1. Las entidades generales son similares a las variables y pueden ser declaradas internamente o externamente. Son usadas para definir sustituciones que pueden usarde en el cuerpo del documento XML. Al contrario que las entidades paramétricas, las generales se usan en el contenido del documento. Por ejemplo:
xml
<!DOCTYPE note [
<!ENTITY author "John Doe">
]>
<note>
        <writer>&author;</writer>
</note>

La entidad &author; es una entidad general usada para sustituir el nombre del autor donde se referencia en el documento.

  1. Las entidades de caracteres se usan para representar caracteres especiales o reversos que no pueden ser usados directamente en documentos XML. Estas entidades previenen que el parser malinterprete la sintaxis. Por ejemplo:

    • &lt; para menor que <.
    • &gt; para mayor que >.
    • &amp; para el ampersand &.
xml
<note>
        <text>Use &lt; to represent a less-than symbol.</text>
</note>

Este uso asegura que los caracteres especiales se procesen por el parser XML sin romper la estructura del documento.

La imagen de abajo muestra los tipos de entidades en una estructura DOM:

Exploring XML