Tomcat之四大内存马(将续更)
1
内存马类型
根据内存马注入的方式,大致可以将内存马划分为如下两类:
1
servlet-api型
通过命令执行等方式动态注册一个新的listener、filter或者servlet,从而实现命令执行等功能。特定框架、容器的内存马原理与此类似,如spring的controller内存马,tomcat的valve内存马
2
字节码增强型
通过java的instrumentation动态修改已有代码,进而实现命令执行等功能
2
Tomcat简介
一、咩系servlet
Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
二、请求的处理过程
客户端发起一个http请求,比如get类型
Servlet容器接收到请求,根据请求信息,封装成HttpServletRequest和HttpServletResponse对象
Servlet容器调用HttpServlet的init()方法,init方法只在第一次请求的时候被调用
Servlet容器调用service()方法。service()方法根据请求类型,这里是get类型,分别调用doGet或者doPost方法,这里调用doGet方法。doXXX方法中是我们自己写的业务逻辑
业务逻辑处理完成之后,返回给Servlet容器,然后容器将结果返回给客户端。容器关闭时候,会调用destory方法
三、Tomcat和Servlet的关系
Tomcat 是Web应用服务器,是一个Servlet/JSP容器,Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户。
其中Tomcat中有四种类型的Servlet容器,从上到下分别是 Engine、Host、Context、Wrapper:
Engine,实现类为 org.apache.catalina.core.StandardEngine
Host,实现类为 org.apache.catalina.core.StandardHost
Context,实现类为 org.apache.catalina.core.StandardContext
Wrapper,实现类为 org.apache.catalina.core.StandardWrapper
它们之间是存在父子关系的
Engine:可以用来配置多个虚拟主机,每个虚拟主机都有一个域名,当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理,Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理
Host:一个 Host 代表一个虚拟主机,其下可以包含多个 Context
Context:一个 Context 对应于一个Web Application,一个WebApplication由一个或者多个Servlet组成。Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类,当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类。如果找到,则执行该类,获得请求的回应,并返回
Wrapper:一个 Wrapper 代表一个 Servlet。每个Wrapper实例表示一个具体的Servlet定义,StandardWrapper是Wrapper接口的标准实现类(StandardWrapper 的主要任务就是载入Servlet类并且进行实例化)
最终的流程图如下:
四、Tomcat容器
在 Tomcat 中,每个 Host 下可以有多个 Context (Context 是 Host 的子容器), 每个 Context 都代表一个具体的Web应用,都有一个唯一的路径就相当于下图中的 /shop /manager 这种,在一个 Context 下可以有着多个 Wrapper Wrapper 主要负责管理 Servlet ,包括的 Servlet 的装载、初始化、执行以及资源回收。
......
end
本篇文章仅简单介绍tomcat容器内部组件,后续将持续更新以上四种内存马的分析与实现等文章~