В плане возможностей для атак XSLT — богатая технология, и с ней стоит разобраться подробнее. Итак, XSLT — это Extensible Stylesheet Language Transformations, специальный язык для преобразования (в общем случае) документов XML. Это развесистый формат, но идея на самом деле проста.
Например, у нас есть XML-документ с какими-то элементами, атрибутами и значениями, но нам для работы требуется переместить элементы, изменить структуру (к примеру, атрибут сделать элементом) или выполнить дополнительные расчеты. Для этого мы можем воспользоваться XSLT-процессором и преобразовать старый документ в новый вид. Создастся новый документ, а старый останется в изначальном виде.
Описание того, как необходимо преобразовывать, находится в XSL-стилях (на картинке это XSLT code). Сами правила описываются в виде XPath.
Хакер #202. Скажи нет большому брату!
Правила указывают, какую часть исходного XML-документа необходимо взять и что с ней потом сделать. При подгрузке файла XML для каждого элемента применяются самые точные из имеющихся правил.
На картинках ты увидишь пример использования XSLT.
В этом примере происходит поиск корневого элемента 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.