前言
最近再看Java反序列化的东西,都是摸索着前进,碰见问题解决问题,遇到什么就看什么。有了前面cc链条的基础,还是比较容易理解的。
tomcat简介
servlet
是一种处理请求和发送响应的程序,Servlet是为了解决实现动态页面而衍生的东西
tomcat和servlet的关系
Tomcat是Web应用服务器,是一个Servlet/JSP容器。
Tomcat将http请求文本接收并解析,然后封装成HttpServletRequest类型的request对象,所有的HTTP头数据可都以通过request对象调用对应的方法查询到。
Tomcat同时会将响应的信息封装为HttpServletResponse类型的response对象,通过设置response属性就可以控制要输出到浏览器的内容,然后将response交给tomcat,tomcat就会将其变成响应文本的格式发送给浏览器。
Servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。
Filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter无法产生一个请求或者响应,它只能针对某一资源的请求或者响应进行修改。
Listener:通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。
Container – 容器组件
Tomcat中的 Container 用于封装和管理 Servlet ,以及具体处理Request请,在Connector内部包含了4个子容器:
Engine,实现类为 org.apache.catalina.core.StandardEngine
Host,实现类为 org.apache.catalina.core.StandardHost
Context,实现类为 org.apache.catalina.core.StandardContext
Wrapper,实现类为 org.apache.catalina.core.StandardWrapper
这四个字容器实际上是自上向下的包含关系
Engine:最顶层容器组件,其下可以包含多个 Host。
Host:一个 Host 代表一个虚拟主机,其下可以包含多个 Context。
Context:一个 Context 代表一个 Web 应用,其下可以包含多个 Wrapper。
Wrapper:一个 Wrapper 代表一个 Servlet。
也就是host是主机,context是web应用,wrapper是servlet
内存马类型
servlet-api类
filter型
servlet型
spring类
拦截器
controller型
Java Instrumentation类
agent型
本文只直记录一下filter型的学习历程。
一个http请求会先经过filter,然后再到servlet,那么我们可以动态创建一个filter并将其放到最前面,当我们最前面filter的恶意代码执行,也就形成了一个内存webshell。
Tomcat Filter 流程分析
首先创建一个javaWeb项目,再把tomcat/lib/catalina.jar和tomcat/lib/servlet-api.jar添加到项目中,创建一个demo文件。如果不会的化可以参考这篇文章
demo
package filter;
import javax.servlet.*;
import java.io.IOException;
public class filterDemo implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter 初始化创建");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行过滤操作");
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {}
}
再把我访问的路径添加到web.xml中,在web.xml中注册我们的filter,这里我们设置url-pattern为 /demo 即访问 /demo 才会触发
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>filterDemo</filter-name>
<filter-class>filter.filterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>filterDemo</filter-name>
<url-pattern>/demo</url-pattern>
&l