GeoServer SQL 注入漏洞分析(CVE-2023-25157)
Last Update:
Word Count:
Read Time:
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
在/geoserver/CVE-2023-25157目录,用下面的命令下载并启动:
sudo docker-compose up -d
看到端口,这里是8080。
在浏览器上访问http://your-ip:8080/geoserver
进入环境,说明配置成功了,接下来就可以开始愉快的漏洞复现了:
此时复现的系统版本为2.22.1
以下是采用官方给的文档搭建的环境
在这里使用 GeoServer 2.21.3,下载完成后解压:
1 |
|
进入到 geoserver-2.21.3-bin/bin
目录下,执行启动程序
1 |
|
使用 Docker 搭建 PostgreSQL
1 |
|
进入容器
安装 postgis
拓展
1 |
|
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 |
|
至此环境搭建结束。
六.漏洞分析
这里采用vulnhub环境进行复现
为了正确利用这些漏洞,首先需要获得:
- 可用的功能名称
- 每个可用功能的可用属性
分别。因此,以下请求发送到目标服务器以获取可用的功能名称。
1 |
|
获取可用功能名称后,我们需要发送以下 HTTP 请求来获取相关可用功能的可用属性。
1 |
|
枚举所有可用的功能名称以及与这些功能名称关联的属性名称。在此阶段之后,可以通过将 SQL 有效负载注入的恶意 HTTP 请求发送到服务器以获取任何获取的属性来执行利用过程。
1 |
|
1利用前提
首先,在利用此漏洞之前,必须找到包含 PostGIS 数据存储的现有工作空间。Vulhub的GeoServer实例已经有一个PostGIS数据存储:
工作区名称 | vulhub |
---|---|
数据存储名称 | pg |
要素类型(表)名称 | example |
要素类型的属性之一 | name |
1 |
|
构造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
成功注入获取版本信息。
使用wireshark抓包结果如下
脚本演示
七.漏洞修复
目前 GeoServer 和 Geotools 官方均已发布修复版本,查看 GeoServer 官方提交的补丁,在 src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/ConfigDatabase.java
中添加了模块org.geoserver.jdbcloader.JDBCLoaderProperties
模块用于配置文件 jdbcconfig/jdbcconfig.properties
中的 JDBCConfig 模块属性字段并更改了构造函数以包含此属性字段。
还修改了
src/community/jdbcconfig/src/main/java/org/geoserver/jdbcconfig/internal/OracleDialect.java
中的插入语法
而在 GeoTools 提交的补丁,修改
modules/library/jdbc/src/main/java/org/geotools/data/jdbc/FilterToSQL.java
添加了EscapeSql
模块和 escapeBackslash
字段对 SQL 注入进行防御
八.漏洞总结
总之,正如 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博客