百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

嵌入式 Tomcat AJP 协议对 SpringBoot 应用的影响

toyiye 2024-06-21 12:33 11 浏览 0 评论

前言

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 组件。

<dependency>
    <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.1.5.RELEASE</version>
  <scope>compile</scope>
</dependency>

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

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>9.0.19</version>
    <scope>compile</scope>
    <exclusions>
      <exclusion>
        <artifactId>tomcat-annotations-api</artifactId>
        <groupId>org.apache.tomcat</groupId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-el</artifactId>
    <version>9.0.19</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-websocket</artifactId>
    <version>9.0.19</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

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

SpringBoot 对 AJP 协议的支持

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

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

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

@Configuration
public 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_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path

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

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

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码