前置知识


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

文章作者: yq1ng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 yq1ng !
评论
  目录