Java-Tomcat Servlet内存马

服务器是一个免费的开放源代码的Web 应用服务器 , 是 软件基金会()的 项目中的一个核心项目 , 它早期的名称为,后来由、Sun 和其他一些公司及个人共同开发而成java中xml怎么提示,并更名为 。是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首?。?蛭?技术先进、性能稳定 , 成为目前比较流行的Web 应用服务器 。是应用(java)服务器,它只是一个容器,是的扩展,但它是独立运行的 。
从宏观上来看,其实是Web服务器和容器的结合体 。
Web服务器:通俗来讲就是将某台主机的资源文件映射成URL供给外界访问 。(比如访问某台电脑上的图片文件)Servlet容器:顾名思义就是存放Servlet对象的东西,Servlet主要作用是处理URL请求 。(接受请求、处理请求、响应请求)
接口一共有五个类分别是init(对象初始化时调用)、(获取web.xml中对应的init-param属性)、(每次处理新的请求时调用)、(返回的配置信息 , 可自定义实现)、(结束时调用):
public interfaceServlet{voidinit(ServletConfig var1)throwsServletException;ServletConfiggetServletConfig();voidservice(ServletRequest var1,ServletResponse var2)throwsServletException,IOException;StringgetServletInfo();voiddestroy();}
.java
【Java-Tomcat Servlet内存马】package memoryshell;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public classServletextendsHttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("Hello,Sentiment!");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}}
web.xml
hellomemoryshell.Servlethello/hello
访问/hello
生成
本地没有,所以加了个依赖 , 可能是版本不对在调试时可能会有一丢丢代码不匹配的问题,但不影响正常流程
依赖
org.apache.tomcattomcat-catalina9.0.19
整个栈在调用了 ?#()? ? 读取 ? ?web.xml? ?
然后根据 web.xml 配置 调用了 ? ?()? ?
if (this.ok) {this.configureContext(webXml);}
跟进 ? ?()? ? 前边依次读取了 、的配置及其映射,我们直接看后边的部分:
首先通过 ? ?#()? ? ,创建对象
(包装器):代表一个  , 它负责管理一个,包括的的装载、初始化、执行以及资源回收 。是最底层的容器,它没有子容器了,所以调用它的将会报错 。
publicWrappercreateWrapper(){ Wrapper wrapper = null;if (wrapperClass != null) {try {wrapper = (Wrapper) wrapperClass.newInstance();} catch (Throwable t) {ExceptionUtils.handleThrowable(t);log.error("createWrapper", t);return (null);}} else {wrapper = new StandardWrapper();
接着设置了启动优先级,以及的Name 。
设置好优先级后就调用下边的 ? ?()? ?,配置了的Class 。
wrapper.setServletClass(servlet.getServletClass());
最后通过 ? ?()? ? 将创建并配置好的添加到中 。通过循环遍历所有地方完成了从配置到添加的全过程 , 接下来
来就需要添加-了(对应web.xml中的 ? ?? ? )
取出web.xml中所有配置的-,通过.oded()将url路径和类做映射 。(这里的/hello、hello就是我们在中设置的值)
通过 .() 创建对象;设置的的值;设置的 Name;设置对应的 Class;通过()将创建并配置好的添加到中通过oded()将 url 路径和类做映射 。加载
在 org...core.#() 下断点调试:
回溯到 ? ?#? ? 同样也是在处理完和后,处理,这也就体现了分析中提到的执行流程( ->-> )
首先调用了 ? ?()? ? ,将之前通过 ? ?()? ? 添加的所有传入 ? ?()? ? 中处理
跟进 ? ?()? ?,的值就是通过 ? ?this.()? ? 传入进来的
通过循环将中的值逐一赋给child,在赋值给中 , 之后有一段判断:
if (loadOnStartup >= 0) {Integer key = loadOnStartup;ArrayList list = (ArrayList)map.get(key);if (list == null) {list = new ArrayList();map.put(key, list);}list.add(wrapper);}
如果 >= 0,就会将追加到list中 , 但 默认值是-1,
在的配置当中即(web.xml),? ?1? ? 的含义是:
标记容器是否在启动的时候就加载这个 。
当值为0或者大于0时,表示容器在应用启动时就加载这个;
当是一个负数时或者没有指定时,则指示容器在该被选择时才加载 。
正数的值越小java中xml怎么提示 , 启动该的优先级越高 。? ?? ?
由于我们要注入内存码,且没有配置xml不会在应用启动时就加载这个,因此需要通过反射将值修改为1 , 将其追加到list中
之后通过load()进行加载,根据具体请求进行初始化、调用、销毁一系列操作
内存马
首先通过doGet方法实现恶意类

之后还是老办法获?。?

反射修改 ? ?? ?

最后将 URL 路径与恶意类做映射:

.jsp
Sentiment
访问.jsp后注入成功
原文
本文到此结束,希望对大家有所帮助 。