Tomcat 架构
之前分析 Tomcat Ajp 的时候看了一些 Tomcat 的架构,这里不再赘述,链接在此:CVE-2020-1938 幽灵猫( GhostCat ) Tomcat-Ajp 协议 任意文件读取/JSP 文件包含漏洞分析
补充一个架构图
Java web 开发
学习链接:https://www.liaoxuefeng.com/wiki/1252599548343744/1255945497738400
内存马简介
内存马主要利用了 Tomcat 的部分组件会在内存中长期驻留的特性,只要将我们的恶意组件注入其中,就可以一直生效,直到容器重启。
一般分为以下四种
- 动态注册 filter
- 动态注册 servlet
- 动态注册 listener
- 基于 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()。