写在前面
这篇也是在Tomcat容器上面构造的内存马(收回之前说的不搞Tomcat了),这是建立在Tomcat的管道上面做文章的一个内存马的实现方式。这是内存马系列的第十一篇文章了。
前置
什么是Pipeline-Valve管道?
根据前面Tomcat架构的相关知识,我们是知道对于Tomcat中的Container层有四个容器:
Engine
Host
Context
Wrapper
四个容器的具体实现为。
四个容器中都包含有自己的管道对象,管道对象用来存放若干阀门对象。Tomcat为其分别制定了一个默认的基础阀门。
四个基础阀门放在各自容器管道的最后一位,用于查找下一级容器的管道在每个容器对象里面都有一个pipeline及valve模块。
在上层容器的管道的BaseValue 中会调用下层容器的管道。
对于Pipeline
处理的流程图如下:
流程分析
Container 中的Pipeline 在抽象实现类ContainerBase 中定义。
而对于上面提到的标准valve实现,他们都继承了ContainerBase
类,共同维护了同一个Pipeline对象
并且分别通过调用startInternal
/stopInternal
/destroyInternal
等方法调用相应的生命周期。
而又因为四个组件都是继承ContainerBase
,所以,每个组件在执行生命周期的同时也会调用对