Whitepaper, описывающий техники Error-Based и Boolean Error-Based Blind для SSTI и инъекций кода, с универсальными пейлоадами для шести языков программирования и интеграцией в SSTImap.
[!NOTE] Это вторая версия технического отчета, основанная на результатах, которые я представил перед выпуском SSTImap версии 1.3.1. Дальнейшие улучшения будут адаптированы для этого формата как версия 1.2 исследования позднее.
Некоторые категории уязвимостей на первый взгляд могут казаться хорошо известными и довольно очевидными. Может показаться, что все возможные техники для этих уязвимостей известны, поэтому могут быть обнаружены только полезные нагрузки для необычных случаев. Серверная инъекция шаблонов (SSTI) и инъекция кода часто считаются такими хорошо известными категориями.
Иногда для этих уязвимостей встречаются новые техники с говорящими названиями. Многие исследователи могут считать такие техники тоже хорошо известными или даже помнить, что использовали их, но в действительности техника может существовать лишь как общепринятое название без исследований, описаний или универсальных полезных нагрузок. Она может упоминаться пару раз вместе с полезными нагрузками для очень специфических случаев, но по ней не будет проводиться тестирование, и реальный потенциал такой техники может оставаться неоткрытым годами.
В этом исследовании представлены две такие техники для инъекции кода и SSTI: Error-Based (основанная на ошибках) и Boolean Error-Based Blind (слепая на основе логических ошибок). Я предоставлю полезные нагрузки для инъекции кода и SSTI на шести языках программирования: Python, PHP, Java, Ruby, NodeJS и Elixir. Кроме того, я предоставлю универсальные детектирующие полезные нагрузки, способные быстро обнаруживать даже слепые инъекции.
Я приведу полную хронологию моего исследования — от обнаружения первых отправных точек до итоговых выводов. Я также изучу процесс создания новых полезных нагрузок для языков программирования и шаблонов, не упомянутых в этом исследовании.
В этом исследовании я покажу примеры практического применения новых техник и поделюсь потенциальными областями для дальнейших исследований. Все предоставленные полезные нагрузки можно использовать для обнаружения и эксплуатации уязвимостей в реальных приложениях. Кроме того, все предоставленные полезные нагрузки были добавлены в инструмент с открытым исходным кодом SSTImap, что упрощает применение результатов этого исследования к реальным целям.
Уязвимости серверной инъекции шаблонов появляются на динамических веб-сайтах, использующих шаблонизаторы для серверного рендеринга, когда недоверенный пользовательский ввод вставляется в шаблон до его обработки шаблонизатором. Злоумышленник может вставить корректный синтаксис шаблона, который будет обработан шаблонизатором во время рендеринга страницы. Многие шаблонизаторы предоставляют ту или иную функциональность выполнения кода, что часто приводит к удаленному выполнению кода (RCE) на целевом сервере. Это исследование сосредоточено на шаблонизаторах, предоставляющих такие возможности в случае эксплуатации.
Уязвимости SSTI известны с 2015 года, и за это время было обнаружено множество полезных нагрузок, обеспечивающих эксфильтрацию информации, обход фильтров и побег из песочницы. Несмотря на это, большинство полезных нагрузок либо выводят результат непосредственно на страницу, либо сосредоточены на самом факте выполнения кода, отбрасывая результаты, выдаваемые этим кодом.

Ещё одна хорошо известная техника SSTI — Time-Based Blind (слепая на основе времени), которая предполагает добавление задержки к выполняемой shell-команде. Эта техника позволяет определить успешность выполнения внедренного кода, но требует подбора полезной нагрузки для выполнения команд ОС, что затрудняет обнаружение слепой SSTI в неизвестном исследователю шаблонизаторе.

Класс уязвимостей SSTI и обе известные техники эксплуатации были обнаружены в 2015 году Джеймсом Кеттлом. Эти техники подробно описаны в его исследовании «Server-Side Template Injection: RCE For The Modern Web App». [^1] За десять лет с тех пор не было задокументировано ни одной новой техники эксплуатации. В 2023 году была обнаружена только одна техника обнаружения, использующая полиглотные полезные нагрузки для одновременного тестирования нескольких шаблонизаторов. Эта техника была обнаружена Максимилианом Хильдебрандом и описана в его исследовании «Improving the Detection and Identification of Template Engines for Large-Scale Template Injection Scanning». [^2] Техника направлена на определение шаблонизаторов с использованием минимального количества запросов, но работает только для простых контекстов инъекций.

Большинство шаблонизаторов, основанных на интерпретируемых языках программирования, таких как PHP, NodeJS и Python, напрямую позволяют вычислять выражения соответствующих языков программирования. Эта возможность позволяет использовать полезные нагрузки для более широкой категории уязвимостей — инъекции кода, — обернув их в правильный формат тега шаблона.
Инъекция кода может возникать и без SSTI, когда недоверенный пользовательский ввод может попасть в eval() или аналогичную опасную функцию.
Часто считается, что эксплуатация инъекции кода — это просто программирование на соответствующем языке,
поэтому техники и полезные нагрузки документируются только для конкретных примеров уязвимостей, требующих адаптации кода под целевое приложение.
Отсутствие более универсальных техник обнаружения инъекций кода и SSTI приводит к неэффективности сканирования «черным ящиком» слепых инъекций кода и шаблонов.