在讲过反序列化之后,在实战中可以发现很多场景都是通过反序列化植入内存马这种操作。
那么内存马的好处肯定不用多说了,但是内存马具体是怎么植入的呢,老规矩本人java也是自学,尽可能用人话给各位简单讲一下。
filter
在讲内存马之前,需要先知道下在java中存在一种叫filter的东西。
就是这个东西的存在实现了比如登录,鉴权等等骚操作。那么filter是啥?
通俗来讲,filter就是一个过滤器,在java中你访问的每个请求都会先通过判断是否存在于filter中再决定是否要进行放行。
在代码中的体现具体为。
在web.xml中注册了所有当前的filter
filter-name:表示当前filter的名称
filter-class:表示filter详细代码的类
url-pattern:表示要拦截的路径
再看filter的处理部分代码
ok配置好后大致的filter功能有简单的理解了。那我们实际看一下filter是如何处理的。
下断点我们进入到了这里
可以看到调用了filterChain的doFilter方法。查看下可以发现filterChain中存放的就是从web.xml中读取到的配置的filter
既然filterChain已经存在了web.xml中的配置,我们就找下filterChain是怎么被创建的。
通过代码我们发现filterChain的创建使用到了createFilterChain方法,看一下这个方法具体实现
跟进之后我们发现他在其中使用了findFilterMaps来查找你web.xml中所有的配置,并保存在filtermap中。
然后根据你请求的url在这个filtermap中依次对比,如果匹配到了就添加进入filterChain。
所以说,注册内存马其实就是注册一个我们自己的filter就可以了。
根据代码可知,注册我们的内存马,需要filterConfig这个东西。而filterConfig需要使用到context中的findFilterConfig进行创建。 再看下刚刚的findFilterMaps。
可以看到一切的起源都和context有关系。
那我们就看一下context中具体的实现了什么。
直接看关键点,在context中存在直接添加进filtermap的方法,我们只需要直接调用,即可注册自己的filter
在context中,和filter有关的我们需要注册这三个参数。
那么实际操作下看下怎么添加。
还记得开头讲的web.xml中的每个字段代表的含义吗。
和这里的字段就可以对应上了
在filtermap中只需要对应上我们的name和url就可以了。
再看下def中需要对应哪些
根据结果构造代码
最后只需要把我们构造的def和map注入进去就可以了。
这样我们就成功获得了一个我们自己可控的filter