
Локальная лаборатория GeoServer/PostGIS, воспроизводящая SQL-инъекцию через OGC Filter (CVE-2023-25157/25158) с режимами A/B-тестирования: уязвимый, исправленный и с митигацией.
Эта лаборатория использует GeoServer/PostGIS для исследования OGC Filter SQL injection в локальной среде, с чётким разделением режима оператора/настройки и режима атакующего.
GeoServer 2.22.0 включает уязвимый GeoTools. GeoServer 2.22.2 включает исправленный GeoTools. Лаборатория сохраняет одну и ту же схему/запросы для A/B-тестирования версий, митигации и границы привилегий.
| Режим | Поверхность | Назначение |
|---|
| Setup/operator REST | внутренний контейнер cve-operator | REST-настройка, валидация и просмотр логов бэкенда |
| Единый шлюз | 127.0.0.1:8889 | Единый порт для UI оператора и маршрутов OWS |
| Operator Web UI | 127.0.0.1:8889/geoserver/web/ | UI GeoServer для оператора; с прокси Basic Auth |
| Attacker vulnerable | 127.0.0.1:8889/vuln/geoserver/ows | Уязвимый WFS/OWS, ошибки БД видны в ответе |
| 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, но шлюз скрывает детали ошибок |
| 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 не публикует порт на хост. GeoServer не публикует порт 8080 напрямую на хост; хост видит только cve-gateway на 127.0.0.1:8889. Контейнер cve-attacker находится только в attacker-net; у него нет маршрута к PostgreSQL или внутреннему сервису GeoServer. REST-настройка проходит через внутренний контейнер cve-operator в geoserver-net.
Откройте в браузере:
http://127.0.0.1:8889/geoserver/web/
Вход в два уровня:
operator / operator_labadmin / geoserverВсё проходит через единый шлюз 8889, не нужно запоминать множество портов. Burp может сохранять прокси по умолчанию 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, negative control для FeatureId.events: JSONB слой исследования.internal_assets: не публикуется, содержит LAB-CANARY-<UUID> новый после каждого сброса.local_points: shapefile non-JDBC negative control.Роли:
geoserver_readonly: CONNECT, USAGE schema, SELECT только на публикуемых таблицах.geoserver_impact: SELECT дополнительно internal_assets для иллюстрации пользователя БД приложения с широкими правами.geoserver_worstcase: отдельный профиль, имеет pg_read_server_files для чтения фальшивого файла-канарейки /lab/flag.txt.attack-chain.ps1 выполняет:
GetCapabilities.DescribeFeatureType.encode functions=false.preparedStatements=true.internal_assets, impact branch утекает канарейку, patched/realistic не раскрывают канарейку.Доказательства сохраняются в evidence/attack-chain-*. Текущая папка сохраняет только последние успешные доказательства, чтобы избежать беспорядка.
Этот профиль не входит в основной сценарий:
.\lab.ps1 start worstcase
powershell -ExecutionPolicy Bypass -File .\worstcase-demo.ps1
Он только читает фальшивый файл-канарейку /lab/flag.txt, не читает /etc/passwd, не дампит хеши, не взламывает пароли.