内存马简单了解(新手向)
内存马简单了解(新手向)
一、简述
1.1Webshell的技术历程
web服务器管理页面——> 大马——>小马拉大马——>一句话木马——>加密一句话木马——>加密内存马
1.2什么是内存马
内存马是一种无文件Webshell,简单来说就是服务器上不会存在需要链接的webshell脚本文件。内存马的原理就是在web组件或者应用程序中,注册一层访问路由,访问者通过这层路由,来执行我们控制器中的代码,一句话就能概括,那就是对访问路径映射及相关处理代码的动态注册。
1.3内存马的类型
根据内存马注入的方式,可以大致分为两种:
1.servlet-api型
通过命令执行等方式动态注册一个新的listener、filter或者servlet,从而实现命令执行等功能。特定框架、容器的内存马原理与此类似,如spring的controller内存马,tomcat的valve内存马
2.字节码增强型
通过java的instrumentation动态修改已有代码,从而实现命令执行等功能
二、前置知识
2.1 Servlet
2.1.1 什么是Servlet?
Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
2.1.2 请求的处理过程
客户端发起请求,Servlet容器收到请求并根据请求信息封装成HttpServletRequest和HttpServletResponse对象,再调用HttpServlet的init()方法(init方法只在第一次请求的时候被调用)
和service()方法。完成业务逻辑处理后返回给Servlet容器,然后给容器结果返回给客户端。
2.1.3 servlet的生命周期
-
服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)。
-
servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行
-
服务器关闭时,销毁这个servlet对象,执行destroy()方法。
-
由JVM进行垃圾回收。
2.2 Filter
2.2.1 什么是Filter?
filter也被称为过滤器,是对Servlet容器传给Web资源的request对象和response对象进行检查和修改,Filter 不是 Servlet,不能直接访问,它本身也不能生成 request 对象和 response 对象,它只能为 Web 资源提供过滤功能
2.2.2 处理过程
Web服务器根据Filter在web.xml文件的注册顺序,决定在调用哪个Filter,当第一个Filter的doFile方法被调用的时候,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
2.2.3 Filter的生命周期
- 初始化阶段
- 拦截和过滤阶段
- 销毁阶段
2.3 Listener
2.3.1 什么是Listener?
Listener监听器用于监听Web应用中的某些对象的创建、销毁、增加、修改、删除等动作的发生,然后做出响应的响应处理。当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计网站在线人数、系统加载时进行信息初始化、统计网站的访问量等等。
2.3.2 Listener的相关概念
事件:方法调用、属性改变、状态改变等。
事件源:被监听的对象( 例如:request、session、servletContext)。
监听器:用于监听事件源对象 ,事件源对象状态的变化都会触发监听器。
注册监听器:将监听器与事件源进行绑定
三、内存马的排查
可以利用Java agent技术遍历所有已经加载到内存的class,先判断哪些是内存马,是则内存查杀,首要要识别内存马的特征。
1、检测
- filter名字很特别
- web.xml没有filter配置
- 特殊的classloader加载,反序列化漏洞喜欢利用Templateslmpl和bcel执行任意代码
- 对应的classloader路径下没有class文件
- filter的doFile方法中有恶意代码(把内存中class dump出来,使用反编译工具分析,看是否存在恶意代码,比如调用了可疑的方法,invoke,defineclass等)
2、内存马查杀
-
清楚内存马中的filter的恶意代码
-
中间件注销filter
这两种方法各有优缺点,第一种方法比较通用,但恶意filter依然存在,只是恶意代码被清楚。第二种方法恶意filter会被清除,但是每种中间件的逻辑不同。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探