Inyección de entidades externas XML (XXE)
La inyección de entidades externas XML es una vulnerabilidad por la que una aplicación interpreta XML suministrado por el atacante con un analizador que resuelve entidades externas. La declaración que va dentro del documento le dice al analizador que traiga un fichero local o una URL, y el analizador obedece, convirtiendo la subida de un documento en la revelación de un fichero o en una petición hecha por el servidor.
El mecanismo está en la declaración de tipo de documento. Una entidad definida con la palabra clave SYSTEM nombra un recurso, el analizador lo resuelve mientras construye el documento, y el contenido resuelto se coloca allí donde se referencie la entidad. Si la aplicación refleja después alguna parte del documento interpretado, el fichero vuelve en la respuesta. Si no refleja nada, la misma primitiva sigue funcionando fuera de banda: una entidad de parámetro que carga una declaración externa desde una máquina que controla el atacante convierte la propia resolución en el canal.
Hay dos consecuencias que importan más que la lectura de ficheros. El analizador irá a buscar URLs, lo que hace de esto una vía limpia hacia el server side request forgery desde dentro de la red. Y las definiciones recursivas de entidades agotan la memoria, que es una denegación de servicio con un fichero pequeño.
Donde lo seguimos encontrando no es en las API JSON modernas, sino a su alrededor: servicios SOAP mantenidos vivos por un socio, conversores de documentos, endpoints de SAML, y formatos de fichero que por debajo son XML, como las hojas de cálculo y las imágenes vectoriales. El arreglo es desactivar en el analizador las declaraciones de tipo de documento y la resolución de entidades externas, en vez de filtrar cargas, y forma parte de las pruebas de API donde los endpoints XML heredados reciben este tratamiento.