1. 项目概述:为什么我们要深挖GeoServer的漏洞?
如果你在搞地理信息系统(GIS)或者Web地图服务,GeoServer这个名字你一定不陌生。作为OpenGIS Web服务器规范的J2EE实现,它几乎是开源GIS服务领域的“标配”,无数政府、企业和研究机构用它来发布和管理地图数据。但正是这种广泛的应用,让它成为了安全研究者和攻击者眼中的“富矿”。一个默认安装的GeoServer,可能就藏着能让攻击者直接拿到服务器控制权的致命漏洞。今天,我们不谈空泛的理论,就从一个真实的漏洞案例——CVE-2024-36401出发,手把手带你走一遍从功能分析、漏洞定位到POC(概念验证代码)构造的全过程。这个过程,本质上就是一次针对特定软件组件的“外科手术式”安全审计。
对于安全从业者、渗透测试工程师,甚至是负责运维GeoServer的开发者来说,理解这个过程的价值远超“复现一个漏洞”本身。它能帮你建立起一套分析复杂开源系统、寻找安全弱点的通用方法论。你会发现,很多漏洞的根源并非高深莫测的0day,而是源于对功能特性的“创造性”滥用。我们这次要拆解的,就是一个由WFS(Web Feature Service)服务的 GetPropertyValue 操作中的属性名表达式( valueReference )解析缺陷所导致的远程代码执行(RCE)漏洞。通过它,你将看到如何将一个标准的OGC(开放地理空间联盟)服务请求,“扭曲”成一把打开系统大门的钥匙。
2. 漏洞环境搭建与核心功能分析
在动手之前,我们必须先理解“战场”。盲目地扔POC,就像蒙着眼睛打靶,即使打中了也不知道为什么。
2.1 靶场环境快速部署
为了不影响生产环境,也为了方便调试,我们首选在隔离的Docker环境中复现漏洞。这里以漏洞影响版本GeoServer 2.25.1为例。
# 1. 拉取官方镜像(这里我们使用一个包含漏洞版本的定制镜像,通常来自vulhub等靶场项目)
docker pull vulhub/geoserver:2.25.1
# 2. 运行容器,将Web端口8080映射到宿主机
docker run -d -p 8080:8080 --name geoserver-cve vulhub/geoserver:2.25.1
# 3. 等待服务启动,访问 http://localhost:8080/geoserver
访问管理界面(默认账号 admin ,密码 geoserver ),你能看到GeoServer的完整功能面板。但我们的攻击入口并不在这里,而在其提供的OGC标准服务接口上。
注意 :在生产环境进行任何安全测试前,必须获得书面授权。未经授权的测试是违法行为。本文所有操作均在本地或授权靶场进行。
2.2 核心漏洞功能:WFS与GetPropertyValue操作
GeoServer的核心是提供OGC标准服务,包括WMS(地图服务)、WFS(要素服务)、WPS(处理服务)等。本次漏洞的“主角”是WFS服务。
WFS允许客户端对地理空间“要素”(可以理解为地图上的一个对象,比如一个建筑、一条道路)进行增删改查。 GetPropertyValue 是WFS 2.0标准中定义的一个操作,其目的是 从要素中获取指定属性的值 。想象一下,你有一个包含“城市名称”和“人口数量”的要素集合, GetPropertyValue 可以让你只提取出所有城市的“人口数量”列表。
它的标准请求看起来是这样的(XML格式):
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='topp:states'/> <!-- 查询名为states的要素类型 -->
<wfs:valueReference>人口数量</wfs:valueReference> <!-- 指定要获取的属性名 -->
</wfs:GetPropertyValue>
或者更简单的GET请求:
GET /geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=topp:states&valueReference=人口数量
关键点就在于这个 valueReference 参数。在GeoServer的实现中,它不仅仅支持简单的属性名,还 支持表达式 。这是因为地理信息查询有时需要计算,比如“ valueReference=面积/人口 ”来计算人口密度。为了解析这些表达式,GeoServer底层使用了Apache Commons JXPath库。
JXPath是什么? 你可以把它理解为一个用于在Java对象图中进行导航和查询的“XPath”。它功能强大,除了基本的属性访问,还允许调用对象的方法。而这,正是整个漏洞链条的起点:GeoServer在解析 valueReference 时,过于信任用户输入,直接将未经验证或过滤的字符串交给了JXPath去执行。
2.3 漏洞触发的逻辑链条分析
让我们把漏洞触发的路径理清楚:
- 用户输入点 :攻击者控制
valueReference参数的内容。 - 传递与解析 :GeoServer接收到WFS请求后,将
valueReference的值传递给内部的表达式解析引擎。 - 表达式执行 :解析引擎调用Apache Commons JXPath的
JXPathContext.getValue()或类似方法处理该字符串。 - 危险函数调用 :JXPath支持一种特殊的函数语法,例如
exec(java.lang.Runtime.getRuntime(), '命令')。这个exec函数是JXPath提供的一个“扩展函数”,它允许执行任意静态方法。 - 代码执行 :当
valueReference被设置为exec(java.lang.Runtime.getRuntime(), 'touch /tmp/test')时,JXPath引擎会真的去调用Runtime.getRuntime().exec("touch /tmp/test"),从而在服务器上执行系统命令。
为什么这是一个漏洞? 因为GeoServer在默认配置下, 未对 valueReference 参数进行任何身份验证或授权检查 。任何能够访问WFS服务端点(通常是 /geoserver/wfs )的用户,无论是否登录,都可以调用 Get


3344

被折叠的 条评论
为什么被折叠?



