前言
Servlet内存马的最后一篇,和之前的分析其实差不太多,基础知识就不进行了,这篇文章就直接从加载开始说起,废话不多说直接开始吧。
一、Servlet流程分析
(一)StrandContext.startInternal方法
首先我们需要先了解一下Tomcat的加载流程,这里借用师傅的一张图。
![](https://i-blog.csdnimg.cn/blog_migrate/86c90e38099aa84d8ee28c73bec82d9b.png)
我们通过上图Tomcat的启动流程可以得知,首先我们启动到StandardHost就会去启动StrandContext,我们和之前内存马的分析一样,我们从Contextconfig类加载配置文件开始分析,我们打好断点,然后开始查看栈信息。
![](https://i-blog.csdnimg.cn/blog_migrate/1c21a60ba5cb21ee3c7ad9f913423fff.png)
跟进上图的栈信息,我们可以看到StandardHost之后就会走到StrandContext,我们跟到StrandContext进行查看。可以看到我们此时执行的是StandardContext. startInternal(),根据栈的信息,我们在this.fireLifecycleEvent 位置正在解析web.xml并启动StandardWrapper。我们继续往下看代码。
![](https://i-blog.csdnimg.cn/blog_migrate/fdf0cf5ee802a284ddf4eaa719a0e4fa.png)
startInternal()方法在最后依次调用了listenerStart、filterStart、loadOnStartup方法,我们跟到loadOnStartup方法进行查看。
![](https://i-blog.csdnimg.cn/blog_migrate/9d65526e1df27613f905c5156b6ab638.png)
这里我们首先对children进行了一个变量,大概猜测children应该是存储servlet的变量。接下来做了一个迭代,执行了wrapper.load()对其进行加载。我们这里其实就是我们加载wrapper的地方。
![](https://i-blog.csdnimg.cn/blog_migrate/710e4b1cf0c2cc760c7e792816374b1b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/64fe4c032e3016f46064c33b12aabfc0.png)
【一>所有资源获取<一】 1、网络安全学习路线 2、电子书籍(白帽子) 3、安全大厂内部视频 4、100份src文档 5、常见安全面试题 6、ctf大赛经典题目解析 7、全套工具包 8、应急响应笔记
(二)ContextConfig读取配置文件
到这里我们已经跟到了StandardContext加载Wrapper的位置,最关键的参数其实就是children,所以我们回到刚才ContextConfig的位置继续进行分析。首先ContextConfig读取web.xml配置文件,我们跟到configureContext()方法查看代码,首先读取到servlet后进行迭代。
![](https://i-blog.csdnimg.cn/blog_migrate/5f3bfa918d7b325753396596fe774232.png)
接下来执行createWrapper方法创建了一个wrapper。继续向下
![](https://i-blog.csdnimg.cn/blog_migrate/b191533aa7e2a3118664d071c8689400.png)
接下来设置了一个ServletName和ServletClass(这里其实对应的就是web.xml中的servlet),继续向下
![](https://i-blog.csdnimg.cn/blog_migrate/b1249a0ef0144b26664f05a7f4e3894c.png)
(三)addChild启动wrapper线程
读取到Servlet配置之后,执行了addChild(wrapper)方法,我们跟进addChild()方法进行查看。
![](https://i-blog.csdnimg.cn/blog_migrate/39de98a8f40dccd358b42c2b516f88be.png)
我们跳到了StandardContext.addChild(),其实servlet的添加就是在这里面进行的。我们继续跟进去简单看一下吧。
![](https://i-blog.csdnimg.cn/blog_migrate/ad21faf1d3704bf6e6297cc9257178d2.png)
我们走到了ContainerBase.addChild(),这个类其实是一个骨架类,这里我们需要注意两个位置,一个是我们将wrapper添加到了ContainerBase的children变量中,另一个是我们最后执行到了child.start(),我们继续向下查看。
![](https://i-blog.csdnimg.cn/blog_migrate/09ee4ff4c1032727a6b92a25dcd68ceb.png)
我们跳到了LifecycleBase,这个类主要是和Tomcat的生命周期有关,我们跟到this. startInternal()进行查看。
![](https://i-blog.csdnimg.cn/blog_migrate/24ec4b72a4d1f7a929c89f3f922bc227.png)
此时我们通过LifecycleBase走到了StandardWrapper.startInternal(),查看该方法其实这里本质就是调用父类的startInternal() 线程池启动。我们点击去稍微看一下super.startInternal()进行查看
![](https://i-blog.csdnimg.cn/blog_migrate/52a43e06f4f5345c2dbc89dddd205b6f.png)
我们又走到了ContainerBase.startInternal(),方法最后启动了线程。
![](https://i-blog.csdnimg.cn/blog_migrate/031bd938c7749c0794e969021bdd402c.png)
我们执行完addChild()方法后,我们回到了ContextConfig类,继续向下查看,可以看到此时执行了webxml.getServletMappings().entrySet().iterator(),其实这里的本质是就是读取servler-mapping。
![](https://i-blog.csdnimg.cn/blog_migrate/75be949c48fadb9a01317330547e7864.png)
我们跟到addServletMappingDecoded()方法,跳到了StandardContext. addServletMappingDecoded()方法下,首先将servlet-name和url-pattern添加到servletMappings下,然后通过findChild方法,找到我们之前启动的wrapper(读取之前存储到ContainerBase的children变量),我们跟进查看wrapper.addMapping()方法。
![](https://i-blog.csdnimg.cn/blog_migrate/62d9e3510f2679b556ebf3a7c71bdf4e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/aee3e3586df5f3ccc74ba2c69ad2c6df.png)
我们走到了StandardWrapper.addMapping方法。将mapping(也就是url-pattern)添加到mappings变量下。
![](https://i-blog.csdnimg.cn/blog_migrate/676592780410f6860ab325a5d0f82bbb.png)
二、Servlet内存马实现
其实看到这里应该能明白添加servlet最关键的地方就是这个两个方法,所以我们接下来内存马的编写就需要一个恶意的servlet,然后通过addChind和addServletMappingDecoded将其恶意servlet注入进去。
![](https://i-blog.csdnimg.cn/blog_migrate/4c0562532fed79028f33d89a42c792a3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8757074fb4f8815475676f1ff38415fd.png)
最终成功实现内存马。
![](https://i-blog.csdnimg.cn/blog_migrate/61e831e818f040a986c2b5bd80bbf533.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ff59ff0a15767da620c3bf4524842264.png)
结尾~~~
文章里面有什么写的不对的地方,望师傅们多加指正。Servlet型内存马算是写完了,个人觉得Servlet内存马是这三个里面最难的,因为调试的时候栈里面来回的绕,有时候跳着跳着就乱了,文章里面可能有些地方有写的不对的地方,希望师傅们多加指正。
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
视频配套资料&国内外网安书籍、文档&工具
当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享