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
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
- Divulgación de Información: Un atacante puede acceder a archivos sensibles del sistema.
- Denegación de Servicio (DoS): La inclusión de entidades externas puede llevar a la sobrecarga del sistema.
- Ejecución Remota de Código: En algunos casos, un atacante puede ejecutar comandos en el servidor.
- 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
- Entrada XML: El XML contiene una entidad externa que apunta al archivo
/etc/passwd
. - Procesamiento del XML: El código utiliza
DocumentBuilderFactory
yDocumentBuilder
para parsear el XML. - 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:
- Revisa el siguiente código y determina si es vulnerable a XXE.
- 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
- Deshabilitar Entidades Externas: Utilizamos
ET.XMLParser(resolve_entities=False)
para deshabilitar la resolución de entidades externas. - 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
- OWASP Top Ten
- OWASP ASVS (Application Security Verification Standard)
- OWASP SAMM (Software Assurance Maturity Model)
- OWASP ZAP (Zed Attack Proxy)
Módulo 3: OWASP Top Ten
- A1: Inyección
- A2: Pérdida de Autenticación
- A3: Exposición de Datos Sensibles
- A4: Entidades Externas XML (XXE)
- A5: Control de Acceso Roto
- A6: Configuración Incorrecta de Seguridad
- A7: Cross-Site Scripting (XSS)
- A8: Deserialización Insegura
- A9: Uso de Componentes con Vulnerabilidades Conocidas
- A10: Registro y Monitoreo Insuficientes
Módulo 4: OWASP ASVS (Application Security Verification Standard)
- Introducción a ASVS
- Niveles de Verificación
- Requisitos de Seguridad
- Implementación de ASVS en Proyectos
Módulo 5: OWASP SAMM (Software Assurance Maturity Model)
Módulo 6: OWASP ZAP (Zed Attack Proxy)
- Introducción a ZAP
- Instalación y Configuración
- Escaneo de Vulnerabilidades
- Automatización de Pruebas de Seguridad
Módulo 7: Buenas Prácticas y Recomendaciones
- Ciclo de Vida de Desarrollo Seguro (SDLC)
- Integración de Seguridad en DevOps
- Capacitación y Concienciación en Seguridad
- Herramientas y Recursos Adicionales
Módulo 8: Ejercicios Prácticos y Casos de Estudio
- Ejercicio 1: Identificación de Vulnerabilidades
- Ejercicio 2: Implementación de Controles de Seguridad
- Caso de Estudio 1: Análisis de un Incidente de Seguridad
- Caso de Estudio 2: Mejora de la Seguridad en una Aplicación Web