
Spring-Cloud-Spel-RCE
Clonando o código do ambiente já escrito no GitHub.
//⚠️注意环境代码下载路径不可含有中文或空格
git clone https://github.com/Ha0Liu/CVE-2022-22947.git

Abra o pacote de código que acabamos de baixar usando o IDEA: Open ---> Caminho do arquivo baixado ---> Open.
Criando o projeto manualmente e configurando o ambiente.
(1) Novo projeto, depois de configurar, siga em frente com "next";

(2) Analise a estrutura de diretórios do projeto:
1. A pasta .idea contém arquivos de configuração padrão do IntelliJ IDEA, sem outras finalidades, pode ser excluída ou mantida conforme necessário;
2. A pasta src é a área principal do código do projeto, incluindo duas pastas: java e resources. java é a área para escrever código Java, resources é a área de configuração de todo o projeto. Por padrão, projetos Spring adicionam o método SpringApplication em java, que é o método de inicialização padrão do Spring. Em resources, o arquivo application.properties é adicionado por padrão, que é o arquivo de configuração do projeto Spring;
3. A pasta test é para testes, onde podem ser testados métodos;
4. pom.xml é o arquivo de configuração do Maven, que inclui dependências, configurações, etc.;
5. O arquivo .iml é a configuração do pacote de dependências do Maven, também adicionado por padrão;
6. A pasta External Libraries contém todos os pacotes de dependência do projeto.
(3) Adicione as dependências Maven ao arquivo pom.xml (repositório Maven contém todos os detalhes das dependências).
1. O arquivo pom gera parte do código XML por padrão, conforme abaixo:

2. Importe as dependências necessárias para o projeto. Como este é um projeto SpringBoot, é necessário importar a dependência spring-boot-starter como inicializador do servidor. Além disso, esta vulnerabilidade é uma vulnerabilidade no gateway SpringCloud Gateway. A versão afetada é inferior a 3.1.1, então usaremos a versão 3.1.0 para reprodução. Também precisamos monitorar e acessar o gateway através da interface actuator, portanto, também precisamos desta dependência. O conteúdo específico é o seguinte:

(4) Modifique o arquivo de configuração do Spring (caminho: src --> main --> resources --> application.properties), conforme abaixo:
1. server.port é a porta de inicialização do servidor Spring, padrão 8080, pode ser configurada conforme necessário;
2. management.endpoint.gateway.enabled=true ativa o monitoramento do gateway SpringCloud-Gateway pelo actuator. O padrão é false, mas como esta vulnerabilidade requer monitoramento do estado do gateway, precisamos alterá-lo manualmente para true;
3. management.endpoints.web.exposure.include=gateway seleciona o gateway do servidor como Gateway, pois a vulnerabilidade é do gateway Gateway.

(5) Modifique a classe Java gerada automaticamente após criar o novo projeto (o nome da classe geralmente é NomeDoProjeto + Application, caminho: src --> main --> java --> com.xxx.xxx --> xxxApplication). Veja a imagem abaixo:

(6) Inicie o projeto, conforme abaixo:

(7) Acesse http://localhost:9000. Se a página exibir a mesma imagem, o ambiente foi configurado com sucesso.

(1) Primeiro, vejamos o patch de correção oficial, diff: https://github.com/spring-cloud/spring-cloud-gateway/commit/337cef276bfd8c59fb421bfe7377a9e19c68fe1e, a equipe oficial substituiu StandardEvaluationContext por GatewayEvaluationContext na função org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue para executar expressões SPEL.

Pela imagem acima, o patch modifica principalmente o método de análise de expressão SPEL. A partir da linha 66, a instrução if mostra que a expressão SPEL precisa começar com "#{" e terminar com "}". A função getValue analisa expressões SPEL, indicando que esta vulnerabilidade é uma vulnerabilidade RCE acionada por expressão SPEL.
(2) Clique com control + botão esquerdo no campo getValue para rastrear até a enumeração org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType.

Pelo método default acima, podemos ver que ele chama o método DEFAULT da enumeração, cujo detalhe é:
default ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}

(3) Rastreie até org.springframework.cloud.gateway.support.ConfigurationService.class#normalizeProperties().

Este normalizeProperties() analisa as propriedades dos filtros, passando as propriedades de configuração do filtro para normalize, que finalmente entra em getValue executando a expressão SPEL, resultando em injeção de expressão SPEL.
(1) De acordo com a documentação [https://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html](https://cloud.spring.io/spring-cloud-gateway/multi/multi actuator_api.html ), os usuários podem criar e excluir rotas no gateway através do actuator. A imagem abaixo mostra a estrutura básica do gateway.

(2) No IDEA, através da função de mapeamento do actuator, é possível encontrar as interfaces de criação e exclusão de rotas.

(3) Rastreie a classe RouteDefinition, que declara a estrutura de conteúdo do gateway.

(4) Rastreie a classe FilterDefinition, que mostra que Filter tem dois parâmetros: "name" e "args".