Эксплуатация уязвимостей инъекции серверных шаблонов

В этом разделе мы подробнее рассмотрим типичные уязвимости инъекции серверных шаблонов и покажем, как их можно эксплуатировать с использованием нашей высокоуровневой методологии. Применив этот процесс на практике, вы потенциально сможете обнаружить и эксплуатировать различные уязвимости инъекции серверных шаблонов.

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

Чтение

Если вы не знаете движок шаблонов вдоль и поперёк, начинать обычно стоит с изучения его документации. Хотя это может быть не самый захватывающий способ провести время, не стоит недооценивать, насколько полезным источником информации может быть документация.

Изучение базового синтаксиса шаблонов

Важно выучить базовый синтаксис, а также ключевые функции и работу с переменными. Даже что-то простое, как умение встраивать нативные блоки кода в шаблон, порой быстро приводит к эксплойту. Например, как только вы узнали, что используется Python-ориентированный движок шаблонов Mako, добиться удалённого выполнения кода может быть так же просто, как:

<%
	import os
	x=os.popen('id').read()
%>
${x}

В несандбоксированной среде добиться удалённого выполнения кода и использовать его для чтения, изменения или удаления произвольных файлов столь же просто во многих распространённых движках шаблонов.

Изучение последствий для безопасности

Помимо основ создания и использования шаблонов, в документации может быть раздел «Security». Название может отличаться, но обычно в нём перечисляются все потенциально опасные вещи, которых следует избегать при работе с шаблоном. Это бесценный ресурс, своего рода шпаргалка по поведению, которое стоит искать во время аудита, а также по способам его эксплуатации.

Даже если отдельного раздела «Security» нет, если конкретный встроенный объект или функция могут представлять риск для безопасности, в документации почти всегда есть какое-то предупреждение. Предупреждение может быть без подробностей, но как минимум оно помечает этот встроенный объект как то, что стоит изучить.

Например, в ERB документация показывает, что можно перечислить все каталоги и затем читать произвольные файлы следующим образом:

Поиск известных эксплойтов

Ещё один ключевой аспект эксплуатации уязвимостей инъекции серверных шаблонов — умение находить дополнительные ресурсы в интернете. Как только вы определили используемый движок шаблонов, стоит поискать в сети уязвимости, которые уже могли быть обнаружены другими. Из-за широкого распространения некоторых крупных движков шаблонов порой можно найти хорошо задокументированные эксплойты, которые вы сможете адаптировать для эксплуатации своего целевого сайта.

Исследование

К этому моменту вы, возможно, уже наткнулись на рабочий эксплойт благодаря документации. Если нет, следующий шаг — исследовать окружение и попытаться обнаружить все объекты, к которым у вас есть доступ.

Многие движки шаблонов предоставляют объект вроде «self» или «environment», который действует как пространство имён, содержащее все объекты, методы и атрибуты, поддерживаемые движком шаблонов. Если такой объект существует, вы потенциально можете использовать его, чтобы сгенерировать список объектов в области видимости. Например, в основанных на Java языках шаблонов иногда можно перечислить все переменные окружения с помощью следующей инъекции:

Это может стать основой для составления шорт-листа потенциально интересных объектов и методов для дальнейшего изучения. Дополнительно, пользователи Burp Suite Professional могут использовать встроенный словарь Intruder для брутфорса имён переменных.

Объекты, предоставленные разработчиком

Важно помнить, что веб-сайты содержат как встроенные объекты, предоставляемые движком шаблонов, так и кастомные, специфичные для сайта объекты, добавленные разработчиком. Особое внимание следует уделять именно нестандартным объектам, поскольку они особенно вероятно содержат чувствительную информацию или эксплуатируемые методы. Поскольку такие объекты могут различаться между шаблонами даже внутри одного сайта, учитывайте, что вам может понадобиться изучать поведение объекта в контексте каждого отдельного шаблона, прежде чем вы найдёте способ его эксплуатации.

Хотя инъекция серверных шаблонов потенциально может привести к удалённому выполнению кода и полному захвату сервера, на практике это удаётся не всегда. Однако то, что вы исключили удалённое выполнение кода, ещё не означает, что отсутствует возможность другой атаки. Вы всё ещё можете использовать уязвимости инъекции серверных шаблонов для других высокосерьёзных атак, таких как обход путей (path traversal), чтобы получить доступ к конфиденциальным данным.

Создание кастомной атаки

До сих пор мы в основном рассматривали построение атаки путём повторного использования задокументированного эксплойта или за счёт известных уязвимостей в движке шаблонов. Однако иногда вам придётся строить кастомный эксплойт. Например, вы можете обнаружить, что движок шаблонов выполняет шаблоны внутри песочницы (sandbox), что затрудняет или даже делает невозможной эксплуатацию.

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

Построение кастомного эксплойта с использованием цепочки объектов

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

Изучая документацию по объектам, обращайте особое внимание на то, к каким методам эти объекты предоставляют доступ, а также какие объекты они возвращают. Углубляясь в документацию, вы сможете обнаружить комбинации объектов и методов, которые можно сцепить (chain together). Правильная цепочка объектов и методов иногда позволяет получить доступ к опасной функциональности и чувствительным данным, которые изначально казались недосягаемыми.

Например, в Java-ориентированном движке шаблонов Velocity у вас есть доступ к объекту ClassTool под названием $class. Изучение документации показывает, что можно сцепить метод $class.inspect() и свойство $class.type, чтобы получить ссылки на произвольные объекты. В прошлом это эксплуатировалось для выполнения команд оболочки на целевой системе следующим образом:

Построение кастомного эксплойта с использованием объектов, предоставленных разработчиком

Некоторые движки шаблонов по умолчанию работают в безопасной, жёстко ограниченной среде, чтобы максимально снизить связанные риски. Хотя это осложняет эксплуатацию таких шаблонов для удалённого выполнения кода, созданные разработчиком объекты, выставленные в шаблон, могут предложить дополнительную, меньше закалённую поверхность атаки.

Однако, в то время как для встроенных элементов движка обычно имеется обширная документация, специфичные для сайта объекты почти наверняка не документированы вовсе. Поэтому, чтобы понять, как их эксплуатировать, вам придётся вручную исследовать поведение веб-сайта, чтобы определить поверхность атаки и соответственно сконструировать собственный кастомный эксплойт.

Last updated