
Spring-Cloud-Spel-RCE
Clonando el código de entorno ya escrito en Github.
//⚠️ Nota: la ruta de descarga del código de entorno no debe contener caracteres chinos ni espacios
git clone https://github.com/Ha0Liu/CVE-2022-22947.git

Abra el paquete de código que acabamos de descargar con IDEA: Open ---> ruta del archivo descargado ---> Open.
Creando un proyecto manualmente y configurando el entorno.
(1) Cree un nuevo proyecto, configure y haga clic en "Next" hasta que termine.

(2) Analice la estructura de directorios del proyecto:
1. La carpeta .idea contiene los archivos de configuración predeterminados de IntelliJ IDEA, sin otro propósito; puede eliminarla o conservarla según sus necesidades.
2. La carpeta src es la zona de código del proyecto, que incluye dos carpetas: java y resources. java es el área para escribir código Java, resources es el área de configuración del proyecto. El proyecto Spring agrega por defecto el método SpringApplication en java, que es el método de inicio predeterminado de Spring. En resources se agrega por defecto application.properties, el archivo de configuración del proyecto Spring.
3. La carpeta test es para pruebas; puede probar métodos en ella.
4. pom.xml es el archivo de configuración de Maven, que incluye dependencias, configuraciones, etc. necesarias para el proyecto.
5. .iml es la configuración de los paquetes de dependencia de Maven, también agregada por defecto.
6. La carpeta External Libraries contiene todos los paquetes de dependencia del proyecto.
(3) Agregue las dependencias de Maven al archivo pom.xml (repositorio de Maven contiene todos los detalles de las dependencias).
1. El archivo pom generará por defecto parte del código XML, como se muestra a continuación:

2. Importe las dependencias necesarias para el proyecto. Dado que este proyecto es un proyecto Spring Boot, se necesita importar la dependencia spring-boot-starter como iniciador del servidor. En segundo lugar, dado que esta vulnerabilidad es una vulnerabilidad de la puerta de enlace Gateway en Spring Cloud, las versiones afectadas son anteriores a 3.1.1, por lo que esta vez usamos la versión 3.1.0 para reproducir la vulnerabilidad. Además, necesitamos monitorear y acceder a la puerta de enlace a través de la interfaz actuator, por lo que también necesitamos esta dependencia. El contenido específico es el siguiente:

(4) Modifique el archivo de configuración de Spring (ruta: src → main → resources → application.properties), los detalles son los siguientes:
1. server.port es el puerto de inicio del servidor Spring, por defecto 8080; puede configurarlo según su situación.
2. management.endpoint.gateway.enabled=true habilita la detección del puerto actuator para la puerta de enlace Spring Cloud Gateway, por defecto false. Dado que esta vulnerabilidad requiere monitorear el estado de la puerta de enlace, debemos cambiarlo manualmente a true para habilitar la monitorización.
3. management.endpoints.web.exposure.include=gateway selecciona la puerta de enlace del servidor como Gateway, porque esta vulnerabilidad es de la puerta de enlace Gateway, así que declaramos en el archivo de configuración que la puerta de enlace elegida es Gateway.

(5) Modifique la clase Java generada automáticamente después de crear el nuevo proyecto (el nombre de la clase generalmente es nombre del proyecto + Application, ruta: src → main → java → com.xxx.xxx → xxxApplication). Vea la siguiente figura para más detalles:

(6) Inicie el proyecto, como se muestra en la siguiente figura:

(7) Acceda a http://localhost:9000, si la página se muestra igual que la captura de pantalla, la configuración del entorno es exitosa.

(1) Primero, veamos el parche oficial de reparación, el diff está en: https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e. En la función org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue, los oficiales reemplazaron StandardEvaluationContext con GatewayEvaluationContext para ejecutar expresiones SPEL.

De la imagen anterior se puede ver que este parche modifica principalmente el método de análisis de expresiones SPEL. La línea 66 muestra una declaración if, que indica que la expresión SPEL debe comenzar con "#{" y terminar con "}". La función getValue es para analizar expresiones SPEL. Se puede ver que esta vulnerabilidad es una RCE desencadenada por expresión SPEL.
(2) Haciendo clic en el campo getValue con Ctrl + clic izquierdo, se puede rastrear hacia arriba para encontrar la enumeración org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType.

Del método default mencionado anteriormente, se puede ver que se llama al método DEFAULT de la enumeración. Los detalles del método son los siguientes:
default ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}

(3) Rastreando hacia arriba para encontrar org.springframework.cloud.gateway.support.ConfigurationService.class#normalizeProperties().

Este normalizeProperties() analiza las propiedades del filtro, pasa las propiedades de configuración del filtro a normalize y finalmente entra en getValue para ejecutar la expresión SPEL, causando inyección de expresión SPEL.
(1) Según la documentación [https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html](https://cloud.spring.io/spring-cloud-gateway/multi/multi actuator_api.html), los usuarios pueden crear y eliminar rutas en la puerta de enlace a través de actuator. La siguiente imagen muestra la estructura básica de la puerta de enlace.