Tomcat AJP协议包伪造

简介:
部署到Tomcat上的应用一般会搭配一个Apache,

从浏览器(或其他User Agent)发送的请求要经过两个协议才能转到Tomcat:

请求 => http协议 => Apache => ajp协议 => Tomcat

从这个处理链来看,ajp协议数据包只能由Apache生成,

用户不能通过浏览器(或其他User Agent)直接发送ajp协议数据包到Tomcat。

从Apache发送到Tomcat的ajp协议数据包主要有下面几种类型:
写道

类型代码 类型 说明
=================================================
2 Forward Request 从Apache转发过来的请求头
7 Shutdown 关闭Tomcat
10 CPing 心跳检测
没有 Data 从Apache转发过来的请求体

类型代码用1个字节表示,

Data类型没有类型代码,它的数据包的前两个字节表示包的长度,并且采用大端编码(BigEndian),

比如长度1792采用大端编码是0x0700,放到字节数组时,buf[0]=07, buf[1]=00

看到没有,如果长度等于1792,第一个字节buf[0]=07,也是Shutdown数据包的类型代码,

前面说了我们不能自己构造ajp协议数据包,

加上Forward Request和Data是一个整体,所以Data数据包一般情况不把它看成一条特殊指令,

不过奇迹总是可以发生的。

Tomcat是怎么处理ajp协议数据包的呢?

Shutdown 和CPing 不会有请求体,

所以Tomcat收到这两种类型的包后就马上处理了,然后返回响应,

Forward Request 可以有Data,比如POST请求就可以有,

但是呢,Tomcat采用的是延迟读入策略,比如说POST请求体中包含了一个表单参数name=myname

只有当你在servlet中显示调用request.getParameter(“name”)时Tomcat才读入表单数据包,

如果你什么都不做,这个表单数据包还在InputStream中没被读出来,

此时Tomcat认为这个Forward Request 已经处理完了,但是连接没有关闭,所以InputStream也没有关,

接着Tomcat继续处理下一个请求,这次它从InputStream中读出的是上次剩下的表单Data数据包,

当它取出这个数据包的第一个字节时,因为数据包长度的第一个字节可能是02、07、0A(10),

所以只要用心构造一个POST请求就能让Tomcat执行错误操作。

我们知道访问静态资源文件(比如html,jpg)是不会产生request.getParameter这样的调用的,

所以只要构造一个类似这样的请求就可以了:
 

这样一个请求理论上就能关掉Tomcat,

不过,Tomcat实际上忽略Shutdown数据包了(Jetty倒是实现了).

下面举两个例子:

 


 

*/

本文来源于"阿里中间件团队播客",原文发表时间"  2011-09-10"

相关文章
|
7月前
|
应用服务中间件 容器
从零手写实现 tomcat-07-war 如何解析处理三方的 war 包?
这是一个关于构建Web应用和理解类加载器的文章摘要。作者探讨了如何解析和处理WAR包,使用Netty权威指南系列(BIO, NIO, AIO)作为背景阅读。文章通过一个简单的Web项目实例,展示了项目的目录结构,包括`pom.xml`, `web.xml`和`IndexServlet`。作者还介绍了自定义的`WebAppClassLoader`,它扩展了`URLClassLoader`,用于根据类路径加载非当前项目类。最后提到了一个名为mini-cat的开源项目,它是简易版Tomcat实现,可在GitHub上找到。
|
7月前
|
XML 应用服务中间件 Apache
Tomcat AJP连接器配置secretRequired=“true“,但是属性secret确实空或者空字符串,这样的组合是无效的。
Tomcat AJP连接器配置secretRequired=“true“,但是属性secret确实空或者空字符串,这样的组合是无效的。
|
Java 应用服务中间件
idea tomcat 404 无法自动打开本地项目war包路径
idea tomcat 404 无法自动打开本地项目war包路径
105 0
|
Java 应用服务中间件 Maven
Tomcat部署SpringBoot war包
Tomcat部署SpringBoot war包
143 0
|
6月前
|
Ubuntu 前端开发 JavaScript
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
|
7月前
|
Java 应用服务中间件 容器
SpringBoot配置外部Tomcat并打war包
SpringBoot配置外部Tomcat并打war包
141 0
|
7月前
|
Java 应用服务中间件
SpringBoot 项目war包部署 配置外置tomcat方法
SpringBoot 项目war包部署 配置外置tomcat方法
133 0
|
6月前
|
Java 应用服务中间件 程序员
JavaWeb基础第四章(SpringBootWeb工程,HTTP协议与Web服务器-Tomcat)
JavaWeb基础第四章(SpringBootWeb工程,HTTP协议与Web服务器-Tomcat)
|
7月前
|
网络协议 Java 应用服务中间件
HTTP协议与Tomcat在IJ中配置
本文是对自己学习JavaWeb学习的笔记的总结,添加了一些自己的东西,然后进行一次复盘,并加深一下学习的理解和印象.其中内容主要包括对http协议的详细介绍,java常见服务器的初步介绍,以及IJ旧版和新版的tomcat服务器的配置图解教程
|
7月前
|
存储 Java 应用服务中间件
Springboot项目打war包部署到外置tomcat容器【详解版】
该文介绍了将Spring Boot应用改为war包并在外部Tomcat中部署的步骤:1) 修改pom.xml打包方式为war;2) 排除内置Tomcat依赖;3) 创建`ServletInitializer`类继承`SpringBootServletInitializer`;4) build部分需指定`finalName`;5) 使用`mvn clean package`打包,将war包放入外部Tomcat的webapps目录,通过startup脚本启动Tomcat并访问应用。注意,应用访问路径和静态资源引用需包含war包名。
454 0