前言:spring interceptor 内存马的笔记
springboot的拦截器实现原理参考文章:https://blog.csdn.net/_/article/details/
参考文章:https://landgrey.me/blog/19/
在对于存在相关的拦截器的时候,controller内存马就无法进行利用,原因就在于拦截器的调用顺序在controller之前,所以controller不能作为通用的内存马来进行使用。
https://landgrey.me/blog/19/ 中的截图如下
如下情况,比如我这里写个拦截器,除了login以外的都作为未授权处理,都自动重定向回,万一后台账号自己没了的话,或者等等情况,导致失去了访问权限,那么该内存马也就相当于不存在了。
容器配置类Appconfig.java
拦截器代码:
所以可以看到,这样的话对于某些一定需要权限的接口,就无法做到完美的权限维持,而Interceptor内存马能够弥补这样的缺陷。
可以看到通过相关的header头传输命令,如下图所示,弹出一个对应的计算器
首先还是先学习springboot本身是如何将拦截器应用的,因为拦截器本身是在请求的时候进行应用,而springboot核心处理请求都是在org/springframework/web/servlet/DispatcherServlet.java类中进行处理的,在相关的doDispatch方法上打上断点,如下图所示
接着随便一个请求, http://localhost:8080/asdasdasd ,跟随断点走,来到getHandler,跟进去
这个getHandler方法会遍历当前handlerMapping数组中的handler对象,来判断哪个handler来处理当前的request对象,这里用的是其中的SimpleUrlHandlerMapping对象
这继续跟到其中的中,其中获取指定的拦截器处理过程也是在这里进行的,首先是获取对应的handler
然后接着getHandlerExecutionChain方法则是获取调用链,其中会就会将当前的拦截器加到当前的调用链中,类似于过滤链一样,然后在之后的处理中进行遍历调用
这里跟到其中可以看到,预先将要处理的拦截器都加入到调用链中
最后将handler和调用链一起进行封装,也就成为了HandlerExecutionChain,最后将这个对象返回,如下图所示
后面遍历拦截器的地方在如下这个地方,这里就不跟了
到这里就已经了解了相关的拦截器封装过程,这里主要的地方就是如下这个地方。
当前的对象是org/springframework/web/servlet/handler/AbstractHandlerMapping.java中的getHandlerExecutionChain方法
其中的this.adaptedInterceptors存储着所有的拦截器对象,该对象还是一个私有对象,所以想拿到的话还需要通过反射
这里整理思路:
1、先获取SpringBoot中的ApplicationContext对象
2、通过IOC容器中的AbstractHandlerMapping,接着通过反射来获取adaptedInterceptors字段(因为该字段为私有)
3、将要注入的过滤器放入到adaptedInterceptors中
还是跟上篇的一样,具体的环境就不再写上去了,参考https://www.cnblogs.com/zpchcbd/p/15544419.html
执行命令测试如下:whoami
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/5122.html