
OGC Filter SQL 인젝션(CVE-2023-25157/25158)을 재현하는 로컬 GeoServer/PostGIS 랩으로, 취약, 패치, 완화된 A/B 테스트 모드를 제공합니다.
이 Lab은 GeoServer/PostGIS를 사용하여 로컬 환경에서 OGC Filter SQL injection을 연구하며, operator/setup mode와 attacker mode를 명확히 분리합니다.
GeoServer 2.22.0은 취약한 GeoTools를 내장. GeoServer 2.22.2는 패치된 GeoTools를 내장. Lab은 동일한 schema/request를 유지하여 version, mitigation 및 privilege boundary를 A/B 테스트합니다.
| Mode | Surface | 목적 |
|---|---|---|
| Setup/operator REST | cve-operator internal container | REST setup, validation 및 backend log review |
| Single gateway | 127.0.0.1:8889 | UI operator 및 OWS route를 위한 단일 포트 |
| Operator Web UI | 127.0.0.1:8889/geoserver/web/ | 운영자를 위한 GeoServer UI; Basic Auth proxy 포함 |
| Attacker vulnerable | 127.0.0.1:8889/vuln/geoserver/ows | WFS/OWS 취약, DB 오류가 response에 노출 |
| 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 취약하지만 gateway가 error detail 제거 |
| 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는 host로 port를 publish하지 않음. GeoServer는 port 8080을 host로 직접 publish하지 않음; host는 127.0.0.1:8889에서 cve-gateway만 볼 수 있음. cve-attacker container는 attacker-net에만 위치; PostgreSQL 또는 GeoServer internal service로의 route가 없음. REST setup은 geoserver-net의 내부 container cve-operator를 통해 진행.
브라우저에서 열기:
http://127.0.0.1:8889/geoserver/web/
2단계 로그인:
operator / operator_labadmin / geoserver모두 동일한 gateway 8889를 통해 진행되며, 여러 port를 기억할 필요 없음. Burp는 기본 proxy 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
관리 명령:
.\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 테이블:
cities: integer primary key, name text 컬럼, strStartsWith/strEndsWith에 사용.sensors_text: text primary key, FeatureId injection에 사용.sensors_int: integer primary key, FeatureId에 대한 negative control.events: JSONB research layer.internal_assets: publish되지 않음, 매 reset 후 LAB-CANARY-<UUID> 포함.local_points: shapefile non-JDBC negative control.Role:
geoserver_readonly: CONNECT, USAGE schema, publish된 테이블에만 SELECT.geoserver_impact: internal_assets에 추가 SELECT를 허용하여 과도한 권한을 가진 app DB user를 시연.geoserver_worstcase: 별도 profile, pg_read_server_files를 보유하여 가짜 canary 파일 /lab/flag.txt를 읽음.attack-chain.ps1 수행:
GetCapabilities recon.DescribeFeatureType schema enum.encode functions=false로 CVE-2023-25157 확인.preparedStatements=true로 CVE-2023-25158 확인.internal_assets를 차단하고, impact branch가 canary를 leak하며, patched/realistic이 canary를 disclose하지 않음을 증명.Evidence는 evidence/attack-chain-*에 저장됨. 현재 folder는 혼란을 피하기 위해 최신 pass evidence만 유지.
이 profile은 주요 시나리오에 포함되지 않음:
.\lab.ps1 start worstcase
powershell -ExecutionPolicy Bypass -File .\worstcase-demo.ps1
가짜 canary 파일 /lab/flag.txt만 읽으며, /etc/passwd를 읽지 않고, hash를 dump하지 않으며, password를 crack하지 않음.