vlambda博客
学习文章列表

tomcat6Filter内存马注入的实际场景解决

目录:

         一、实际环境中无法获取到StandardContext?

       二、获取完localhost的StandardContext之后,无法获取准确的Servlet链接?

         三、filterDef的加载出现了ClassNotFound的错误


    

        在上一篇文章中我们讲到了tomcat6下的Filter内存马的注入:,在这一篇文章我们将讲到tomcat6下Filter内存马注入的实际场景解决!

在IDEA的环境下可以了之后我们发现放到实际的tomcat环境中会出现如下问题。

01

实际环境中无法获取到StandardContext?

回头看tomcat678这个类,也就是参照bitterz师傅的Demo

tomcat6Filter内存马注入的实际场景解决
tomcat6Filter内存马注入的实际场景解决

那么我们需要做的就是在获取在获取完StandardContext之后进项一次是否为空的判断,如果为空,则取children中的localhost。

02

获取完localhost的StandardContext之后,无法获取准确的Servlet链接?

通过实际环境测试我们发现,我们获取的StandardContext总为tomcat的根,不是我们想要的具体的Servlet,我们发现在对StandardContext(localhost)的hashMap获取时,第一个键值对的键值总为null

tomcat6Filter内存马注入的实际场景解决
tomcat6Filter内存马注入的实际场景解决
tomcat6Filter内存马注入的实际场景解决

这也就是为什么我们总会获取到根路径servlet的原因,所以在key值为null的情况下,我们直接进行下个HashMap的key值的对比,这样,便可以获取到非根路径servlet的StandardContext。

tomcat6Filter内存马注入的实际场景解决

03

filterDef的加载出现了ClassNotFound的错误

在filterDef的加载过程中,我们发现,对应的filter类确实被载入了内存当中,但是,最后我们在调用StandardContext的addFilterDef的过程中却爆出了无法找到对应filter类的情况

tomcat6Filter内存马注入的实际场景解决

追溯原因到ApplicationFilterConfig的构造方法处,接着看setFilterDef方法

tomcat6Filter内存马注入的实际场景解决

可以看到当filterDef不为null的时候,调用getFilter方法,接着看该方法

tomcat6Filter内存马注入的实际场景解决

在这里发现这里使用加载filterClass的类加载器并不是原来使用的当前线程上下文的类加载器

tomcat6Filter内存马注入的实际场景解决

所以,需要将原来加载filterClass的类加载器改为当前环境上下文的类加载器即可。

参考链接:https://xz.aliyun.com/t/9914