Spring rce CVE-2022-22965

原理大致是这样:spring框架在传参的时候会与对应实体类自动参数绑定,通过”.”还可以访问对应实体类的引用类型变量。使用getClass方法,通过反射机制最终获取tomcat的日志配置成员属性,通过set方法,修改目录、内容等属性成员,达到任意文件写入的目的。

环境:

jdk9、springmvc、tomcat8

一、先看下传参:

定义2个实体类

public class User {
    private String username;
    private String password;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public SubTest getSub(){
        return new SubTest();
    }
}
public class SubTest {
    public void setsubfunction(String s){
        System.out.println("=====");
        System.out.println(s);
        System.out.println("=====");
    }
}

定义一个Controller类

@RestController
public class HelloController {
    @RequestMapping("/rce")
    @ResponseBody
    public String helloTest(User user) throws IOException {
        System.out.println(user.getPassword());
        System.out.println(user.getUsername());
        return "hello spring : ";
    }
}

不管是GET还是POST,只要是Controller接受的方式都可以传参赋值。

利用POST方式,传参

POST /rce HTTP/1.1
Host: 127.0.0.1:8083
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=39A8228CB652B1A3CA4E1B49C87C40AF
Connection: close
Content-Length: 15

username=vpanda

这里username=vpanda的传参,调用了User的setUsername方法。

POST /rce HTTP/1.1
Host: 127.0.0.1:8083
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=39A8228CB652B1A3CA4E1B49C87C40AF
Connection: close
Content-Length: 25

sub.subfunction=aaaaatest

这里sub.subfunction=aaaaatest,实际调用User的getSub方法,获得SubTest对象后实现setsubfunction方法,传参aaaaatest,最终实现SubTest类型的setsubfunction。

输出

=====
aaaaatest
=====

二、接下去直接看POC的利用链:

class.module.classLoader.resources.context.parent.pipeline.first.pattern=class.module.classLoader.resources.context.parent.pipeline.first.suffix=class.module.classLoader.resources.context.parent.pipeline.first.directory=class.module.classLoader.resources.context.parent.pipeline.first.prefix=class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

在这里的实现逻辑是当前user对象getclass获得了类对象,Class类中存在getModule,获得module类对象,而Module类又存在getclassloader方法,最终返回一个类加载器。

Spring rce CVE-2022-22965

调试输出当前类加载器名称

ClassLoader classLoader = user.getClass().getModule().getClassLoader();
System.out.println("===classloader===");
System.out.println(classLoader);
System.out.println("===classloadername===");
System.out.println(classLoader.getClass().getName());
System.out.println("========");

`
===classloader===
ParallelWebappClassLoader
context: ROOT
delegate: false

Original: https://www.cnblogs.com/vpandaxjl/p/16111441.html
Author: 功夫小熊猫
Title: Spring rce CVE-2022-22965

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571690/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis 哈希Hash底层数据结构

    Redis 底层数据结构 Redis数据库就像是一个哈希表,首先对key进行哈希运算得到哈希值再取模得到一个下标,每个元素是一个节点,节点之间形成链表。这感觉有点像Java中的Ha…

    Java 2023年6月7日
    074
  • 部署-docker资源踩坑

    docker资源踩坑 博主在自己的电脑上,使用docker运行gitlab镜像的时候,发现docker命令失去了响应。但是根据网上的资料显示,gitlab最低配置只需要2核,4GB…

    Java 2023年6月7日
    097
  • Java基础之 注释、标识符、关键字

    在代码量比较多,项目结构复杂起来,我们就需要用到注释。 注释不会被执行,是给写代码的人看的 书写注释是一个非常好的习惯 在Java中的注释有三种: 单行注释 多行注释 文档注释 示…

    Java 2023年6月8日
    073
  • 7月8日 学习日记

    HashMap 通过扩容可以减少链表长度 当链表长度超过8时会扩容 当数组长度到达64且链表长度超过8个的时候会转化成红黑树 红黑树 左结点都是比结点小 右结点都是比结点大 先比较…

    Java 2023年6月6日
    077
  • 咕泡学院高级架构师全套课程

    百度网盘分享链接: https://pan.baidu.com/s/1yFtiPsIcDGFyELJHl4wjQg视频也是从网上找了好久才找的的。我看了一部分,感觉不同,同事也说高…

    Java 2023年6月6日
    097
  • 【转】消息中间件MQ的学习境界和路线

    原文:https://www.cnblogs.com/xiexj/p/16095395.html Original: https://www.cnblogs.com/tc310/p…

    Java 2023年5月29日
    095
  • II-第十二章:(1)SpringCloud Alibaba简介

    一、SpringCloud Alibaba Spring Cloud Netflix Projects Entering Maintenance Mode 什么是维护模式? 将模块…

    Java 2023年5月29日
    061
  • 使用Flutter开发的抖音国际版

    简介 最近花了两天时间研究使用Flutter开发一个抖音国际版. 个人感觉使用Flutter开发app快得不要不要的额. 两天就基本可以开发个大概出来. 最主要是热重载,太方便实时…

    Java 2023年6月7日
    086
  • 如何在Linux中指定安装nodejs的版本

    如何在Linux中指定安装nodejs的版本 1.序言 在日常使用中,你可能会在安装软件包的时候遇到这种错误: warning Resolution field "@ty…

    Java 2023年6月7日
    081
  • 重定向与请求转法的区别(简洁版)

    TOC # 二者的定义 ## 重定向redirect 浏览器向服务器发送一个请求,服务器会接收并处理返回新处理的URL给,浏览器客户端,浏览器客户端再次请求服务器获取,服务器再次响…

    Java 2023年6月5日
    071
  • Profile

    总有那么一些时候,我们希望Spring容器能够根据我们提供的条件决定哪些Bean需要创建,哪些Bean不需要创建。提供的条件不同,Spring容器创建的Bean也不同。创建的Bea…

    Java 2023年6月5日
    070
  • 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之docker部署(八)

    基于Vue和Quasar的前端SPA项目实战之docker部署(八) 回顾 通过上一篇文章基于Vue和Quasar的前端SPA项目实战之业务数据(七)的介绍,crudapi-adm…

    Java 2023年6月6日
    0100
  • java内存区域模型和详解

    一,概述 java虚拟机运行时数据区模型图: 主要包括:程序计数器,java虚拟机栈,本地方法栈,java 堆,方法区(元空间)。 其中堆和方法区由所有线程共享的数据区;程序计数器…

    Java 2023年6月13日
    062
  • 使用jhipster 加速java web开发

    jhipster,中文释义: Java 热爱者! JHipster is a development platform to quickly generate, develop, …

    Java 2023年5月29日
    079
  • WWDC2016-session402-whatsNewInSwift3

    Dock 应用的介绍:1.设计到的东西多2.使用 swift 设计3.Dock 的代码量: 200,000行4.更少的重写相同功能的代码 swift.org 官网介绍 Swift …

    Java 2023年5月30日
    079
  • 面试官:@Autowired, @Resource, @Inject 三个注解的区别?一下懵了。。。

    作者:Richard_Yi来源:juejin.cn/post/6844904056230690824 前言 本章的内容主要是想探讨我们在进行Spring 开发过程当中,关于依赖注入…

    Java 2023年6月15日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球