
Spring-Cloud-Spel-RCE
Клонировать уже написанный код среды из GitHub.
//⚠️Важно: путь загрузки кода среды не должен содержать китайские символы или пробелы
git clone https://github.com/Ha0Liu/CVE-2022-22947.git

Откройте скачанный пакет кода с помощью IDEA: Open ---> путь к скачанному файлу ---> Open.
Создать проект вручную и настроить среду.
(1) Создайте новый проект, настройте и нажимайте "Далее" до конца;

(2) Проанализируйте структуру каталогов проекта:
.idea содержит файлы конфигурации по умолчанию IntelliJ IDEA, не имеет другого назначения. Можно удалить или оставить по желанию;src – основная область кода проекта, включает папки java и resource. java – область для написания Java-кода, resource – область конфигурации всего проекта. По умолчанию в Spring-проекте в java добавляется метод SpringApplication, который является методом запуска Spring по умолчанию. В resource по умолчанию добавляется файл application.properties – файл конфигурации Spring-проекта;test – для тестирования, в ней можно тестировать методы;pom.xml – файл конфигурации Maven, включает зависимости, конфигурации и т.д., необходимые для проекта;.iml – файл конфигурации зависимостей Maven, также добавляется по умолчанию;External Libraries – все зависимые пакеты этого проекта.
(3) Добавьте зависимости Maven в файл pom.xml (Maven Repository содержит подробную информацию о всех зависимостях).

spring-boot-starter в качестве запускателя сервера. Кроме того, так как данная уязвимость относится к шлюзу SpringCloud Gateway, уязвимые версии – ниже 3.1.1, поэтому мы используем версию 3.1.0 для воспроизведения уязвимости. Также нам нужно мониторить и обращаться к шлюзу через интерфейс actuator, поэтому также нужна эта зависимость. Подробности:
(4) Измените файл конфигурации Spring (путь: src --> main --> resources --> application.properties), подробности:
server.port – порт запуска Spring-сервера, по умолчанию 8080. Можно настроить по своему усмотрению;management.endpoint.gateway.enabled=true – включает мониторинг шлюза SpringCloud-Gateway через endpoint actuator. По умолчанию false, так как для данной уязвимости необходимо мониторить состояние шлюза, поэтому мы вручную меняем его на true, включая мониторинг;management.endpoints.web.exposure.include=gateway – выбирает шлюз Gateway в качестве шлюза сервера. Поскольку уязвимость относится именно к шлюзу Gateway, мы объявляем в конфигурационном файле выбор шлюза Gateway.
(5) Измените автоматически сгенерированный Java-класс после создания нового проекта (имя класса обычно ИмяПроекта+Application, путь: src --> main --> java --> com.xxx.xxx --> xxxApplication), подробности на рисунке:

(6) Запустите проект, подробности на рисунке:

(7) Перейдите по адресу http://localhost:9000. Если страница отображается так же, как на скриншоте, значит среда настроена успешно.

(1) Сначала посмотрим на официальный патч исправления, diff: https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e. Официально в функции org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue заменили StandardEvaluationContext на GatewayEvaluationContext для выполнения SPEL-выражений.

Из рисунка видно, что патч в основном изменяет метод разбора SPEL-выражений. Из строки 66 видно условие if, которое проверяет, что SPEL-выражение должно начинаться с #{ и заканчиваться }. Функция getValue отвечает за разбор SPEL-выражений, и можно сделать вывод, что эта уязвимость — RCE через SPEL-выражения.
(2) Нажмите Ctrl + левая кнопка мыши на поле getValue, чтобы отследить вверх до перечисления org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType.

Из метода default в предыдущем тексте видно, что вызывается метод DEFAULT перечисления. Подробности метода:
default ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}

(3) Отследите вверх до org.springframework.cloud.gateway.support.ConfigurationService.class#normalizeProperties().

Этот метод normalizeProperties() разбирает свойства фильтров: передает конфигурационные свойства фильтра в normalize, и в итоге попадает в getValue, выполняя SPEL-выражение, что приводит к инъекции SPEL.
(1) Согласно документации [https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html](https://cloud.spring.io/spring-cloud-gateway/multi/multi actuator_api.html), пользователи могут создавать и удалять маршруты в шлюзе через actuator. Ниже показана базовая структура шлюза.

(2) В IDEA с помощью функции mapping actuator можно найти интерфейсы для создания и удаления маршрутов.

(3) Перейдите к классу RouteDefinition, который объявляет структуру маршрута.

(4) Перейдите к классу FilterDefinition и обнаружьте, что у фильтра есть два параметра: name и args.
