Сущности (entities) XML

В этом разделе мы объясним некоторые ключевые особенности XML, которые важны для понимания уязвимостей XXE.

Что такое XML?

XML расшифровывается как «extensible markup language» (расширяемый язык разметки). XML — это язык, предназначенный для хранения и передачи данных. Подобно HTML, XML использует древовидную структуру из тегов и данных. В отличие от HTML, XML не использует предопределённые теги, поэтому тегам можно давать имена, описывающие данные. На ранних этапах истории веба XML был популярен как формат передачи данных («X» в «AJAX» означает «XML»). Однако его популярность снизилась в пользу формата JSON.

Что такое сущности XML?

Сущности XML (XML entities) — это способ представления элемента данных внутри XML-документа вместо использования самих данных. В спецификации языка XML предусмотрены различные встроенные сущности. Например, сущности &lt; и &gt; представляют символы < и >. Это метасимволы, используемые для обозначения тегов XML, и поэтому их обычно необходимо представлять с помощью соответствующих сущностей, когда они встречаются внутри данных.

Что такое document type definition?

Определение типа документа XML (DTD, Document Type Definition) содержит объявления, которые могут задавать структуру XML-документа, типы значений данных, которые он может содержать, и другие элементы. DTD объявляется в необязательном элементе DOCTYPE в начале XML-документа. DTD может быть полностью самодостаточным внутри самого документа (так называемый «внутренний DTD»), может загружаться из внешнего источника (так называемый «внешний DTD»), либо быть гибридом этих двух вариантов.

Что такое пользовательские сущности XML?

XML позволяет определять пользовательские сущности внутри DTD. Например:

<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>

Это определение означает, что любое использование ссылки на сущность &myentity; внутри XML-документа будет заменено заданным значением: «my entity value».

Что такое внешние сущности XML?

Внешние сущности XML (XML external entities) — это тип пользовательских сущностей, определение которых находится за пределами DTD, в котором они объявлены.

Объявление внешней сущности использует ключевое слово SYSTEM и должно указывать URL, из которого следует загрузить значение сущности. Например:

URL может использовать протокол file://, поэтому внешние сущности можно загружать из файла. Например:

Внешние сущности XML являются основным механизмом, посредством которого возникают атаки внедрения внешних сущностей XML (XXE).

Last updated