0x01 GeoServer & GeoTools
Ссылки
GeoServer — это программный сервер с открытым исходным кодом, написанный на Java, который позволяет пользователям обмениваться геопространственными данными и редактировать их. GeoServer разработан на основе Spring и использует библиотеку GeoTools.
GeoTools — это Java-библиотека с открытым исходным кодом, которая предоставляет пространственные инструменты для географических данных. Многие основные функции GeoServer реализованы с использованием GeoTools, например преобразование чтения и записи данных.
Описание уязвимости 0x02
Ссылки
GeoServer и GeoTools выпустили CVE-2023-25157 (https://github.com/geoserver/geoserver/security/advisories/GHSA-7g5f-wrx8-5ccf) и CVE-2023-25158 (https://github.com/geotools/geotools/security/advisories/GHSA-99c3-qc2q-p94m), запрос OGC имеет уязвимость внедрения SQL. GeoServer поддерживает язык выражений фильтров OGC и общий язык запросов OGC (CQL), в первую очередь влияя на протоколы службы веб-объектов (WFS), службы веб-карт (WMS) и службы веб-покрытия (WCS) для наложений ImageMosaic, известных как:
Для GeoTools существует уязвимость внедрения SQL при использовании реализации JDBCDataStore для выполнения фильтров OGC:
0x03 затронутая версия
Ссылки
GeoServer <2.21.4,<2.22.2
GeoTools <28.2、<27.4、<26.7、<25.7、<24.7
Официальный патч выпущен, пожалуйста, обновляйте его вовремя.
0x04 Настройка среды
Ссылки
Используйте GeoServer 2.21.3 (https://geoserver.org/release/2.21.3) здесь, разархивируйте его после загрузки:
unzip geoserver-2.21.3-bin.zip
войти в geoserver-2.21.3-bin/bin
каталог, выполните программу запуска
sh startup.sh
После успешного запуска просто посетите http[:]//x.x.x.x:8080/geoserver/web/.
Сборка PostgreSQL с помощью Docker
docker run -e POSTGRES_PASSWORD=password -d -p 5433:5432 postgres:latest
Войдите в контейнер и установите postgis
расширять
apt search postgis
apt install postgis postgresql-14-postgis-3-scripts
postgresql-14-postgis-3-scripts
По вашему мнению PostgreSQL для установки, на этот раз использовал PostgreSQL для PostgreSQL 14.1
Данные на данный момент можно найти в официальной документации: https://docs.geoserver.org/latest/en/user/gettingstarted/postgis-quickstart/index.html.
редактировать startup.sh
Добавьте параметры удаленной отладки в сценарий запуска:
exec "${_RUNJAVA}" ${JAVA_OPTS:--DNoJavaOpts -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005} "${MARLIN_ENABLER:--DMarlinDisabled}" "${RENDERER:--DDefaultrenderer}" "-Djetty.base=${GEOSERVER_HOME}" "-DGEOSERVER_DATA_DIR=${GEOSERVER_DATA_DIR}" -Djava.awt.headless=true -DSTOP.PORT=8079 -DSTOP.KEY=geoserver -jar "${GEOSERVER_HOME}/start.jar"
На этом построение окружения завершено.
0x05 Анализ уязвимостей
Ссылки
Поскольку точек инъекции несколько, здесь мы используем strStartsWith
для анализа кейсов, импорт проекта Воля ИДЕЯ, открыть DEBUG Отладка, найдите точку останова ogr.geotools.jdbc
вниз getReaderInternal
функция
перед запросом this.getDataStore().getConnection(this.getState());
Выполню select now()
Определите, можно ли нормально подключить базу данных.
Продолжайте следить за selectSQL
середина
существовать selectSQL
функциясередина selectColumns
Поля серединаиз базы данных будут пройдены и склеены SQL заявление
Функция, связанная со сращиванием, заключается в следующем:
После завершения сращивания SQL заявлениеследующее:
SELECT "gid","bin",encode(ST_AsEWKB("the_geom"), 'base64') as "the_geom" FROM "public"."nyc_buildings" WHERE
Далее идет пара filter
обработка
существовать filter
середина Воляве типа из CQL_FILTER
преобразован в SQL назадзаявлениеназад Соединен с WHERE
позже
Поэтому окончательное сращивание SQL заявлениеследующее:
SELECT "gid","bin",encode(ST_AsEWKB("the_geom"), 'base64') as "the_geom" FROM "public"."nyc_buildings" WHERE ("bin"::text LIKE 'x') = true and 1=(SELECT CAST ((SELECT version()) AS INTEGER)) -- %') = true
существовать JDBCFeatureReader
середина Зависит от executeQuery
осуществлять SQL заявление
Подводить итоги:org.geotools.jdbc
вниз getReaderInternal()
Функция обрабатывает вводимые пользователем запросы, а также дальнейшие вызовы. selectSQL
Создайте соответствующую базу данных SQL Запросить заявление и создать базу данных. После запроса заявления будет оценено, существует ли оно. CQL_FILTER
Условия запроса, если они сохранены, начинают обработку ввода пользователя из CQL_FILTER
условие, причина encodeToString(Filter filter)
Воля CQL_FILTER
Конвертировать для SQL заявление,再Зависит от FilterToSQL filter
Соединен с WHETE
позже, наконец JDBCFeatureReader
из this.runQuery
осуществлятьс инъекциейиз SQL заявление, завершите инъекцию.
Наконец, весь стек вызовов выглядит следующим образом:
<init>:153, JDBCFeatureReader (org.geotools.jdbc)
getReaderInternal:607, JDBCFeatureSource (org.geotools.jdbc)
getReaderInternal:218, JDBCFeatureStore (org.geotools.jdbc)
getReader:636, ContentFeatureSource (org.geotools.data.store)
features:173, ContentFeatureCollection (org.geotools.data.store)
features:52, ContentFeatureCollection (org.geotools.data.store)
features:40, SecuredFeatureCollection (org.geoserver.security.decorators)
features:75, SecuredSimpleFeatureCollection (org.geoserver.security.decorators)
features:93, DecoratingSimpleFeatureCollection (org.geotools.feature.collection)
encode:572, FeatureTransformer$FeatureTranslator (org.geotools.gml.producer)
parse:1054, TransformerBase$XMLReaderSupport (org.geotools.xml.transform)
transform:485, TransformerIdentityImpl (org.apache.xalan.transformer)
run:287, TransformerBase$Task (org.geotools.xml.transform)
transform:121, TransformerBase (org.geotools.xml.transform)
transform:103, TransformerBase (org.geotools.xml.transform)
encode:247, GML2OutputFormat (org.geoserver.wfs.xml)
write:261, GML2OutputFormat (org.geoserver.wfs.xml)
write:199, WFSGetFeatureOutputFormat (org.geoserver.wfs)
response:1018, Dispatcher (org.geoserver.ows)
handleRequestInternal:272, Dispatcher (org.geoserver.ows)
исправление 0x06
Ссылки
в настоящий момент GeoServer и Geotools Официалы выпустили ремонтные версии, проверьте GeoServer Официальная подача патча (https://github.com/geoserver/geoserver/commit/145a8af798590288d270b240235e89c8f0b62e1d), существует. src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java
середина Модуль добавленorg.geoserver.jdbcloader.JDBCLoaderProperties
Модули для файлов конфигурации jdbcconfig/jdbcconfig.properties
серединаиз JDBCConfig поле атрибута модуля и изменил конструкцию Function, включив в него это поле атрибута.
Также изменено src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/OracleDialect.java
серединаизвставьте грамматику
исуществовать GeoTools Отправить патч (https://github.com/geotools/geotools/commit/64fb4c47f43ca818c2fe96a94651bff1b3b3ed2b)середина, изменить modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java
добавленEscapeSql
модуль и escapeBackslash
пара полей SQL Инъекция для защиты
0x07 References
Ссылки