内存马学习笔记(二)
severlet内存马
还是那两句话
Servlet、Listener、Filter 由 javax.servlet.ServletContext
去加载
Servlet 3.0 API 允许使 ServletContext 用动态进行注册
先分析流程
createstandard context=StandardEngine[Catalina].StandardHost[localhost].StandardContext[/tomcat_war]
catalina 就是Tomcat服务器使用的 Apache实现的servlet容器的 名字。
Tomcat的核心分为3个部分:
(1)Web容器—处理静态页面; (2)catalina — 一个servlet容器—–处理servlet; (3)还有就是JSP容器,它就是把jsp页面翻译成一般的servlet。
对于tomcat的目录来说,
webapps目录
对应的就是Host
组件,下面的cas
和manager
等一个个webapp对应的就是Context
组件,Wrapper 就是容器内的 Servlet了
接着根据hostconfig类manageapp方法,通过 addchild,把Wrapper 装载到severlet
然后就是child.start(),然后一系列filter就进入了service方法
在servelet装载前 org.apache.catalina.core.StandardContext#startInternal()中表明了Tomcat启动加载的顺序:Listener -> Filter -> Servlet
同时也要注意这里的
loadOnStartup
,对于他我们需要满足一些条件
写exp
先创立一个恶意的servlet
1 | Servlet servlet = new Servlet() { |
servletcontext#addservlet被ApplicationContextFacade调用,根本是在ApplicationContext类实现
addservlet:
根据servletName获取wrapper,(这里的createwrapper是调用的standardcontext里的方法)通过addchild添加到context里面,并添加一些信息,返回ApplicationServletRegistration
可以通过如下代码实现:
1 | StandardContext servletContext = (StandardContext)req.getSession().getServletContext(); |
正常时wrapper装载到context,而我们是把当前context装载到mywrapper
但是现在的wrapper并不在 StandardContext 的 children 里面,可以通过 StandardContext#addChild
把它加到 StandardContext 的 children 当中。
addchild中除了把wrapper添加进去,还进行了遍历,添加
servletMappings
可以通过如下代码实现:
1 | servletContext.addChild(myWrapper); |
最终版本:
1 | import org.apache.catalina.Wrapper; |