GeoServer property 表达式注入代码执行(CVE-2024-36401)
type
status
date
slug
summary
tags
category
icon
password
漏洞描述
2024年7月,互联网上披露Geoserver表达式注入致远程代码执行漏洞(CVE-2024-36401),攻击者无需认证即可利用该漏洞获取服务器权限,建议受影响的客户尽快修复漏洞。
该系统不安全地将属性名称解析为 XPath 表达式。GeoServer 调用的 GeoTools 库 API 以不安全的方式将要素类型的属性名称传递给 commons-jxpath 库。该库在解析 XPath 表达式时,可以执行任意代码。这种 XPath 评估本应仅供复杂要素类型(例如应用程序架构数据存储)使用,但由于错误,该机制也被应用于简单要素类型。这使得所有 GeoServer 实例都可能受到该漏洞的影响。
漏洞影响
此漏洞可能导致远程代码执行 (RCE)。未经身份验证的用户可以通过向默认的 GeoServer 安装发送特制的输入,利用多个 OGC 请求参数,如 WFS GetFeature、WFS GetPropertyValue、WMS GetMap、WMS GetFeatureInfo、WMS GetLegendGraphic 和 WPS Execute 请求,从而执行任意代码。这种远程代码执行将导致系统被完全控制,严重威胁系统安全,可能造成数据泄露、勒索或更广泛的网络攻击。
影响范围
环境搭建
漏洞利用
存在两种传参方式,第一种是xml格式:
POST XML传参

第二种是POST/GET传参方式
普通GET传参


普通POST传参


如果出现响应 400 同时出现
java.lang.ClassCastException: java.lang.ProcessImpl cannot be cast to org.opengis.feature.type.AttributeDescriptor 报错,说明命令已执行成功,漏洞存在。进入容器,
touch /tmp/success1与touch /tmp/success2均已成功执行。
需要注意,typeNames必须存在,可以在Web页面中找到当前服务器中的所有Types:

或者直接请求

默认有这些
Sleep延时探测
延迟两秒执行,则代表存在漏洞

JNDI注入


探测JDK版本

除此之外还可以通过报错的信息判断JDK大致区间
利用
33*33数学计算触发类型转换错误获取系统信息
如果出现了
则可以确认JDK版本为Java 9 或更高版本(因为只有 Java 9+ 才有模块系统)
命令执行
Memshell
注意在JDK>8时,defineAnonymousClass做了限制,被加载的Class要满足两个条件之一:
- 没有包名
- 包名跟第一个参数Class的包名一致,此处为java.lang,否则会报错
同时也要注意中间件,有的是
tomcat有的是jetty
JDK 8-11
Behinder(JDK8)
密码7
Behinder(JDK11)
js执行反射调用unsafe注入
注意⚠️:js引擎JDK15就已经删除,无法使用。
密码7(jetty)
JDK 11-22 通杀内存马
通过观察 JMG 的 payload 我们可以看到,其中恶意字节码是直接使用 Base64 编码的。
众所周知,class 文件经过一次 Base64 编码会使得恶意字节码字符串大小增加,这个时候我们可以考虑使用 gzip 先压缩 class 文件,接着再套一层 Base64 编码,这样可以大大缩小 SpEL 表达式的长度。
Bypass WAF

request.getValueReference().replaceAll("\\\\[.*\\\\]", ""),这里会将[]中的内容替换为空,但是为贪婪匹配,所以只能使用一次在xml中,
<!--xxx-->代表注释,因此可以使用如下payload:
参考:
Loading...