﻿# V5335\. OWASP\. Potential XXE vulnerability\. Insecure XML parser is used to process potentially tainted data\.

Анализатор обнаружил использование небезопасно сконфигурированного XML\-парсера, который обрабатывает данные, полученные из внешнего источника\. Это может сделать приложение уязвимым к XXE\-атаке\. Подробнее суть данной атаки описана здесь\. 

Уязвимости такого типа относятся к следующим категориям рисков OWASP Top 10:

* [A4:2017 — XML External Entities \(XXE\)](https://owasp.org/www-project-top-ten/2017/A4_2017-XML_External_Entities_(XXE).html)
* [A05:2021 — Security Misconfiguration](https://owasp.org/Top10/A05_2021-Security_Misconfiguration/)

Рассмотрим простой пример\. Есть приложение, которое принимает запросы в виде XML\-файлов и обрабатывает товары с соответствующим идентификатором\. Если идентификатор задан неверно, приложение сообщает об этом\.

Формат XML\-файла, с которым работает приложение:

```cpp
<?xml version="1.0" encoding="utf-8" ?>
<shop>
  <itemID>62</itemID>
</shop>
```

Допустим, обработкой занимается следующий код:

```cpp
public static void processItemWithID(String pathToXmlFile) {
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder builder = factory.newDocumentBuilder();
  var document = builder.parse(pathToXmlFile);    // <= 
  var nodeList = document.getElementsByTagName("itemID");
  String itemiD = nodeList.item(0).getTextContent();
  try {
    long itemIDvalue = Long.parseLong(itemiD);
    // process the item with 'itemIDvalue' value
    System.out.printf("An item with the %d ID was processed.%n", itemIDvalue);
  } catch (NumberFormatException e) {
    System.out.printf("%s is not valid 'itemID' value.%n", itemiD);
  }
}
```

Для приведённого выше XML\-файла приложение распечатает следующую строку:

```cpp
An item with the '62' ID was processed.
```

Если вместо номера в ID будет записано что\-то другое \(например, строка "Hello world"\), приложение сообщит об ошибке:

```cpp
"Hello world" is not valid 'itemID' value.
```

Несмотря на то, что код решает поставленную задачу, он уязвим к XXE\-атакам за счёт соблюдения всех перечисленных ранее факторов:

* содержимое XML поступает от пользователя;
* XML\-парсер сконфигурирован таким образом, чтобы обрабатывать внешние сущности;
* вывод может передаваться обратно пользователю\.

Ниже представлен XML\-файл, через который можно скомпрометировать данный код:

```cpp
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file://D:/MySecrets.txt">
]>
<shop>
  <itemID>&xxe;</itemID>
</shop>
```

В этом файле объявляется внешняя сущность `xxe`, которая будет обработана парсером\. Вследствие этого содержимое файла `D:/MySecrets.txt` \(например, такое: `This is an XXE attack target.`\), находящегося на машине, где запущено приложение, будет выдано пользователю:

```cpp
This is an XXE attack target. is not valid 'itemID' value.
```

Для того, чтобы обезопаситься от подобной атаки, можно запретить обработку внешних сущностей, а также запретить или игнорировать обработку DTD\. В примере, описанном выше, можно запретить обработку внешних сущностей, указав следующие строки перед созданием экземпляра `DocumentBuilder`:

```cpp
String feature = "http://xml.org/sax/features/external-general-entities"; 
factory.setFeature(feature, false);
```

Полностью запретить обработку DTD можно следующим образом: 

```cpp
String feature = "http://apache.org/xml/features/disallow-doctype-decl"; 
factory.setFeature(feature, true);
```

Обратите внимание, что существуют самые разнообразные парсеры, предназначенные для обработки XML\-документов, которые могут быть уязвимы для XXE или нет, в зависимости от их настроек и версий\. Для некоторых базовых типов способы защиты от XXE описаны [здесь](https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html#java)\.