Skip to content
KitploitKITPLOIT
工具博客
Log in
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-76904 — 用于盘点 GeoServer WFS 端点并验证 PostGIS/GeoTools 中基于时间的 SQL 注入漏洞的 Python 脚本,附带专用于授权测试的 PoC 模式。 | Kitploit
工具/GitHubGitHub/bickzero93/cve-2026-76904
漏洞分析漏洞利用Web应用程序漏洞利用信息收集渗透测试
GitHubbickzero93/cve-2026-76904

CVE-2026-76904

用于盘点 GeoServer WFS 端点并验证 PostGIS/GeoTools 中基于时间的 SQL 注入漏洞的 Python 脚本,附带专用于授权测试的 PoC 模式。

查看仓库
1191个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

GeoServer WFS 清单与授权验证

本仓库包含两个用于调查 GeoServer WFS 端点的 Python 脚本。

概述

wfs_inventory.py

用途: 对图层、XSD 字段和 WFS 值进行清单整理,并可选地通过基于时间的检测对候选对象进行验证。

执行示例:

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

geoserver_sqli_working.py

用途: 清单功能的组合入口点,以及独立的 PoC 模式。

执行示例:

python3 geoserver_sqli_working.py --target https://HOST --valid-fields 4 --sleep 1 --confirm-sleep 5
python3 geoserver_sqli_working.py --target https://HOST/geoserver/wfs --typename namespace:layer --field_name FIELD --sleep 5
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 端点的网络连接

可选地使其可执行:

chmod +x wfs_inventory.py geoserver_sqli_working.py

快速开始

通过常规 WFS 查询查找候选对象

python3 wfs_inventory.py \
  --url https://HOST \
  --valid-fields 4

默认路径 /geoserver/wfs 会自动补充。因此以下地址是等效的:

https://HOST
https://HOST/geoserver
https://HOST/geoserver/wfs

如果安装路径不同,则必须指定完整的 WFS 路径。

使用基于时间的检测验证候选对象

仅适用于明确授权的系统:

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

在检测期间,每个候选对象都会在 stderr 上显示一次测量结果:

[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

通过初步筛选并不代表确认存在漏洞。只有当第二次更长时间的测量也通过时,才会输出参数块。

将诊断信息写入文件

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

--valid-diagnose FILE 会自动启用详细诊断并将其写入指定文件。

自动模式流程

默认模式 auto 按以下顺序处理 WFS 信息:

  1. GetCapabilities 被打开一次:

    /geoserver/wfs?service=WFS&acceptVersions=2.0.0&request=GetCapabilities
    
  2. XML 响应被流式读取。一旦找到 FeatureType/Name,下一个 typeName 即确定。

  3. 立即对该图层执行 DescribeFeatureType,使用 version=2.0.0。

  4. 脚本提取 XSD 元素,并选择名称类似 ID 或数字的字符串/JSON 字段。

  5. 根据调用方式检查候选对象:

    • 无 --sleep:样本值必须是语法有效的 JSON。
    • 使用 --sleep N:测量一个控制请求和一个基于时间的检测请求。此时跳过 JSON 值检查。
  6. 结果立即输出并刷新。

  7. 之后才从正在进行的 GetCapabilities 响应中读取下一个 typeName。

这样,无需在处理完整个大型 GetCapabilities 响应之前就能显示第一个结果。

字段候选标准

无 --sleep 时,自动模式默认考虑名称类似 ID 或数字的字符串/JSON 字段。

使用 --sleep 时,--candidate-scope auto 则使用所有简单的非几何字段。XSD 类型和 ID 名称模式不再阻止时间检测。这可以防止数值型、日期/布尔型或厂商特定 XSD 类型出现漏报。

识别的名称模式包括:

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% 的请求 Sleep 时间,则候选对象被视为阳性。--timing-result-type auto 首先检查 resultType=hits,如果结果为阴性,则随后检查 resultType=results。

初步阳性的测量结果必须使用更长的 Sleep 时间进行确认。如果没有显式的 --confirm-sleep,脚本使用 max(3, --sleep * 3),上限为 10 秒。这样,在 --sleep 1 时,单次延迟峰值不会导致 vulnerable=true。

紧凑输出

标准输出为每个有效图层包含一个块:

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 以及
  • 可复制的参数字符串。

示例:

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

其他清单模式

列出所有图层

python3 wfs_inventory.py \
  --url https://HOST \
  --mode layers

限制到某个命名空间:

python3 wfs_inventory.py \
  --url https://HOST \
  --mode layers \
  --namespace fink

显示图层的 XSD 字段

python3 wfs_inventory.py \
  --url https://HOST \
  --mode fields \
  --layer namespace:layer

每个字段以 JSON 对象形式输出,包含名称、XSD 类型、nillable、id_candidate 和 usable_property。

导出所选字段的值

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

导出所有属性:

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–将自动模式限制为某个要素类型;fields 和 values 模式必填
--namespace PREFIX–仅考虑此命名空间前缀的图层
--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所需 Sleep 时间的比例;范围 0.5 到 1.0
--confirm-sleep SECONDS0/自动确认 Sleep;0 使用至少 3 倍于首次 Sleep 时间,范围 1 到 10
--start-layer-index N0跳过前 N 个流式图层
--max-layers N0最多处理 N 个图层;0 表示无限制
--valid-fields N0在 N 个有效图层块后停止;0 表示无限制
--valid N别名--valid-fields 的向后兼容别名
--max-features N0在 values 模式下 N 个要素后停止;0 表示无限制
--format jsonl|csv|textjsonlvalues 模式的输出格式
--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

组合入口点

geoserver_sqli_working.py 可以直接调用清单功能。一旦指定了 --valid-fields,则仅执行清单并在之后退出程序。

通过组合脚本进行清单

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

内部会将以下参数传递给 wfs_inventory.py:

--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 模式

仅适用于明确授权的测试系统:

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

在 PoC 模式下,目标路径不会自动规范化。此处应指定完整的 WFS 端点。

下载工具