Introducción

Las Entidades Externas XML (XXE) son una vulnerabilidad de seguridad que ocurre cuando una aplicación procesa entradas XML de manera insegura. Esta vulnerabilidad puede permitir a un atacante interferir con el procesamiento de datos XML, lo que puede llevar a la divulgación de datos confidenciales, la ejecución remota de código, la denegación de servicio (DoS) y otros ataques.

Conceptos Clave

¿Qué es una Entidad Externa XML?

Una entidad externa XML es una referencia dentro de un documento XML que apunta a un recurso externo. Las entidades externas pueden ser utilizadas para incluir contenido de otros archivos o recursos en el documento XML.

Ejemplo de Entidad Externa XML

<!DOCTYPE foo [
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<foo>&xxe;</foo>

En este ejemplo, la entidad xxe se define para cargar el contenido del archivo /etc/passwd. Si una aplicación procesa este XML sin las debidas precauciones, podría exponer el contenido del archivo del sistema.

Riesgos Asociados con XXE

  1. Divulgación de Información: Un atacante puede acceder a archivos sensibles del sistema.
  2. Denegación de Servicio (DoS): La inclusión de entidades externas puede llevar a la sobrecarga del sistema.
  3. Ejecución Remota de Código: En algunos casos, un atacante puede ejecutar comandos en el servidor.
  4. Escaneo de Puertos Internos: Utilizando entidades externas, un atacante puede escanear la red interna.

Ejemplo Práctico

Código Vulnerable

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.StringReader;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.InputSource;

public class XXEVulnerable {
    public static void main(String[] args) throws Exception {
        String xml = "<!DOCTYPE foo [ <!ENTITY xxe SYSTEM \"file:///etc/passwd\" >]><foo>&xxe;</foo>";
        
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader(xml)));
        
        System.out.println(doc.getDocumentElement().getTextContent());
    }
}

Explicación del Código

  1. Entrada XML: El XML contiene una entidad externa que apunta al archivo /etc/passwd.
  2. Procesamiento del XML: El código utiliza DocumentBuilderFactory y DocumentBuilder para parsear el XML.
  3. Vulnerabilidad: El código no deshabilita las entidades externas, lo que permite que el contenido del archivo sea incluido en el documento XML procesado.

Mitigación de XXE

Deshabilitar Entidades Externas

La forma más efectiva de prevenir XXE es deshabilitar el procesamiento de entidades externas en los parsers XML.

Ejemplo en Java

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder db = dbf.newDocumentBuilder();

Validación de Entradas

Asegúrate de validar y sanitizar todas las entradas XML antes de procesarlas.

Uso de Parsers Seguros

Utiliza parsers XML que tengan configuraciones seguras por defecto y que sean mantenidos activamente.

Ejercicio Práctico

Ejercicio 1: Identificación de Vulnerabilidades XXE

Instrucciones:

  1. Revisa el siguiente código y determina si es vulnerable a XXE.
  2. Si es vulnerable, modifica el código para mitigar la vulnerabilidad.
import xml.etree.ElementTree as ET

def parse_xml(xml_data):
    tree = ET.ElementTree(ET.fromstring(xml_data))
    root = tree.getroot()
    return root

xml_data = """<?xml version="1.0"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>"""

root = parse_xml(xml_data)
print(root.text)

Solución:

import xml.etree.ElementTree as ET

def parse_xml(xml_data):
    parser = ET.XMLParser(resolve_entities=False)
    tree = ET.ElementTree(ET.fromstring(xml_data, parser=parser))
    root = tree.getroot()
    return root

xml_data = """<?xml version="1.0"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<foo>&xxe;</foo>"""

root = parse_xml(xml_data)
print(root.text)

Explicación de la Solución

  1. Deshabilitar Entidades Externas: Utilizamos ET.XMLParser(resolve_entities=False) para deshabilitar la resolución de entidades externas.
  2. Procesamiento Seguro: El XML se procesa de manera segura sin incluir el contenido de entidades externas.

Conclusión

Las Entidades Externas XML (XXE) representan una seria amenaza para la seguridad de las aplicaciones web que procesan datos XML. Es crucial entender cómo funcionan estas vulnerabilidades y cómo mitigarlas de manera efectiva. Deshabilitar el procesamiento de entidades externas y validar las entradas son pasos esenciales para proteger tus aplicaciones contra ataques XXE.

Curso de OWASP: Directrices y Estándares para la Seguridad en Aplicaciones Web

Módulo 1: Introducción a OWASP

Módulo 2: Principales Proyectos de OWASP

Módulo 3: OWASP Top Ten

Módulo 4: OWASP ASVS (Application Security Verification Standard)

Módulo 5: OWASP SAMM (Software Assurance Maturity Model)

Módulo 6: OWASP ZAP (Zed Attack Proxy)

Módulo 7: Buenas Prácticas y Recomendaciones

Módulo 8: Ejercicios Prácticos y Casos de Estudio

Módulo 9: Evaluación y Certificación

© Copyright 2024. Todos los derechos reservados