Java内存马——Controller型的三种注入

💡 原文中文,约39600字,阅读约需95分钟。
📝

内容提要

攻击者通过获取Spring ApplicationContext来注入恶意Controller,常见方法包括动态注册Bean和修改MappingRegistry。动态注册通过创建恶意Controller类并注册BeanDefinition实现,稳定可靠;而修改MappingRegistry则直接操作内部结构,隐蔽性强但依赖实现。父子容器机制可避开父容器管理,增强隐蔽性。防御措施包括监控动态注册和请求映射,强化容器安全。

🎯

关键要点

  • 攻击者必须先获取Spring ApplicationContext对象才能进行注入。
  • 动态注册Bean是推荐的注入方式,通过注册恶意Controller实现稳定可靠的注入。
  • 修改MappingRegistry直接操作内部结构,隐蔽性强但依赖实现,兼容性差。
  • 父子容器机制可避开父容器管理,增强隐蔽性。
  • 防御措施包括监控动态注册和请求映射,强化容器安全。
  • 动态注册Bean的步骤包括创建恶意Controller类、生成BeanDefinition、注册Bean和触发映射注册。
  • 修改MappingRegistry的步骤包括获取MappingRegistry、创建恶意HandlerMethod和注入MappingRegistry。
  • 内存马存活的关键在于防止GC回收,需保持Controller实例的引用。
  • 路径伪装和参数隐蔽是降低怀疑的有效手段。
  • 监控Bean动态注册和MappingRegistry变化是有效的防御策略。
  • 强化容器安全措施包括禁止非信任来源的动态类加载和使用SecurityManager限制反射操作。
  • 代码审计可以帮助发现潜在的漏洞点,阻断注入入口。
  • 父子容器注入技术利用Spring MVC的容器架构特性,隐蔽性强且持久性好。
  • 动态路径生成和自毁机制可以增强恶意代码的隐蔽性和生存能力。
  • 容器完整性检查和类加载监控是防御措施的重要组成部分。

延伸问答

攻击者如何获取Spring ApplicationContext对象?

攻击者可以通过WebApplicationContextUtils工具类、已知Bean或当前线程的ContextClassLoader来获取Spring ApplicationContext对象。

动态注册Bean的步骤是什么?

动态注册Bean的步骤包括创建恶意Controller类、生成BeanDefinition、注册Bean和触发映射注册。

修改MappingRegistry的注入方式有什么优缺点?

优点是完全内存化且隐蔽性强,缺点是严重依赖Spring内部实现,兼容性差,且需要自行维护Controller实例的生命周期。

父子容器机制如何增强隐蔽性?

父子容器机制可以将恶意Controller注册到子容器中,避开父容器的管理,从而增强隐蔽性。

有哪些防御措施可以监控动态注册和请求映射?

防御措施包括监控Bean动态注册、扫描MappingRegistry变化、强化容器安全和进行代码审计。

内存马存活的关键是什么?

内存马存活的关键在于防止GC回收,必须保持Controller实例的引用。

➡️

继续阅读