Tomcat内存马回显问题,Listener原理分析中反射总结如何解决?

摘要:代码审计 | Listener —— Tomcat 内存马 回显问题 反射总结 目录 前置:StandardContext 回顾 ApplicationEventDispatcher ServletRequestListener 示例(静态
代码审计 | Listener —— Tomcat 内存马 回显问题 反射总结 目录 前置:StandardContext 回顾 ApplicationEventDispatcher ServletRequestListener 示例(静态注册) web.xml 中注册 Listener 的标准写法 动态注入 Payload(无回显版) Listener 与 Filter/Servlet 的差异对比 回显问题:为什么 Listener 不能直接回显? 解决回显:反射硬拿 Response 其他常见 Listener 接口简介 反射补充:六大核心能力 总结 前置:StandardContext 回顾 Listener 型内存马的注入原理,依然依赖于 Tomcat 内部的 StandardContext。 对象 说明 StandardContext Tomcat 中代表一个 Web 应用的核心对象,里面存了 Filter、Servlet、Listener 等组件 可以用这个类比来理解三种组件的区别: Filter:像一个安检闸机,所有请求都过一遍 Servlet:像一个具体柜台,请求最终被它处理 Listener:像一个感应门铃,有人进门(请求开始)、出门(请求结束)、新顾客到店(Session 创建)……都会触发 Listener 就存在 StandardContext 的 applicationEventListeners 字段里,执行调度器是 ApplicationEventDispatcher,它负责从这个列表里取出 Listener 并调用。 ApplicationEventDispatcher ApplicationEventDispatcher 是 Tomcat 运行时自动调用的调度器。 只要把 Listener 实例放进 applicationEventListeners 列表,Tomcat 在处理每个请求时,ApplicationEventDispatcher 就会自动从列表里拿到你的 Listener 并调用它。 和 Filter 对比一下差异就很明显了: 动态注册 Filter:需要操作 FilterDef + FilterMap + FilterChain(重新创建),比较繁琐 动态注册 Listener:只操作一个列表,没有映射,没有链,简单得多 ServletRequestListener 示例(静态注册) 先看一个静态注册的 ServletRequestListener,理解它的工作机制。 作用是:每次 HTTP 请求进入 Tomcat 时,自动执行 requestInitialized 方法;请求结束时执行 requestDestroyed 方法。
阅读全文