原理分析 | Interceptor —— SpringBoot 内存马
原理分析 | Interceptor —— SpringBoot 内存马目录前言Interceptor 是什么静态注册原理静态注册 Demo动态注册(内存马)JSP Payload验证总结前言还是利用上篇的环境,这篇写 Interceptor 内存马。Interceptor 和 Controller 内存马最大的区别在于:Controller 内存马注册了一个新路径/shell,只有访问这个路径才触发;Interceptor 内存马不产生新路径,塞进拦截器链之后,任意请求都会触发,隐蔽性更强。Interceptor 是什么Interceptor 类似 Filter 的拦截,功能上很像,都是拦截请求在业务逻辑前后做处理,但层级不同:请求进来 ↓ Filter(Tomcat层,最外层) ↓ DispatcherServlet ↓ Interceptor(Spring层,更靠近Controller) ↓ ControllerInterceptor 有三个方法:方法执行时机说明preHandleController 执行之前返回 false 就拦截,不往下走postHandleController 执行之后可以修改响应afterCompletion响应渲染完成后清理资源用内存马注入的是preHandle,请求一进来就执行命令。常见用途对比:FilterInterceptor鉴权登录校验✓✓日志记录✓✓跨域处理✓✓请求参数修改✓✗(太晚了)获取 Controller 信息✗✓(handler 参数)操作 ModelAndView✗✓(postHandle)实际开发中:Filter更多做通用处理,比如编码设置、跨域、IP 黑名单Interceptor更多做业务层面的拦截,比如登录校验、权限验证、接口耗时统计开发者写Filter只需写@WebFilter一个注解搞定,但Interceptor稍微麻烦一点,需要自己注册,下面先看正常的静态注册流程。静态注册原理静态注册的整体流程:WebConfig.addInterceptors(registry) ↓ registry.addInterceptor(evilInterceptor) ↓ Spring 内部把它塞进 adaptedInterceptors 这个 List ↓ 等待请求触发一、Spring 怎么知道要调addInterceptors()Spring 启动时会扫描所有实现了WebMvcConfigurer接口的类,然后自动调用接口里定义的所有方法。前提是类被 Spring 管理,必须有注解:有 @Configuration / @Component 注解 + 实现了 WebMvcConfigurer 接口 ↓ Spring 启动时才会扫描到并调用 addInterceptors()类比 Filt