Java-Tomcat Servlet内存马

是应用(java)服务器,它只是一个容器,是的扩展,但它是独立运行的。.javaxml本地没有,所以加了个依赖,可能是版本不对在调试时可能会有一丢丢代码不匹配的问题,但不影响正常流程来就需要添加-了(对应web.xml中所有配置的-,通过.

服务器是一个免费的开放源代码的Web 应用服务器,是 软件基金会( )的 项目中的一个核心项目,它早期的名称为,后来由、Sun 和其他一些公司及个人共同开发而成java中xml怎么提示,并更名为。 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选,因为 技术先进、性能稳定,成为目前比较流行的Web 应用服务器。是应用(java)服务器,它只是一个容器,是的扩展,但它是独立运行的。

从宏观上来看,其实是Web服务器和容器的结合体。

Web服务器:通俗来讲就是将某台主机的资源文件映射成URL供给外界访问。(比如访问某台电脑上的图片文件)Servlet容器:顾名思义就是存放Servlet对象的东西,Servlet主要作用是处理URL请求。(接受请求、处理请求、响应请求)

接口一共有五个类分别是init(对象初始化时调用)、(获取web.xml中对应的init-param属性)、(每次处理新的请求时调用)、(返回的配置信息,可自定义实现)、(结束时调用):

public interface  Servlet  {     void  init(ServletConfig var1)  throws  ServletException;    ServletConfig  getServletConfig();    void  service(ServletRequest var1,  ServletResponse var2)  throws  ServletException,  IOException;    String  getServletInfo();    void  destroy();}

.java

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 class  Servlet  extends  HttpServlet  {     @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         resp.getWriter().write("Hello,Sentiment!");    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {         doGet(req, resp);    }}

web.xml

    hello    memoryshell.Servlet    hello    /hello

访问/hello

生成

本地没有,所以加了个依赖,可能是版本不对在调试时可能会有一丢丢代码不匹配的问题,但不影响正常流程

依赖

    org.apache.tomcat    tomcat-catalina    9.0.19

整个栈在调用了 ​#()​ ​ 读取 ​ ​web.xml​ ​

然后根据 web.xml 配置 调用了 ​ ​()​ ​

if (this.ok) {     this.configureContext(webXml);}

跟进 ​ ​()​ ​ 前边依次读取了 、的配置及其映射,我们直接看后边的 部分:

首先通过 ​ ​#()​ ​ ,创建对象

(包装器):代表一个 ,它负责管理一个 ,包括的 的装载、初始化、执行以及资源回收。 是最底层的容器,它没有子容器了,所以调用它的 将会报错。

public  Wrapper  createWrapper()  { 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后注入成功

原文

本文到此结束,希望对大家有所帮助。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至81118366@qq.com举报,一经查实,本站将立刻删除。发布者:简知小编,转载请注明出处:https://www.jianzixun.com/93493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

相关推荐

软文友链广告合作联系站长qq81118366