最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

内存马简单了解(新手向)

来源:博客园

内存马简单了解(新手向)

一、简述

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的生命周期

  1. 服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始化方法init(ServletConfig conf)。

  2. servlet对象去处理所有客户端请求,在service(ServletRequest req,ServletResponse res)方法中执行

  3. 服务器关闭时,销毁这个servlet对象,执行destroy()方法。

  4. 由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的生命周期

  1. 初始化阶段
  2. 拦截和过滤阶段
  3. 销毁阶段

2.3 Listener

2.3.1 什么是Listener?

Listener监听器用于监听Web应用中的某些对象的创建、销毁、增加、修改、删除等动作的发生,然后做出响应的响应处理。当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计网站在线人数、系统加载时进行信息初始化、统计网站的访问量等等。

2.3.2 Listener的相关概念

事件:方法调用、属性改变、状态改变等。

事件源:被监听的对象( 例如:request、session、servletContext)。

监听器:用于监听事件源对象 ,事件源对象状态的变化都会触发监听器。

注册监听器:将监听器与事件源进行绑定

三、内存马的排查

可以利用Java agent技术遍历所有已经加载到内存的class,先判断哪些是内存马,是则内存查杀,首要要识别内存马的特征。

1、检测

  1. filter名字很特别
  2. web.xml没有filter配置
  3. 特殊的classloader加载,反序列化漏洞喜欢利用Templateslmpl和bcel执行任意代码
  4. 对应的classloader路径下没有class文件
  5. filter的doFile方法中有恶意代码(把内存中class dump出来,使用反编译工具分析,看是否存在恶意代码,比如调用了可疑的方法,invoke,defineclass等)

2、内存马查杀

  1. 清楚内存马中的filter的恶意代码

  2. 中间件注销filter

    这两种方法各有优缺点,第一种方法比较通用,但恶意filter依然存在,只是恶意代码被清楚。第二种方法恶意filter会被清除,但是每种中间件的逻辑不同。

关键词: