Código java de prueba vulnerabilidad XXE

Este código es una muestra muy sencilla para probar si tu aplicación/infraestructura es vulnerable a un ataque XXE, con unas determinadas líneas, y también para poder modificar el código para impedir el ataque. XXE viene de XML External Entity, esta es una funcionalidad avanzada del lenguaje de marcado XML que puede utilizarse para permitir la integración de datos externos en el documento XML y otras funcionalidades más complejas. La realidad es que no suele emplearse en la practica habitual, es muy posible que si estas trabajando como desarrollador, tu proyecto no requiera usar XXE en absoluto.

Sin embargo y por desgracia, la mayoría de las librerías y frameworks incumplen la norma de seguridad de «seguridad por defecto», es decir, en lugar de tener esta funcionalidad raramente usada deshabilitada, y esperar a que el desarrollador la habilite de forma expresa si la requiere. Viene habilitada por defecto, es decir, por defecto es insegura. Esto puede modificarse a nivel global modificando la librería que vayas a instanciar, sobrescribiéndola.

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;

public class PruebaXXE {

  public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {

    //En la siguiente variable metemos el PDF, introduce el payload aquí 
    String archivoXml = "<?xml version=\"1.0\"?>" +
      "<!DOCTYPE foo [" +
      "<!ELEMENT foo ANY>" +
      "<!ENTITY xxe SYSTEM \"file:///etc/passwd\" >]>" +
      "<foo>&xxe;</foo>";

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    /* Remediación probada concretamente en jre1.7.0_79, la primera línea no deja definir el DOCTYPE, pero si requieres hacerlo basta con reritar esta primera línea (la protección sigue siendo efectiva)
		
		factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
        factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
        factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
        factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
		*/

    factory.setExpandEntityReferences(false);
    factory.setNamespaceAware(false);

    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new InputSource(new StringReader(archivoXml)));
    document.setXmlVersion("1.0");

    Source srcXml = new DOMSource(document);
  }

}

Reglas de SonarQube relacionadas https://rules.sonarsource.com/java/RSPEC-2755 – XML parsers should not be vulnerable to XXE attacks.

Cómo corregir las vulnerabilidades ‘Disable XML external entity (XXE) processing’ – ‘Deshabilitar el procesamiento de entidad externa XML (XXE)’ en java.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

error: