目录:
一、实际环境中无法获取到StandardContext?
二、获取完localhost的StandardContext之后,无法获取准确的Servlet链接?
三、filterDef的加载出现了ClassNotFound的错误
在上一篇文章中我们讲到了tomcat6下的Filter内存马的注入:tomcat6下的Filter内存马注入,在这一篇文章我们将讲到tomcat6下Filter内存马注入的实际场景解决!
在IDEA的环境下可以了之后我们发现放到实际的tomcat环境中会出现如下问题。
01
实际环境中无法获取到StandardContext?
回头看tomcat678这个类,也就是参照bitterz师傅的Demo
在getStandardContext方法中,根据this.serverName是无法获取到StandardContext的,target->this$0中的children是只有localhost的,而此时的serverName的值却是实际环境的IP地址,这也就是为什么我们使用IDEA可以获取到StandardContext而在实际环境中却不行的原因。
那么我们需要做的就是在获取在获取完StandardContext之后进项一次是否为空的判断,如果为空,则取children中的localhost。
02
获取完localhost的StandardContext之后,无法获取准确的Servlet链接?
通过实际环境测试我们发现,我们获取的StandardContext总为tomcat的根,不是我们想要的具体的Servlet,我们发现在对StandardContext(localhost)的hashMap获取时,第一个键值对的键值总为null
这也就是为什么我们总会获取到根路径servlet的原因,所以在key值为null的情况下,我们直接进行下个HashMap的key值的对比,这样,便可以获取到非根路径servlet的StandardContext。
03
filterDef的加载出现了ClassNotFound的错误
在filterDef的加载过程中,我们发现,对应的filter类确实被载入了内存当中,但是,最后我们在调用StandardContext的addFilterDef的过程中却爆出了无法找到对应filter类的情况
追溯原因到ApplicationFilterConfig的构造方法处,接着看setFilterDef方法
可以看到当filterDef不为null的时候,调用getFilter方法,接着看该方法
在这里发现这里使用加载filterClass的类加载器并不是原来使用的当前线程上下文的类加载器
所以,需要将原来加载filterClass的类加载器改为当前环境上下文的类加载器即可。
参考链接:https://xz.aliyun.com/t/9914