前言

2020 年 1 月 6 日,国家信息安全漏洞共享平台(CNVD)收录了由北京长亭科技有限公司发现并报送的 Apache Tomcat 文件包含漏洞。Tomcat AJP 协议由于存在实现缺陷导致相关参数可控,攻击者利用该漏洞可通过构造特定参数,读取服务器 webapp 下的任意文件。若服务器端同时存在文件上传功能,攻击者可进一步实现远程代码的执行。

Tomcat AJP 协议的这种实现缺陷,对于 SpringBoot 开发的 web 应用是否受影响了?且听笔者一一道来。

AJP 协议

根据 apache 官网 AJP 协议相关介绍:

The original document was written by Dan Milstein, danmil@shore.net on December 2000.

Overview of the protocol

The ajp13 protocol is packet-oriented. A binary format was presumably chosen over the more readable plain text for reasons of performance. The web server communicates with the servlet container over TCP connections. To cut down on the expensive process of socket creation, the web server will attempt to maintain persistent TCP connections to the servlet container, and to reuse a connection for multiple request/response cycles.

Once a connection is assigned to a particular request, it will not be used for any others until the request-handling cycle has terminated. In other words, requests are not multiplexed over connections. This makes for much simpler code at either end of the connection, although it does cause more connections to be open at once.

AJP13 协议全称为 Apache JServ Protocol version 1.3 ,最初由 Dan Milstein 于2000年12月发表,后被 Apache 软件基金会 Jakarta 项目采纳。

AJP13 是一种二进制 TCP 传输协议,通过在网络传输二进制包(packet)来完成 Tomcat 与 http 服务器的请求与响应,显然这种方式比纯文本(如 text、xml等)传输的 http 协议效率要高的多。

但是 AJP13 协议对浏览器支持不够好,由于其定位是 “ Tomcat 与 HTTP 服务器之间通信的协议”,这或许是 http 协议比较盛行的原因吧。

说完了 Tomcat AJP13 协议的来龙去脉接着,进入主题。

SpringBoot 为什么这么火?

spring-boot-starter-web

对 Spring 比较熟悉的话, 基于 SpringBoot 开发 web 应用时,引入 spring-boot-starter-web 组件是必不可少的,spring-boot-starter-web 的职责是负责 web 应用的启动 、初始化、运行和停止。而 spring-boot-starter-web 组件之所以能够跑起来,少不了 http 协议的支持,典型代表就是 tomcat 服务器。

通过翻阅 spring-boot-starter-web 组件的相关 maven 依赖,我们找到了 spring-boot-starter-tomcat 组件。

    org.springframework.boot   spring-boot-starter-tomcat    2.1.5.RELEASE  compile

接着查找 spring-boot-starter-tomcat 的 maven 依赖, 其引入了 tomcat-embed-core 、tomcat-embed-el 、tomcat-annotations-api 等嵌入式组件。

javax.annotation    javax.annotation-api    1.3.2compileorg.apache.tomcat.embed    tomcat-embed-core    9.0.19compile        tomcat-annotations-api        org.apache.tomcatorg.apache.tomcat.embed    tomcat-embed-el    9.0.19compileorg.apache.tomcat.embed    tomcat-embed-websocket    9.0.19compile

正是由于这些嵌入式组件的加入,免去了 Tomcat 单独安装部署的繁杂步骤,我想这也是 SpringBoot 非常火的原因之一吧。

SpringBoot 对 AJP 协议的支持

通过阅读 tomcat-embed-core 组件,说明嵌入式 tomcat 是支持 AJP 协议的,相关代码在 org.apache.coyote.ajp 目录下。

但是奇怪的是,在 SpringBoot 的 yml 文件配置中,并没有找到 ajp 协议相关的 server 参数配置。

笔者猜测,虽然 Tomcat 集成了 ajp 协议,但是不推荐使用吧。但是有没有办法支持 ajp 协议了,答案是可以的,具体代码如下:

@Configurationpublic class AJPConfig {    private static final String PROTOCOL = "AJP/1.3";    @Value("${tomcat.ajp.port:8009}")    private int ajpPort;    @Bean    public EmbeddedServletContainerFactory servletContainer() {        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();        Connector ajpConnector = new Connector();        ajpConnector.setProtocol(PROTOCOL);        ajpConnector.setPort(ajpPort);        tomcat.addAdditionalTomcatConnectors(ajpConnector);        return tomcat;    }}

笔者上述配置需要依赖 SpringBoot 1.x 环境。

AjpProcessor

如果对 tomcat 架构比较了解的话,tomcat 大部分请求与响应由协议(Protocol)中的处理器(Processor)完成的。

所以在 tomcat 服务器接收 ajp 请求时, 由 AjpProcessor 来处理 ajp 真实的 request 请求消息。

然后,通过 prepareRequest 方法将 ajp 请求内容取出来,设置成 request 对象的 Attribute 属性

因此,黑客通过设置 request_uri、path_info 、servlet_path 属性值,从而可以读取到 /WEB-INF 下面的所有敏感文件,不限于class、xml、jar等文件。

javax.servlet.include.request_urijavax.servlet.include.path_infojavax.servlet.include.servlet_path

至于漏洞的详细分析不是本文重点,传送门:

https://blog.csdn.net/u012206617/article/details/104416626/

springboot需要tomcat服务器吗_嵌入式 Tomcat AJP 协议对 SpringBoot 应用的影响相关推荐

  1. java关闭tomcat服务器端口_关闭tomcat端口号

    一. CentOS 关闭tomcat端口号 1. 首先保证liunx下 ps -ef | grep java 2. 会显示如下信息 我使用的是IDEA打包的war包.tomcat是自带的 3. 查看未 ...

  2. 关于解决搭建Eureka出现的Unable to start embedded Tomcat;无法启动嵌入式tomcat异常

    今天在搭建Eureka的时候,死活都跑不起来!一直提示 Unable to start web server; nested exception is org.springframework.boot ...

  3. 浅析Tomcat结构以及自定义嵌入式Tomcat

    浅析Tomcat结构以及自定义嵌入式Tomcat TOMCAT结构 <Server port="8005" shutdown="SHUTDOWN"> ...

  4. tomcat服务器配置文件虚拟路径,tomcat中如何配置虚拟路径

    第一步:打开server.xml配置文件.在Host节点里写上该行代码: 如下图: 它的作用是只要路径以/upload开头它就会自动的匹配到E盘的upload文件夹下 数据库的存放路径就是上面红色的方 ...

  5. tomcat服务器运行环境,win7怎么配置Tomcat服务器环境|win7系统配置Tomcat服务器环境的方法...

    ‍‍ 许多用户询问说win7旗舰版系统怎么配置Tomcat服务器环境?tomcat是什么?它一款轻量级免费开源的Web服务器,我们再使用tomcat时,最好配置一下环境变量.很多新手用户不知道怎么配置 ...

  6. tomcat服务器的安装、tomcat的目录介绍、如何启动tomcat

    tomcat服务器的安装 找到需要的Tomcat版本对应的zip压缩包,解压到需要安装的目录即可 tomcat的目录介绍 bin        专门用来存放tomcat服务器的可执行程序 conf  ...

  7. Android服务器——TomCat服务器的搭建 配置TomCat环境变量

    Android服务器--TomCat服务器的搭建 作为一个开发人员,当然是需要自己调试一些程序的,这个时候本地的服务器就十分方便了,一般都会使用TomCat或者IIS服务器,IIS就比较简单了,其实t ...

  8. tomcat配置重定向_在Tomcat上配置SSL以及从HTTP到HTTPS的设置自动重定向的步骤

    tomcat配置重定向 Secured Socket Layer (SSL) is the cryptography protocol to provide message security over ...

  9. 上下位机通讯协议_嵌入式中自定义协议的一些典型例子

    关于自定义协议,对于会的人很简单,对于不会的人就摸不着头脑.下面分享一些关于自定义协议的笔记. 什么是协议? 协议这个概念我觉得挺杂的.就像嵌入式的概念一样,说法不一,比如大家常常争论FPGA是不是嵌 ...

最新文章

  1. feign调用多个服务_Spring Cloud多个微服务之间调用代码实例
  2. Spring读书笔记——bean创建(下)
  3. 数据库服务器查询格式化显示,在数据库服务器端养成设置NLS_LANG和NLS_DATE_FORMAT环境变量的习惯...
  4. 重新同步多线程集成测试
  5. 计算机仿真技术-基于matlab的电子信息类课程课后答案,计算机仿真技术:基于MATLAB的电子信息类课程(第4版)...
  6. java绘制图形代码_ImagePy_Learn | 图形学绘制代码学习:core\draw\polygonfill.py
  7. Qt文档阅读笔记-Multicast Receiver Example与Multicast Sender Example解析
  8. 使用“/proc”系统调试多线程程序挂死的问题:
  9. 视频服务器读取hdfs文件,基于HDFS的流媒体服务器Red5视频文件分发的研究与应用...
  10. LeetCode 688. “马”在棋盘上的概率
  11. android跳转到地图app
  12. 新建linux efi分区,EFI系统分区是什么?单独创建EFI分区的图文教程
  13. PDF.JS PDF文件预览插件
  14. URAL1389. Roadworks(dp)
  15. 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注
  16. NESSUS 安装 6.12 及使用
  17. https证书申请流程和简介
  18. Tsi721芯片驱动代码使用说明
  19. 智能家居之红外遥控---手机万能红外遥控器
  20. (2/3) c++ 集成 使用 steam api steam sdk

热门文章

  1. python--从入门到实践--chapter 11 代码测试unittest
  2. 服务器select与gevent
  3. android aop 权限检查,AOP简单拦截实现验证权限功能
  4. mysql行列转置-图文详解
  5. 知识图谱入门知识(五)【转】秒懂词向量Word2Vec的本质
  6. 互联网(IT)大厂面试技巧(面经)
  7. RACSignal的Subscription深入分析
  8. Intel PAUSE指令变化影响到MySQL的性能,该如何解决?
  9. 仅使用numpy从头开始实现神经网络,包括反向传播公式推导过程
  10. Android官方开发文档Training系列课程中文版:Activity测试之测试环境配置