
Laboratorio locale GeoServer/PostGIS che riproduce l'iniezione SQL di OGC Filter (CVE-2023-25157/25158) con modalità di test A/B vulnerabili, corrette e mitigate.
Questo lab utilizza GeoServer/PostGIS per studiare l'iniezione SQL tramite OGC Filter in un ambiente locale, con una chiara separazione tra modalità operator/setup e modalità attacker.
GeoServer 2.22.0 incorpora GeoTools vulnerabile. GeoServer 2.22.2 incorpora GeoTools con patch. Il lab mantiene lo stesso schema/richiesta per il test A/B di versione, mitigazione e confine dei privilegi.
| Modalità | Superficie | Scopo |
|---|
| Setup/operator REST | container interno cve-operator | Setup REST, validazione e revisione dei log del backend |
| Gateway singolo | 127.0.0.1:8889 | Una singola porta per la UI operator e le route OWS |
| Operator Web UI | 127.0.0.1:8889/geoserver/web/ | UI GeoServer per l'operatore; con proxy Basic Auth |
| Attacker vulnerable | 127.0.0.1:8889/vuln/geoserver/ows | WFS/OWS vulnerabile, errori DB visibili nella risposta |
| Attacker patched | 127.0.0.1:8889/patched/geoserver/ows | GeoServer 2.22.2 / GeoTools 28.2 |
| Attacker realistic | 127.0.0.1:8889/realistic/geoserver/ows | WFS/OWS vulnerabile ma il gateway rimuove i dettagli degli errori |
| 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 non espone porte all'host. GeoServer non espone direttamente la porta 8080 all'host; l'host vede solo cve-gateway su 127.0.0.1:8889. Il container cve-attacker è solo su attacker-net; non ha route verso PostgreSQL o il servizio interno di GeoServer. Il setup REST passa attraverso il container interno cve-operator su geoserver-net.
Apri nel browser:
http://127.0.0.1:8889/geoserver/web/
Accesso a 2 livelli:
operator / operator_labadmin / geoserverTutto passa attraverso lo stesso gateway 8889, senza dover ricordare più porte. Burp può mantenere il proxy predefinito 127.0.0.1:8080.
.\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
Comandi di gestione:
.\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
Tabelle seed:
cities: chiave primaria integer, colonna name di tipo text, utilizzata per strStartsWith/strEndsWith.sensors_text: chiave primaria text, utilizzata per l'iniezione FeatureId.sensors_int: chiave primaria integer, controllo negativo per FeatureId.events: livello di ricerca JSONB.internal_assets: non pubblicata, contiene LAB-CANARY-<UUID> nuovo dopo ogni reset.local_points: shapefile non-JDBC come controllo negativo.Ruoli:
geoserver_readonly: CONNECT, USAGE sullo schema, SELECT solo sulle tabelle pubblicate.geoserver_impact: SELECT aggiuntivo su internal_assets per illustrare l'utente DB dell'app con privilegi ampi.geoserver_worstcase: profilo separato, con pg_read_server_files per leggere il file canary fittizio /lab/flag.txt.attack-chain.ps1 esegue:
GetCapabilities.DescribeFeatureType.encode functions=false.preparedStatements=true.internal_assets, il ramo impact perde il canary, patched/realistic non divulgano il canary.Le evidenze vengono salvate in evidence/attack-chain-*. La cartella attuale conserva solo l'evidenza dell'ultimo pass per evitare confusione.
Questo profilo non fa parte dello scenario principale:
.\lab.ps1 start worstcase
powershell -ExecutionPolicy Bypass -File .\worstcase-demo.ps1
Legge solo il file canary fittizio /lab/flag.txt, non legge /etc/passwd, non esegue dump di hash, non esegue cracking di password.