Listener
0x01 Listener First Shoot
引入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>创建监听器
对应Application、Session 和 Request 三大对象
监听器有三种: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?