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()。