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


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



В этом примере происходит поиск корневого элемента persons. Вместо него создается элемент root. Для содержимого person применяется другой стиль, на каждый из элементов он создает новый элемент name, в атрибут которого переносится атрибута персоны, а в значении остается только имя.
Это может показаться сложным, но, насколько мне известно, вручную правила никто не создает. Для наших же целей необходимо только самое общее понимание и одно правило, которое срабатывает всегда:
Что мы можем сделать с помощью XSLT? Например, получить RCE на хосте, где происходит преобразование. Обрати внимание, что, помимо простого переноса значения, есть возможность производить расчеты. Для этого процессоры позволяют вызывать функции другого языка.
В итоге все тривиально. Вот пример для Xalan — либы XSLT для Java.
Здесь все просто. Подключаем возможность вызова кода на Java и назначаем ей namespace jv (на самом деле — любой префикс). Далее указываем поиск корневого элемента (чтобы работало всегда). И создаем три переменные: в cmd — те команды ОС, которые хотим выполнить (CDATA нужно указывать, чтобы не было ограничений на символы, так как XSL должен быть валидным XML), а в двух других — стандартная последовательность для выполнения команд на Java.
Но если вернуться к нашей прошлой теме про SVG, то становится понятно, откуда в браузерах берутся уязвимости, связанные с этими форматами. К примеру, несколько лет назад в Safari была обнаружена дыра, которая позволяла выполнять произвольный код из SVG со встроенным стилем XSLT.
