Spring框架漏洞解析之二

💡 原文中文,约9300字,阅读约需22分钟。
📝

内容提要

Spring Framework远程代码执行漏洞(CVE-2022-22965)是Java 9环境下的漏洞,攻击者可绕过黑名单禁用的类执行任意代码。Spring Cloud Gateway远程代码执行(CVE-2022-22947)是在使用Spring Cloud Gateway的应用程序中,启用或暴露不安全的Gateway Actuator端点时容易受到代码注入攻击。Spring Data Commons远程命令执行漏洞(CVE-2018-1273)是在Spring Data Commons的2.0.5及以前版本中存在的SpEL表达式注入漏洞,攻击者可注入恶意SpEL表达式执行任意命令。Spring Messaging远程命令执行漏洞(CVE-2018-1270)是在Spring框架中的spring-messaging模块中存在的STOMP消息代理处理客户端消息时的SpEL表达式注入漏洞,攻击者可通过构造恶意消息实现远程代码执行。

🔎

延伸解读

漏洞成因的共性:SpEL表达式注入与黑名单绕过

本文涉及的四个Spring漏洞中,CVE-2018-1273和CVE-2018-1270均直接源于SpEL表达式注入,攻击者通过构造恶意表达式调用Runtime执行命令;CVE-2022-22965则是在Java 9环境下利用class.module.classLoader绕过原有黑名单,间接导致代码执行;CVE-2022-22947虽为Actuator端点注入,但同样借助SpEL实现命令执行。可见SpEL的安全使用是Spring生态中需要持续关注的重点。

复现环境与利用条件差异

四个漏洞的复现均基于Vulhub平台,但利用条件不同:CVE-2022-22965要求Java 9及以上环境;CVE-2022-22947需启用或暴露不安全的Gateway Actuator端点;CVE-2018-1273影响Spring Data Commons 2.0.5及以前版本;CVE-2018-1270则针对spring-messaging模块的STOMP消息处理。读者在复现时需注意版本和配置前提,避免因环境不符导致失败。

从复现到实战:POC的通用性与限制

文章中的POC主要针对Vulhub环境编写,例如CVE-2018-1270的利用脚本需要指定订阅地址和触发方式,作者也明确指出该POC并不具有通用性。在实际测试中,目标系统的路由、订阅路径和消息格式可能不同,需要根据具体应用调整。此外,反弹shell可能因网络策略或系统限制失败,文章提到可尝试下载elf木马或使用msf提权,但未深入展开。

❓

Q&A

Spring Framework远程代码执行漏洞CVE-2022-22965的成因是什么?

该漏洞是在Java 9环境下,引入了class.module.classLoader,导致CVE-2010-1622漏洞补丁被绕过,JDK9中存在可以绕过黑名单禁用的类,从而造成漏洞。

如何复现Spring Cloud Gateway远程代码执行漏洞CVE-2022-22947?

复现步骤:1. 进入环境http://IP:8080;2. 构造包含恶意请求的路由,发送POST请求到/actuator/gateway/routes/hacktest,其中filters的value包含SpEL表达式;3. 发送POST请求到/actuator/gateway/refresh触发表达式执行;4. 发送GET请求到/actuator/gateway/routes/hacktest查看结果;5. 发送DELETE请求删除路由;6. 再次刷新路由。

Spring Data Commons远程命令执行漏洞CVE-2018-1273影响哪些版本?

影响Spring Data Commons 2.0.5及以前版本。

Spring Messaging远程命令执行漏洞CVE-2018-1270的触发机制是什么?

该漏洞存在于spring-messaging模块中,STOMP消息代理在处理客户端消息时存在SpEL表达式注入漏洞。攻击者通过构造恶意消息,在订阅时插入SpEL表达式,当后端向该订阅发送消息时触发,实现远程代码执行。

复现Spring漏洞时常用的实验环境是什么?

实验环境通常包括攻击机(kali)和靶机(Ubuntu),并基于Vulhub平台进行复现。例如攻击机IP为192.168.200.14,靶机IP为192.168.200.47。

CVE-2022-22965漏洞利用中如何写入JSP webshell?

通过发送特制请求修改Apache Tomcat的日志配置,将日志文件写入为JSP文件。具体请求中设置class.module.classLoader.resources.context.parent.pipeline.first.pattern等参数,将日志内容设置为JSP代码,并指定后缀为.jsp,目录为webapps/ROOT,前缀为tomcatwar。之后访问/tomcatwar.jsp即可执行命令。

🏷️

标签

➡️

继续阅读