赞
踩
tomcat其实质上就是一个大点的servlet容器,那什么是容器呢,我觉得其实就是一个类。在tomcat中各个容器之间嵌套。而这些容器都是有生命周期的java类,都继承了共同的接口Lifecycle,所以Lifecycle就是这些容器的顶层接口。下面来谈谈存在哪些容器。
这些容器全都是从上到下嵌套,需要注意的是这些容器虽然存在父子关系,但是它们的java类并没有父子。
/** * Add a child Container, only if the proposed child is an implementation * of Context. * * @param child Child container to be added */ @Override public void addChild(Container child) { child.addLifecycleListener(new MemoryLeakTrackingListener()); if (!(child instanceof Context))//这里说明Host容器的子容器只能是Context容器 throw new IllegalArgumentException (sm.getString("standardHost.notContext")); super.addChild(child); }
一个Host容器中可以有多个Wrapper容器。
/** * Add a child Container, only if the proposed child is an implementation * of Wrapper. * * @param child Child container to be added * * @exception IllegalArgumentException if the proposed container is * not an implementation of Wrapper */ @Override public void addChild(Container child) { // Global JspServlet Wrapper oldJspServlet = null; if (!(child instanceof Wrapper)) { //这里说明Context容器的子容器只能是Wrapper容器。 throw new IllegalArgumentException (sm.getString("standardContext.notWrapper")); } //这里删除了部分代码 }
在Tomcat中我们对Servlet进行访问的时候会先通过Filter,如下图所示。
因此我们只要中Filter中插入恶意代码,就可以进行命令执行,形成一个内存马。
Filter:自定义Filter的实现,需要实现javax.servlet.Filter下的init()、doFilter()、destroy()三个方法。
在tomcat中ServletContext的实现是ApplicationContext。在Web应用中,获取的ServletContext实际上是ApplicationContextFacade的对象,对ApplicationContext进行了封装,而ApplicationContext实例中又包含了StandardContext实例,。
我们自己写一个Filter然后下断点,然后跟进createFilterChain。
filterChain.setServlet(servlet); filterChain.setSupport(((StandardWrapper)wrapper).getInstanceSupport()); StandardContext context = (StandardContext)wrapper.getParent(); FilterMap[] filterMaps = context.findFilterMaps(); if (filterMaps != null && filterMaps.length != 0) { String servletName = wrapper.getName(); int i; ApplicationFilterConfig filterConfig; boolean isCometFilter; for(i = 0; i < filterMaps.length; ++i) { if (this.matchDispatcher(filterMaps[i], dispatcher) && this.matchFiltersURL(filterMaps[i], requestPath)) { filterConfig = (ApplicationFilterConfig)context.findFilterConfig(filterMaps[i].getFilterName()); if (filterConfig != null) { isCometFilter = false; if (comet) { try { isCometFilter = filterConfig.getFilter() instanceof CometFilter; } catch (Exception var18) { Throwable t = ExceptionUtils.unwrapInvocationTargetException(var18); ExceptionUtils.handleThrowable(t);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。