深入浅出:servlet内存马代码分析

💡 原文中文,约7300字,阅读约需18分钟。
📝

内容提要

内存马是一种恶意代码,通过在内存中写入后门和木马,达到无文件控制Web服务器的目的。文章介绍了servlet内存马的原理和Tomcat的工作流程。通过解析web.xml文件和反射修改loadOnStartup的值,可以在内存中注入恶意木马。文章还提供了环境搭建和内存马的构造方法。最后,文章强调了内存马的渗透测试和网络安全重要性。

🔎

延伸解读

内存马为何能绕过传统检测

文章指出,传统文件型webshell需要将文件写入磁盘,而现有防御措施对文件型的检出率已超过90%,终端文件监控、流量监控和禁止外联等手段都能有效发现。内存马则不同,它不依赖文件持久化,而是将后门直接写入内存,因此没有文件落地,传统基于文件扫描的防护难以察觉。这种无文件特性使得内存马成为渗透测试中绕过安全防护的一种手段,也提醒防御方需要关注内存层面的异常行为。

Tomcat容器结构与Servlet注册机制

文章介绍了Tomcat的Container分层架构:Engine、Host、Context和Wrapper构成父子关系。其中Context代表一个Web应用,Wrapper代表一个Servlet。Servlet的注册依赖于web.xml解析,Tomcat通过configureContext方法创建Wrapper对象,设置loadOnStartup、servletName、servletClass等属性,然后调用context.addChild(wrapper)将其加入Context,并添加URL映射。理解这一流程是

反射修改loadOnStartup的关键作用

文章强调,Tomcat对Servlet采用懒加载机制,默认loadOnStartup值为-1,意味着Servlet不会在服务器启动时自动加载。攻击者注入的内存马没有在web.xml中配置,因此初始不会被加载。但通过反射可以修改loadOnStartup的值为1,强制容器在启动时加载该Servlet。这一步骤是内存马能否生效的关键,也说明反射机制在内存马构造中扮演了重要角色。防御方可以监控反射调用或异常修改loadOnStartup的行为。

从代码示例看内存马构造步骤

文章给出了内存马构造的具体代码:首先在doGet方法中实现恶意操作,如执行系统命令;然后通过request.getServletContext()逐层获取StandardContext,或利用反射直接从request中获取;接着创建Wrapper对象,设置名称、Servlet类,并通过反射将loadOnStartup设为1,实例化恶意Servlet;最后调用context.addChild(wrapper)和addServletMappingDecoded注册URL映射。整个过程模拟了Tomcat解析web.xml

❓

Q&A

内存马是什么?

内存马是一种恶意代码,通过在内存中写入后门和木马,实现无文件控制Web服务器的目的。

为什么内存马比传统webshell更难被发现?

内存马可以绕过现有的安全防护措施,传统的webshell容易被文件监控等手段发现。

Servlet在内存马攻击中起什么作用?

Servlet用于处理客户端请求,通过控制Servlet的创建,可以在内存中注入恶意木马。

如何通过web.xml文件注入恶意木马?

可以通过解析web.xml文件,配置Servlet的映射和初始化参数,从而注入恶意木马。

Tomcat的工作流程是怎样的?

Tomcat通过Connector接收请求,封装后交给Container处理,Container再将响应返回给Connector。

内存马的构造方法有哪些?

内存马的构造涉及在doGet方法中实现恶意代码,并通过反射修改loadOnStartup的值。

🏷️

标签

➡️

继续阅读