序言
在平时学习过程和之前护网时候一直都有听到内存马相关的事情,只知道云云,这次来详细学习一下。
Tomcat 与 Servlet
Tomcat是Web服务器,是一个Servlet容器,能够将用户的请求发送给Servlet,并且将Servlet的响应返回给用户。Tomcat有4种类型的Servlet容器,分别如下
1 | 1. Engine,实现类为 org.apache.catalina.core.StandardEngine。最顶层容器的组件,可包含多个Host |
每个Wrapper实例都表示一个具体的Servlet定义,StandardWrapper主要任务就是载入Servlet类并且实例化.
在Tomcat中,每个Host下都可以有很多Context(Host的子容器),而每个Context又都可以表示一个具体的Web应用,在一个Context中可以有多个Wrapper.
Wrapper主要就是负责管理Servlet,包括Servlet的装载、初始化、执行以及资源回收等操作。
Filter内存马
Tomcat内存马主要有三种:Filter型、Servlet型、Listener型
本文围绕Filter型展开描述
Filter过滤器可根据自定义来达到用户的一些请求拦截和修改等操作
参考链接:https://paper.seebug.org/1441/#1jsp-webshell
可以发现请求是先经过filter过滤器处理后才到达servlet,那么如果动态创建一个filter,放置恶意代码就能达到注入webshell的目的。
而针对同一目标的多个Filter组成一个Filter链。
注册Filter
自定义一个filter
创建路由
添加web.xml
当去访问/filter时候触发了doFilter
根据输出的可以看出是Filter先收到请求,然后转发给Servlet,再转回给Filter做doFilter
ServletContext
javax.servlet.ServletContext规定了一个ServletContext接口,它提供了Web应用所有的Servlet视图,可以通过它对Web应用进行资源访问。在Web容器启动时,会为每个Web应用创建一个ServletContext,代表着当前Web应用,并且被所有客户端共享。
可通过如下两种方法获得ServletContext
实际上ServletContext创建的对象是ApplicationContextFacade,也就是说它是ApplicationContextFacade的一个封装。
Filter链分析
先将tomcat导入IDEA,便于调试
在doFilter中插入webshell,就能动态的执行命令
1 | public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { |
每执行一次,doFilter都工作一次
过滤器中下断点
进入到 ApplicationFilterChain#doFilter()
这里会用getFilter从filterConfig获取一个Filter对象,然后对这个对象进行doFilter调用
我们根据调用栈来回溯分析
org.apache.catalina.core.StandardWrapperValve#invoke调用了doFilter
往上看filterChain是通过createFilterChain创建的一条过滤链
跟进createFilterChain
会利用context.findFilterMaps() 来返回一个FilterMap数组
再往下会遍历FilterMap,判断URL匹配和context中是否存在filter实例,若实例存在则会利用addFilter方法添加到filterChain中
那么filter的实例存储在什么地方呢?
其实filter内存马的注入过程与web.xml的配置信息是一一相关的
filterDefs存放filter的定义,对应web.xml的如下
filterConfigs存放了filterDefs和filter对象信息,保存着当前生命周期的context对象
filterMaps则对应web.xml中的urlpattern
综上所述,我们要实现filter内存马需要经过如下步骤:
1 | 1.创建恶意filter |
这样我们每次请求时CreateFilterChain都会创建一个新的Filter过滤链,在tomcat本生命周期内StandardContext就能一直保存,即内存马驻留。
Filter内存马实现
根据上述的思路步骤,可以利用反射来动态创建恶意filter并打入filterDefs和filterConfigs
1 | package com.example.Filter; |
成功注入Filter马后,在任意路由都可传参执行命令
jsp文件:
1 | <%@ page import="org.apache.catalina.core.ApplicationContext" %> |
结尾
java博大精深
参考文章
https://www.cnblogs.com/nice0e3/p/14622879.html#filter%E9%93%BE%E5%88%86%E6%9E%90