
Lokales GeoServer/PostGIS-Lab zur Reproduktion der OGC-Filter-SQL-Injection (CVE-2023-25157/25158) mit A/B-Testmodi für verwundbare, gepatchte und mitigierte Konfigurationen.
Dieses Lab verwendet GeoServer/PostGIS, um OGC Filter SQL Injection in einer lokalen Umgebung zu untersuchen, mit klarer Trennung zwischen Operator-/Setup-Modus und Angreifer-Modus.
GeoServer 2.22.0 bettet verwundbares GeoTools ein. GeoServer 2.22.2 bettet gepatchtes GeoTools ein. Das Lab behält dasselbe Schema/dieselbe Anfrage für A/B-Tests von Version, Mitigation und Privilegien-Grenze bei.
| Modus | Oberfläche | Zweck |
|---|
| Setup/Operator REST | cve-operator interner Container | REST-Setup, Validierung und Backend-Log-Überprüfung |
| Single Gateway | 127.0.0.1:8889 | Ein einziger Port für Operator-UI und alle OWS-Routen |
| Operator Web UI | 127.0.0.1:8889/geoserver/web/ | GeoServer-UI für Betreiber; mit Basic Auth Proxy |
| Angreifer verwundbar | 127.0.0.1:8889/vuln/geoserver/ows | WFS/OWS verwundbar, DB-Fehler erscheint in der Antwort |
| Angreifer gepatcht | 127.0.0.1:8889/patched/geoserver/ows | GeoServer 2.22.2 / GeoTools 28.2 |
| Angreifer realistisch | 127.0.0.1:8889/realistic/geoserver/ows | WFS/OWS verwundbar, aber Gateway entfernt Fehlerdetails |
| Mitigation function | 127.0.0.1:8889/mit-functions/geoserver/ows | GeoServer 2.22.0, encode functions=false |
| Mitigation FeatureId | 127.0.0.1:8889/mit-featureid/geoserver/ows | GeoServer 2.22.0, preparedStatements=true |
PostgreSQL/PostGIS veröffentlicht keinen Port zum Host. GeoServer veröffentlicht Port 8080 nicht direkt zum Host; der Host sieht nur cve-gateway auf 127.0.0.1:8889. Der Container cve-attacker befindet sich nur in attacker-net; er hat keine Route zu PostgreSQL oder zum internen GeoServer-Dienst. Das REST-Setup läuft über den internen Container cve-operator auf geoserver-net.
Im Browser öffnen:
http://127.0.0.1:8889/geoserver/web/
Anmeldung in 2 Ebenen:
operator / operator_labadmin / geoserverAlles läuft über dasselbe Gateway 8889, es müssen nicht mehrere Ports gemerkt werden. Burp kann den Standard-Proxy 127.0.0.1:8080 beibehalten.
.\lab.ps1 reset all
.\lab.ps1 validate
powershell -ExecutionPolicy Bypass -File .\verify-lab.ps1
powershell -ExecutionPolicy Bypass -File .\negative-controls.ps1
powershell -ExecutionPolicy Bypass -File .\attack-chain.ps1
Verwaltungsbefehle:
.\lab.ps1 start vulnerable
.\lab.ps1 start patched
.\lab.ps1 start mitigated
.\lab.ps1 start worstcase
.\lab.ps1 reset all
.\lab.ps1 stop
.\lab.ps1 status
Seed-Tabellen:
cities: integer primary key, Spalte name text, verwendet für strStartsWith/strEndsWith.sensors_text: text primary key, verwendet für FeatureId-Injection.sensors_int: integer primary key, Negativkontrolle für FeatureId.events: JSONB-Forschungsschicht.internal_assets: nicht veröffentlicht, enthält LAB-CANARY-<UUID> neu nach jedem Reset.local_points: Shapefile-Nicht-JDBC-Negativkontrolle.Rollen:
geoserver_readonly: CONNECT, USAGE Schema, SELECT nur auf veröffentlichten Tabellen.geoserver_impact: SELECT zusätzlich auf internal_assets, um zu veranschaulichen, wie ein App-DB-Benutzer durch zu weite Berechtigungen Zugriff erhält.geoserver_worstcase: eigenes Profil, mit pg_read_server_files, um die gefälschte Canary-Datei /lab/flag.txt zu lesen.attack-chain.ps1 führt aus:
GetCapabilities.DescribeFeatureType.encode functions=false.preparedStatements=true.internal_assets blockiert, der Impact-Zweig Canary leakt, gepatcht/realistisch Canary nicht offenlegt.Evidence wird in evidence/attack-chain-* gespeichert. Der aktuelle Ordner behält nur die neuesten bestandenen Evidence-Dateien, um Unübersichtlichkeit zu vermeiden.
Dieses Profil ist nicht Teil des Hauptszenarios:
.\lab.ps1 start worstcase
powershell -ExecutionPolicy Bypass -File .\worstcase-demo.ps1
Es liest nur die gefälschte Canary-Datei /lab/flag.txt, liest nicht /etc/passwd, dumpt keine Hashes, crackt keine Passwörter.