关于Tomcat的一小点知识

0x00 引言

在做WUSTCTF2020的时候,有两道题都是跟Tomcat有关的,质量很高的那道Train Yourself To Be Godly就是关于Tomcat部署war包的,但我对这个不太了解,所以今天借助一些文章来学习了下,并记录下来。

0x01 Web Application

这个wiki上介绍得很详细,这种架构我还是懂的,所以就贴个链接好了。

0x02 Java Servlet

全称是Server Applet。它是用java编写的服务器端程序,运行在服务器端,由Servlet容器所管理,用于生成动态的内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的,一般情况下,人们将Servlet理解为后者。

Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。而Servlet的规范就是:所有实现servlet的类,都需要实现它那五个方法

  • init() 初始化
  • service() 处理客户端的请求
  • destroy() 释放资源
  • getServletConfig()
  • getServletInfo()

其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service()。

既然servlet只是个服务器端程序,因此它的作用非常简单,它只是个Java接口,并不直接与客户端打交道,与各种协议也没有关系。与客户端打交道的是Servlet容器,Servlet容器是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务。Web服务器在接受到用户的请求后,先将请求交给Servlet容器,再由Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理, 并产生一个响应。这个响应由Servlet容器返回给Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给Web浏览器。而接下来要介绍的就是一种非常常用的Servlet容器。

0x03 Apache Tomcat

简介

Tomcat是由Apache软件基金会属下的项目开发的Servlet容器,提供了一个Jasper编译器用以将JSP编译成对应的Servlet。

Tomcat的Servlet引擎通常与Apache或者其他Web服务器一起工作。除了用于开发过程中的调试以及那些对速度和事务处理只有很小要求的用户,很少会将Tomcat单独作为Web服务器。但随着版本的更新,正有越来越多的用户将其单独作为Web服务器用以那些对速度和可靠性有较高要求的环境中。

Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的 Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache,我们可以将Apache和Tomcat集成在 一起使用,Apache作为HTTP Web服务器,Tomcat作为Web容器。

为什么会使用Servlet容器?

  • 通信支持:利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立serversocket、监听某个端口、创建流等 等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考 虑如何在servlet中实现业务逻辑(如处理一个订单)。
  • 生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。
  • 多线程支持:容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。
  • 声明方式实现安全:利用servlet容器,你可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。
  • JSP支持:servlet容器负责将jsp代码翻译为真正的java代码。

工作流程

  1. 客户端(通常都是浏览器)访问Web服务器,发送HTTP请求。

  2. Web服务器接收到请求后,传递给Servlet容器。

  3. Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。

  4. Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。

  5. Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。

web.xml

web.xml文件是Java web项目中的一个配置文件,主要用于配置欢迎页、Filter、Listener、Servlet等,但并不是必须的,一个java web项目没有web.xml文件照样能跑起来。Tomcat容器/conf目录下也有作用于全局web应用web.xml文件,当一个web项目要启动时,Tomcat会首先加载项目中的web.xml文件,然后通过其中的配置来启动项目,只有配置的各项没有错误时,项目才能正常启动。

WEB-INF

WEB-INF主要包含以下文件或目录:

/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码

管理界面

右边的按钮Server Status,Manager App,Host Manager分别表示进入服务器状态,管理服务器上部署的应用,管理主机界面。

  • Server Status 服务器状态管理,路径为/manager/status
  • Manager App 管理服务器上部署的应用,路径为/manager/html

在这里可以管理服务器上部署的应用,页面上有start,stop按钮可以启动和关闭web project;还可以进行项目部署,上传项目。

  • Host Manager 管理主机界面。

0x04 JSP

JSP全称Java Server Page,直译就是“运行在服务器端的页面”。我们可以直接在JSP文件里写HTML代码,使用上把它当做HTML文件。并且JSP中HTML/CSS/JS等的写法和HTML文件中的写法是一模一样的。我们可以把Java代码内嵌在JSP页面中,很方便地把动态数据渲染成静态页面。

当有人请求JSP时,服务器内部会经历一次动态资源(JSP)到静态资源(HTML)的转化,服务器会自动帮我们把JSP中的HTML片段和数据拼接成静态资源响应给浏览器。也就是说JSP运行在服务器端,但最终发给客户端的都已经是转换好的HTML静态页面(在响应体里)。服务器并没有把JSP文件发给浏览器

太难了,我直接看晕了,下次有缘再把具体的实现看一下吧qaq

0x05 WAR包

WAR(Web Archive file)是网络应用程序文件,它允许将许多文件组合成一个压缩文件。War专用于Web方面。大部分的JAVA WEB工程,都是打成WAR包进行发布的。

War是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块。通常用于网站,打成包部署到容器中,以tomcat来说,将war文件包放置它的\webapps\目录下,启动Tomcat时,这个包可以自动进行解压。

上图是一个基本的war包的目录结构。这篇文章把WAR包的文件交互原理解释得比较清楚。

0x06 总结

看了一下午,我发现还是能够理解一点,但由于我对服务架构不太熟悉,也不懂java,所以很多知识都没有能很好的理解。所以以后看的多了再来魔改下这篇文章吧qaq,目前我想知道的已经学到了。拜拜!

Author: Neorah
Link: https://neorah.me/web/tomcat/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.