valve型内存马非常直接,就是写个valve然后加到pipeline里。
在了解 Valve 之前,我们先来简单了解一下 Tomcat 中的管道机制。
我们知道,当 Tomcat 接收到客户端请求时,首先会使用
Connector进行解析,然后发送到Container进行处理。那么我们的消息又是怎么在四类子容器中层层传递,最终送到 Servlet 进行处理的呢?这里涉及到的机制就是 Tomcat 管道机制。管道机制主要涉及到两个名词,Pipeline(管道)和 Valve(阀门)。如果我们把请求比作管道(Pipeline)中流动的水,那么阀门(Valve)就可以用来在管道中实现各种功能,如控制流速等。
因此通过管道机制,我们能按照需求,给在不同子容器中流通的请求添加各种不同的业务逻辑,并提前在不同子容器中完成相应的逻辑操作。个人理解就是管道与阀门的这种模式,我们可以通过调整阀门,来实现不同的业务。
valve型内存马和之前的内存马都不一样,他不是在web应用里配置的(web.xml),而是在tomcat里配置的(server.xml)
自定义valve得打包成jar之后加到 Tomcat 的 classpath 里。
Pipeline 提供了 addValve 方法,可以添加新 Valve 在 basic 之前,并按照添加顺序执行。

StandardContext继承了ContainerBase,ContainerBase有一个getPipeline方法可以获取pipeline

所以可以:
- 获取
StandardContext- 编写恶意 Valve
- 通过
StandardContext.getPipeline().addValve()添加恶意 Valve
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |