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

2022-01-20 16:15:37 浏览数 (1)

目录:

一、实际环境中无法获取到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

0 人点赞