XXE-инъекция (внедрение внешних сущностей XML) — уязвимость, при которой XML-парсер обрабатывает заданные атакующим сущности со ссылками на локальные файлы или URL, что ведёт к утечке данных или запросам от имени сервера.
Как работает XXE-инъекция
XML позволяет в определении типа документа (DTD) объявлять сущности — заполнители, которые парсер заменяет содержимым. Внешняя сущность берёт это содержимое по URI. Если парсер принимает DTD из недоверенных данных, атакующий может отправить, например:
<!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><x>&xxe;</x>
Сервер прочитает файл и может вернуть его в ответе. Слабость описана как CWE-611. В зависимости от парсера и настроек XXE может привести к:
- чтению конфигурационных файлов, исходного кода и учётных данных — по аналогии с обходом каталога;
- подделке запросов на стороне сервера к внутренним сервисам и облачным сервисам метаданных;
- «слепой» эксфильтрации данных через внешние DNS- или HTTP-запросы (out-of-band);
- отказу в обслуживании из-за рекурсивного раскрытия сущностей (атака «billion laughs»), а в редких случаях — к выполнению кода.
Почему это важно
XML скрывается во многих местах: веб-сервисах SOAP, сообщениях единого входа SAML, RSS-лентах, изображениях SVG и офисных документах DOCX и XLSX, которые представляют собой ZIP-архивы с XML-файлами. Старые парсеры в Java, .NET и PHP обрабатывали внешние сущности по умолчанию. В OWASP Top 10 2017 года у XXE была собственная категория (A4), сейчас она входит в Security Misconfiguration.
Как предотвратить
- Отключить обработку DTD и разрешение внешних сущностей во всех XML-парсерах.
- Использовать защищённые библиотеки, например defusedxml для Python, и своевременно обновлять парсеры.
- Выбирать более простые форматы вроде JSON там, где XML не обязателен.
- Проверять загружаемые файлы и ограничивать исходящие соединения серверов.





