Tomcat架构

之前分析Tomcat Ajp的时候看了一些Tomcat的架构,这里不再赘述,链接在此:CVE-2020-1938 幽灵猫( GhostCat ) Tomcat-Ajp协议 任意文件读取/JSP文件包含漏洞分析
补充一个架构图
image.png

Java web开发

学习链接:https://www.liaoxuefeng.com/wiki/1252599548343744/1255945497738400

内存马简介

内存马主要利用了Tomcat的部分组件会在内存中长期驻留的特性,只要将我们的恶意组件注入其中,就可以一直生效,直到容器重启。
一般分为以下四种

  1. 动态注册filter
  2. 动态注册servlet
  3. 动态注册listener
  4. 基于Java agent拦截修改关键类字节码实现内存shell

note:web.xml对于以下三种组件的加载顺序是:listener -> filter -> servlet

Servlet

简介

servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

生命周期

Servlet 的生命周期开始于Web容器的启动时,它就会被载入到Web容器内存中,直到Web容器停止运行或者重新装入servlet时候结束。这里也就是说明,一旦Servlet被装入到Web容器之后,一般是会长久驻留在Web容器之中。

  • 装入:启动服务器时加载Servlet的实例
  • 初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成
  • 调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法
  • 销毁:停止服务器时调用destroy()方法,销毁实例

Filter

简介

filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter无法产生一个请求或者响应,它只能针对某一资源的请求或者响应进行修改。

生命周期

自定义Filter的实现,需要实现javax.servlet.Filter下的init()、doFilter()、destroy()三个方法。

  • 启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
  • 每一次请求时都只调用方法doFilter()进行处理;
  • 停止服务器时调用destroy()方法,销毁实例。

Listener

简介

通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。

生命周期

以ServletRequestListener为例,ServletRequestListener主要用于监听ServletRequest对象的创建和销毁,一个ServletRequest可以注册多个ServletRequestListener接口。

  • 每次请求创建时调用requestInitialized()。
  • 每次请求销毁时调用requestDestroyed()。