声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.1

前言

Springboot是一个开源框架,其内嵌了一个web容器,当使用springboot开发一个web系统后,他可以打包成一个jar包,直接运行后开启一个web服务,配合nginx进行分布式集群,不用依赖外部给予的web中间件,就算系统中存在文件上传漏洞,他也没办法解析。

在一次项目中,遇到了一个springboot的反序列化漏洞,当时只能执行命令,目标不出网,文件基本没法上传,无奈这个点只能放弃,后续阅读文章时,发现可以用反序列化漏洞打入一个内存shell。

No.2

springboot 必要知识

了解Spring boot的内存shell,需要先了解启动过程中,spring boot是怎么确定url和Controller类的映射关系。

No.3

简单分析

spring boot启动过程中,在AbstractHandlerMethodMapping的initHandlerMethods方法中,获取全部的bean再遍历,遍历的目的是寻找Controller类,只要是注解有@RestController的bean都会进入最后的detectHandlerMethods方法

进入detectHandlerMethods方法,在这个方法里,首先会查找类中被路由注解修饰过的方法 ,之后获取注解和url的映射关系生成RequestMappingInfo对象,之后将bean,Method,RequestMappingInfo注册进MappingRegistry

在getMappingForMethod方法中,会解析Controller类的方法中的注解,从而生成一个与之对应的RequestMappingInfo对象,里面保存了访问Method的url条件

最后的registerHandlerMethod方法就是执行mappingRegistry.register方法,到这里,url与处理的类之间的映射关系被保存,当我们访问url时,springboot便知道由哪个类中的那个方法处理,如果我们能创建一个RequestMappingInfo,一个处理的类,将他们的映射关系保存进mappingRegistry,内存shell就能建立

在AbstractHandlerMethodMapping类中还有一个方法也会进入mappingRegistry.register,就是regusterMapping方法,这个方法就是动态添加Controller的接口,在程序过程中,只要调用这个接口,就能注册一个Controller类,从上面的分析过程可以知道,这个接口的使用条件是1,bean实例,2,处理请求的method,3、对应的RequestMappinginfo对象

No.4

实现过程

恶意class加载进JVM

BufferedReader r = new BufferedReader(new FileReader("shell.txt"));String code = r.readLine;byte d = new sun.misc.BASE64Decoder.decodeBuffer(code);java.lang.reflect.Method m = ClassLoader.class.getDeclaredMethod("defineClass

java内存shell_Springboot 内存shell相关推荐

  1. Java中的内存溢出和内存泄漏

    内存泄漏是指程序在申请内存后,无法释放已申请的内存空间.内存溢出是指程序申请内存时,没有足够的内存供申请者使用:或者说提供一块存储int数据的存储空间,但存储了long数据,则结果是内存不够用,报错O ...

  2. Java进程占用内存超高分析

    Java进程占用内存超高分析_ 1. 报错 2. 解决 3. 我用到的解决方法 写了一个Java服务,没有定时服务,没有线程池,没有重度的读写,只是对外提供了几个接口,接口的访问量并不高,结果占用内存 ...

  3. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  4. Java虚拟机的内存空间有几种

    Java虚拟机的内存空间有几种?(1)问题分析: JVM(虚拟机)的内存划分 不同的数据使用的是哪一块内存空间 (2)核心答案讲解: Java虚拟机有那几块内存空间: 1)栈内存:方法运行时所进入的内 ...

  5. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  6. ​Java 中的内存溢出和内存泄露是什么?我给你举个有味道的例子​

    作者 l 会点代码的大叔(CodeDaShu) JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1. 内存泄漏(memory lea ...

  7. 深入理解Java中的内存泄漏

    理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...

  8. Java进程占用内存过高,排查解决方法

    Java进程占用内存过高,排查解决方法 参考文章: (1)Java进程占用内存过高,排查解决方法 (2)https://www.cnblogs.com/eeexu123/p/10913389.html ...

  9. 形式参数内存在哪java_深入浅出Java中JVM内存管理

    原标题:深入浅出Java中JVM内存管理 Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC ...

最新文章

  1. centeros php 实战
  2. 【数据竞赛】这篇文章送给想要学习特征交叉的朋友。
  3. 【转】Docker 运行时资源限制-内存memory、交换机分区Swap、CPU
  4. php静态函数作用,php – OOP中静态函数有什么用?
  5. SAP UI5 初学者教程之十一 :SAP UI5 容器类控件 Page 和 Panel 试读版
  6. C# js调用winform方法,C# JS与winform通信
  7. 巨型机是一种什么的超级计算机,这个世界其实是一个超级计算机
  8. 【python教程入门学习】python基础语法
  9. webbrowser 打开支付宝网页提示无权打开_在押人员生活缴费更便利:支付宝线上“智慧监所”...
  10. 【MySQL】MySQL 如何查看sql语句执行时间和效率
  11. ssh 框架搭建出现错误
  12. 解决PHPStudy8.1.1 mySQL服务启动失败 数据库工具报错卡死
  13. 某些数组和字符串类型转换(转)
  14. 移动web-使一个盒子水平垂直居中的六种方法
  15. LED跑马灯-位操作
  16. 旅游背包(多维有界的背包问题)
  17. java缓存击穿_对缓存击穿的一点思考
  18. 【测试】用Chrome在电脑上模拟微信浏览器
  19. 多线程下载神器IDM,永久使用
  20. Windows XP注册表与驱动程序优化全集

热门文章

  1. 在创业公司工作是一种什么样的体验?
  2. 凭运气接来的项目,怎样凭本事搞砸?
  3. Vue、element-ui的resetFields()方法重置表单无效问题及解决办法
  4. SpringBoot2基础,进阶,数据库,中间件等系列文章目录分类
  5. Shell编程入门(第二版)(下)
  6. 内置函数与lambda匿名函数
  7. 一步一步分析vue之_data属性
  8. laravel数据迁移问题
  9. canvas学习-----1px线条模糊问题
  10. eclipse使用maven tomcat插件部署无法关联源代码