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 方法。
