0x01 什么是Listener内存马
什么是Listener
和 Filter 一样,监听器是 JavaWeb 三大组件之一。它是一个实现特定接口的java程序,这个程序用于监听web应用中的一些对象,信息的创建,添加,销毁等,然后针对于这些情况做出相应处理。总结来说,就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。
Listener的三大域对象
监听器有三个域对象,指的是在监听器中可以访问的特定范围内的数据对象。分别为
ServletContext域对象——用于在整个 Java Web 应用程序中共享数据、资源和配置信息。
ServletRequest域对象——用于在一次 HTTP 请求处理期间共享数据和信息。
HttpSession域对象——用于在用户会话期间存储和共享数据,跨足够长的时间间隔保持信息状态。
根据不同域对象的功能,很明显 ServletRequest 类型是适合注入内存马的,我们注入一个有恶意代码的ServletRequest类型的监听器,当有HTTP请求处理时,注入的监听器就会发挥作用,执行恶意代码,这就是Listener内存马。
0x02 代码实现
创建一个ServletRequest类型的监听器,继承 ServletRequestListener 接口,需要重写requestInitialized方法,和过滤器的doFilter方法一样,requestInitialized方法也是处理监听器业务的方法。
package Listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; public class MyListener implements ServletRequestListener { @Override public void requestInitialized(ServletRequestEvent sre){ System.out.println("Listener被执行"); } } |
代码很短,只用作测试,同时需要修改 web.xml 配置文件。
<listener> <listener-class>Listener.MyListener</listener-class> </listener> |
启动服务器。