Listener

0x01 Listener First Shoot

  1. 引入servlet依赖

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
        <version>9.0.20</version>
    </dependency>
  2. 创建监听器

对应ApplicationSessionRequest 三大对象

监听器有三种:ServletContextListener、HttpSessionListener、ServletRequestListener

由于每次访问都会涉及Request对象的监听,ServletRequestListener监听器最适合作为内存马

这里以ServletRequestListener为例,自己定义的监听器需要实现这个接口。

  • 自定义监听器

    package listeners;
    
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    
    public class MyListener implements ServletRequestListener {
        public void requestDestroyed(ServletRequestEvent sre) {
            System.out.println("MyListener is destroyed");
        }
    
        public void requestInitialized(ServletRequestEvent sre) {
            System.out.println("MyListener is initializing");
        }
    }
  • 注册监听器(web.xml)

      <listener>
        <listener-class>listeners.MyListener</listener-class>
      </listener>

随便发起一次请求,发现控制台有打印

0x02 Create Listener Memory Shell

既然要注入Listener型内存马,我们就得思考Listener是怎么被注册到服务的。

我们是在web.xml配置文件中注册的监听器,因此程序肯定首先会读取web.xml这个文件解析里面的内容。在启动应用的时候,ContextConfig类会去读取配置文件

org.apache.catalina.startup.ContextConfig#configureContext传入了webxml参数

org.apache.catalina.Context#addApplicationListener是一个接口,查看其实现类StandardContext

通过StandardContext#addApplicationEventListener将我们构造的Listener放进去

0x03 POC

Last updated

Was this helpful?