• Java安全之Spring内存马


    基础知识#

    Bean#

    bean 是 Spring 框架的一个核心概念,它是构成应用程序的主干,并且是由 Spring IoC 容器负责实例化、配置、组装和管理的对象。

    通俗来讲:

    • bean 是对象
    • bean 被 IoC 容器管理
    • Spring 应用主要是由一个个的 bean 构成的

    ApplicationContext#

    Spring 框架中,BeanFactory 接口是 Spring IoC容器 的实际代表者。

    从下面的接口继承关系图中可以看出,ApplicationContext 接口继承了 BeanFactory 接口,并通过继承其他接口进一步扩展了基本容器的功能。

    因此,org.springframework.context.ApplicationContext接口也代表了 IoC容器 ,它负责实例化、定位、配置应用程序中的对象(bean)及建立这些对象间(beans)的依赖。

    IoC容器通过读取配置元数据来获取对象的实例化、配置和组装的描述信息。配置的零元数据可以用xmlJava注解Java代码来表示。

    实现思路:

    1. 使用纯 java 代码来获得当前代码运行时的上下文环境(Conetxt);
    2. 使用纯 java 代码在上下文环境中手动注册一个 controller;
    3. controller中RequestMapping的方法中写入 Webshell 逻辑,达到和 Webshell 的 URL 进行交互回显的效果;

    ContextLoaderListener 与 DispatcherServlet#

    主要看一下ContextLoaderListener,DispatcherServlet在之前分析Thymeleaf的SSTI的时候就做了相关的分析

    下面是一个典型 Spring 应用的 web.xml 配置示例:

     

    1. "<a href=" http:="" www.w3.org="" 2001="" XMLSchema-instance"="" rel="nofollow">http://www.w3.org/2001/XMLSchema-instance"
    2. xmlns="http://java.sun.com/xml/ns/javaee"
    3. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    4. version="2.5">
    5. HelloSpringMVC
    6. contextConfigLocation
    7. /WEB-INF/applicationContext.xml
    8. org.springframework.web.context.ContextLoaderListener
    9. dispatcherServlet
    10. org.springframework.web.servlet.DispatcherServlet
    11. contextConfigLocation
    12. /WEB-INF/dispatcherServlet-servlet.xml
    13. 1
    14. dispatcherServlet
    15. /

    关于 Root Context 和 Child Context 的重要概念:

    • Spring 应用中可以同时有多个 Context,其中只有一个 Root Context,剩下的全是 Child Context
    • 所有Child Context都可以访问在 Root Context中定义的 bean,但是Root Context无法访问Child Context中定义的 bean
    • 所有的Context在创建后,都会被作为一个属性添加到了 ServletContext

    ContextLoaderListener#

    ContextLoaderListener 主要被用来初始化全局唯一的Root Context,即 Root WebApplicationContext。这个 Root WebApplicationContext 会和其他 Child Context 实例共享它的 IoC 容器,供其他 Child Context 获取并使用容器中的 bean

    回到 web.xml 中,其相关配置如下:

    1. <context-param>
    2. <param-name>contextConfigLocation</param-name>
    3. <param-value>/WEB-INF/applicationContext.xml</param-value>
    4. </context-param>
    5. <listener>
    6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    7. </listener>

    依照规范,当没有显式配置 ContextLoaderListener 的 contextConfigLocation 时,程序会自动寻找 /WEB-INF/applicationContext.xml,作为配置文件,所以其实上面的  标签对其实完全可以去掉。

    DispatcherServlet 初始化完成后,会创建一个普通的 Child Context 实例。

    每个具体的 DispatcherServlet 创建的是一个 Child Context,代表一个独立的 IoC 容器;而 ContextLoaderListener 所创建的是一个 Root Context,代表全局唯一的一个公共 IoC 容器

    果要访问和操作 bean ,一般要获得当前代码执行环境的IoC 容器 代表者 ApplicationContext

    Spring Controller内存马实现#

    获取Context#

    所有的Context在创建后,都会被作为一个属性添加到了 ServletContext

    LandGrey师傅文中给出了4种获取当前上下文的思路

    第一种:getCurrentWebApplicationContext()

    1. // getCurrentWebApplicationContext方法获得的是一个XmlWebApplicationContext实例类型的Root WebApplicationContext。
    2. WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();

    第二种:WebApplicationContextUtils

    1. // 通过这种方法获得的也是一个 Root WebApplicationContext 。此方法看起来比较麻烦
    2. WebApplicationContext context =
  • 相关阅读:
    使用IDEA连接mysql
    【Linux初阶】操作系统概念与定位 | 操作系统管理硬件方法、系统调用和库函数概念
    【数据结构初阶-二叉树】非线性数据结构来了
    [附源码]计算机毕业设计停车场管理系统Springboot程序
    2022到2023基于java+微信小程序毕业设计课题参考
    网络安全(6)
    查看linux开发板的CPU频率
    【 第五章 多表关系,多表查询,内连接,外连接,自连接,联合查询,子查询】
    Vue之Keep-alive
    Anaconda使用指南
  • 原文地址:https://blog.csdn.net/guanshengg/article/details/126436742