SSTI в Spring Boot 3.3.4: уязвимость, приводящая к RCE

Добро пожаловать на наш форум!

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


Gibby

Автор
Команда проекта

Регистрация
Сообщений
1,635
Репутация
45
Сделок
Безопасность Thymeleaf оказалась слабее, чем ожидалось.

0.jpg
Исследователь безопасности продемонстрировал эксплуатацию уязвимости SSTI (Server-Side Template Injection) в Spring Boot 3.3.4 при использовании шаблонизатора Thymeleaf. В ходе тестирования удалось добиться удалённого выполнения кода (RCE), несмотря на встроенные механизмы защиты.

Во время пентеста специалисты обнаружили, что заголовок Referer используется в шаблоне Thymeleaf без надлежащего экранирования. Анализ показал, что шаблон применяет механизм двойной интерпретации выражений, что позволяет внедрять произвольный Java-код.

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

Локальное тестирование подтвердило возможность выполнения кода. Инъекция выражения ${7*7} вывела 49, подтверждая наличие SSTI. Однако попытка выполнить команду через SSTI-запрос:

Код:
${T(java.lang.Runtime).getRuntime().exec('calc')}

привела к ошибке TemplateProcessingException. Исследователи выяснили, что Thymeleaf запрещает доступ к статическим классам и методам в шаблонах.

Для обхода ограничений использовалась рефлексия. Несмотря на блокировку многих потенциально опасных классов, в приложении была загружена библиотека Apache Commons Lang3, содержащая класс MethodUtils, который позволял выполнять приватные методы.

Этот класс позволил обойти защиту и вызвать метод Runtime.getRuntime(), что привело к выполнению команд:

Код:
"".class.forName("org.apache.commons.lang3.reflect.MethodUtils")
      .invokeMethod(
          "".class.forName("java.lang.Runtime")
              .getMethod("getRuntime")
              .invoke(null),
          "exec",
          "whoami"
      )

Команда whoami выполнилась успешно, подтвердив возможность удалённого выполнения кода.

Из-за запрета на исходящие соединения исследователь использовал файловый ввод-вывод для передачи данных. Запрос заголовка Referer позволял записывать результат в файл, а затем извлекать его через HTTP-ответ:

Код:
bash -c {echo,d2hvYW1p}|{base64,-d}|{bash,-i}>abc

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