CVE-2025-41243浅析

admin 2025-12-25 02:58:23 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析SpringCloudGatewayCVE-2025-41243漏洞,即对CVE-2022-22947的绕过。漏洞因修复未限制属性写入,利用SPEL修改systemProperties关闭安全限制,导致DoS或RCE。核心在于通过赋值绕过GatewayEvaluationContext,建议升级补丁。 综合评分: 85 文章分类: 漏洞分析,WEB安全,漏洞预警


cover_image

CVE-2025-41243浅析

原创

00

千寻安服

2025年10月13日 09:00 四川

CVE-2025-41243浅析

引言

大哥晚上在群里转发了这个漏洞,其实下午就刷到了,简单分析一下:

可以发现是对CVE-2022-22947的绕过,这个漏洞肯定都很熟悉,spring gateway rce,每次扫出来/actuator,都会直呼“有角度”,再一看有/gateway,又会大喊一声“起飞”,只是这两年扫出来也一般打不了,因为遇到了很多次添加了路由,再刷新什么都没有的情况:

CVE-2022-22947

简单回忆一下CVE-2022-22947,其实从官方文档就可以发现,gateway支持application.yml配置路由,而路由中的filters是支持spel表达式的:

再翻翻文档可以发现,gateway支持通过post添加路由,而post内容和上面配置文件基本一样,同样包含filters,说明也是支持spel表达式的:

然后随便找个可以用的filter进行测试,如DedupeResponseHeader:

spel可以使用#{T(java.lang.xxx).xxx()}的方式调用静态方法,利用如下,先新建路由:

再刷新路由:

再访问添加的路由,即可看到表达式执行的结果,然后就是通过spel注入内存马了,可以通过下面这篇文章学习:

https://gv7.me/articles/2022/the-spring-cloud-gateway-inject-memshell-through-spel-expressions/

该漏洞的修复方式是将StandardEvaluationContext换成了GatewayEvaluationContext:

GatewayEvaluationContext是对SimpleEvaluationContext的封装,根据官方的解释看就是使用该类可以限制spel语法,比如java类型、构造函数和bean引用:

也就是不能再通过spel调用静态方法了:

虽然发送添加路由的数据包后会返回201Created,但刷新时会由于SimpleEvaluationContext的限制导致服务端报错添加不上路由,这就是上面说到添加不上路由的原因:

CVE-2025-41243

再看看这个漏洞的描述,是通过访问@systemProperties bean修改配置,关闭限制,再进行的进一步利用:

即然是绕过那可以再仔细看看CVE-2022-22947的修复方式,GatewayEvaluationContext中设置了一个环境变量spring.cloud.gateway.restrictive-property-accessor,且默认为true:

这里可以返回SimpleEvaluationContext的官方说明,发现有三种级别,第一种只读,第二种可读可写,第三种就是自定义的:

而为什么这里修复时要加个if,直接用默认的只读不行吗,这里找到了CVE-2022-22947作者的文章,通过作者的说明可以发现简单使用SimpleEvaluationContext后仅仅是不能调用带有参数的方法,而调用不带参数的方法依然可行,比如toString:

CVE-2022-22947: SpEL Casting and Evil Beans

然后作者也把该问题报给了官方,官方就加了个spring.cloud.gateway.restrictive-property-accessor并默认为true,同时限制了可读属性,开发人员也可以根据自己的需求设置其为false,回退到SimpleEvaluationContext第一种可读级别:

这时再尝试使用toString就会被限制,导致无法成功添加路由了:

再看看CVE-2025-41243的修复方式,在上次修复的基础上添加了个withAssignmentDisabled方法:

修复是禁用了赋值,那说明没修复前是可以进行赋值操作的,再看看CVE-2022-22947修复中的RestrictivePropertyAccessor,可以发现只限制了读取,并没有限制写入:

再返回该漏洞通报中的漏洞复现,可以发现里面有个调用systemProperties这个bean修改配置属性的表达式,其实这个就是payload了,这里的作用是修改系统配置,启用h2控制台:

同样的,这里可以修改上面CVE-2022-22947修复时说到的spring.cloud.gateway.restrictive-property-accessor,发送如下paylaod修改其为false,关闭限制:

{“id”: “first_route”,”predicates”: [{“name”: “Path”,”args”: {“_genkey_0″:”/first”}}],”filters”: [{“name”: “DedupeResponseHeader”,”args”: {“_genkey_0″:”#{@systemProperties[‘spring.cloud.gateway.restrictive-property-accessor.enabled’] = false}”}}],”uri”: “https://www.uri-destination.org”,”order”: 0}

然后就可以调用CVE-2022-22947作者文中说到的无参方法了:

同时文中还发现了一个reactorServerResourceFactory.destroy方法可以使服务关闭,造成dos:

如下发送pyaload可以结束进程:

{“id”: “first_route”,”predicates”: [{“name”: “Path”,”args”: {“_genkey_0″:”/first”}}],”filters”: [{“name”: “DedupeResponseHeader”,”args”: {“_genkey_0″:”#{@reactorServerResourceFactory.destroy}”}}],”uri”: “https://www.uri-destination.org”,”order”: 0}

rce的话,目前能想到的是通过systemProperties修改spring的配置属性,根据一些组件进行rce,比如修改spring.datasource.url进行jdbc反序列化,其实就是/actuator/env的利用方式,具体可以参考下面的文章,更通用的利用方式可能只有找找其他bean了,等待大佬ing:

https://github.com/LandGrey/SpringBootVulExploit

监制丨铁子

策划丨Cupid

美工丨molin


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:千寻安服 00《CVE-2025-41243浅析》

评论:0   参与:  20