GeoServer JXPath远程代码执行漏洞分析(CVE-2024-36401)
type
status
date
slug
summary
tags
category
icon
password
AI summary
0x01 环境搭建
直接用IDEA部署War包(需JDK11以上):https://sourceforge.net/projects/geoserver/files/GeoServer/2.25.1/geoserver-2.25.1-war.zip
0x02 漏洞分析
根据Github的漏洞公告可得知:GeoServer调用了GeoTools的API,且GeoTools使用了不安全的commons-jxpath 库,导致了XPath表达时注入,执行任意代码。
并且提到了可通过这几个OGC请求来利用。
在官网找到了WFS GetPropertyValue的用法。
把断点打在
GetPropertyValue.run()
这里获取了valueReference的值
这里使用
filterFactory
创建一个 PropertyName
对象,该对象表示指定的属性名称,这里使用了 request.getValueReference()
方法返回的值作为属性名称。在 GeoServer 或类似的 GIS 环境中,
featureType.getFeatureType()
返回的是特定地理特征类型(如地图中的河流、建筑物等)的描述信息,包括其属性和其他特性的定义。这个方法通常返回一个 org.opengis.feature.FeatureType
对象,它描述了地理特征类型的结构,包括每个属性的名称、类型、约束等信息。继续跟进
GeoTools组件的
FeaturePropertyAccessorFactory#get()
是存在漏洞的,所以需要让这里的accessor为FeaturePropertyAccessorFactory
。这里一开始的accessor是空的,也就进不去这个
if
,下面PropertyAccessors.findPropertyAccessors
开始查询可用的Accessors。能通过这两个条件即可,关键点就在
accessor.canHandle(object, xpath, target)
,不同的PropertyAccessorFactory
对应着不同的canHandle方法。SimpleFeaturePropertyAccessorFactory
的canHandle如下:这里的object为
SimpleFeatureTypeImpl
刚好能走入else,返回true。因为'the_geom'
是一个有效的地理特征属性名。在SimpleFeatureTypeImpl
对象描述中可以找到。最终返回的是SimpleFeaturePropertyAccessorFactory而不是
FeaturePropertyAccessorFactory
。所以当使用官方示例中的valueReference='the_geom',是不会走向漏洞点的。现在让我们看一下
FeaturePropertyAccessorFactory
是如何处理的。通过使用 Java 的
instanceof
关键字来检查 object
是否是以下类型之一:Attribute
:属性的实例。
AttributeType
:属性类型的实例。
AttributeDescriptor
:属性描述符的实例。
SimpleFeatureTypeImpl 实现了 SimpleFeatureType 接口。SimpleFeatureTypeImpl
继承自FeatureTypeImpl
类。FeatureTypeImpl
继承自ComplexType
类。ComplexType
继承自AttributeType
类。
根据以上信息,只要valueReference不为地理属性,就可以进入
FeaturePropertyAccessorFactory#get()
,最终触发XPath注入。XPath注入的文章可学习:Y4tacker的浅析Apache Commons Jxpath命令执行分析(CVE-2022-41852)
有空再学习哈🥹
Loading...