1.ASP.NET MVC Filter型内存马

2024-11-15 14:48   广东  

1.关于MVC里的Filter

之前在学习ASP.NET MVC开发的时候就了解过这个概念,和JAVA EE中的Filter的概念和功能都是比较类似的,当时就在想这里有没有可能用来实现内存马,现在终于可以学习一波了。首先还是先来复习一下MVC中的Filter的配置和使用吧。

首先我们当然是需要写一个Filter的实现类。这里必须要选择IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter其中之一去实现,他们之间的不同和优先级已经在下图的表格里给出了

可以看出,IAuthorizationFilter在Action方法之前运行,且优先级最高,所以我们的Filter优先选择实现它

如下图就写好了一个最简单的Filter实现类。注意这里我们需要实现OnAuthorization方法,对JAVA熟悉的读者可以理解为doFilter()

(这里实现AuthorizeAttribute使其成为特性,方便后续直接使用,如果是实现IAuthorizationFilter接口,会有细微差异,后续再说)

这里通过filterContext可以拿到HttpContext,进而拿到Response、Request,所以获取请求和返回响应都很方便

不过如果你实现的不是IAuthorizationFilter,而是别的,还会有各种方法等着你去实现,比如我之前学习这块的时候,讲师先是介绍的ActionFilterAttribute,实现OnActionExecuting,在Action执行之前执行,优先级其实也很高

总之取决于你怎么实现Filter

那么上面我们写好了一个Filter,我们该怎么使用呢?一个最简单的方法是直接在Controller或者Action上方加上对应的特性:

此时访问默认的Index页面,可以看到信息被成功打印,证明Filter成功触发

当然也可以直接加在Controller类的上方,对类中所有Action同时生效。

这里我们自己实现一个Filter,还需要手动给Controller或者Action设置特性,似乎也没看出什么内存马的门道。而且我们肯定是希望这个Filter是全局生效的,那么ASP.NET MVC有没有办法配置一个全局的Filter呢?以前也刚好学到这一点。

注意到App_Start目录下有一个FilterConfig类,其中实现

RegisterGlobalFilters()

这里的关键其实是它接受一个GlobalFilterCollection类的对象,并调用其Add()方法,传入Filter实现类进行注册,从这个方法的名字和操作不难看出,它就是用于注册Filter的,并且在Global.asax这个全局配置文件中,也有调用RegisterGlobalFilters方法。并且可以看到使用GlobalFilters.Filters就可以直接拿到一个GlobalFilterCollection类的对象。

所以我们也来试试,在RegisterGlobalFilters()方法中调用filters.Add(),把我们刚刚写的Filter加入进去

再次访问,依然成功触发Filter,任何存在的Controller和Action都会触发上述Filter

那么再一个问题,除了不同Filter实现本身的优先级,假如我有两个一样的IAuthorizationFilter,除了在Add()的时候主动控制先后顺序,还有没有什么办法可以修改优先级呢?以前问过GPT,给的答案是设置Order属性

不过这里去跟一下Add()的重载,可以看到另一个Add()方法,还接受int型的order传参

默认优先级-1,并且从上面GPT给的信息来看这玩意越小优先级越高,所以我们改一个比-1小的值就能确保优先级最高。


2.开搓内存马

了解了上面的各种基本信息之后,你会发现想要搓一个ASP.NET的Filter内存马超级简单,在JAVA那边还得研究Filter的注册流程,找到储存Filter信息的几个类和属性并且逐一反射调用改值,上下文对象的获取也需要专门研究。而.NET这边就不同了,大部分东西都是可以直接获取调用的,非常的一目了然,我们写一个恶意的Filter类,然后调用GlobalFilterCollection类的Add()方法去添加即可

这里写一个内存马注入器,注释写的很明白,也非常ez,访问之后看看效果:

注入完之后访问存在的Controller、Action,就会出现auth filter inject的提示,证明注入成功了,上面的内存马接受cmd参数执行命令,这里执行一个whoami试试。


3.总结

经典的filter,经典的内存马。不过这边和JAVA那边相比是有局限性的,那边的Filter内存马可以做到真·全局,只要设置匹配路径为/*即可,哪怕是一个不存在的uri也会生效。这边的Filter对一个不存在的路径并不会生效,而且这个Filter机制要依赖System.Web.Mvc命名空间,只有MVC项目或者引入system.web.mvc.dll的Framework项目才可以打上这个内存马。


4.参考

https://yzddmr6.com/posts/asp-net-memory-filter/#%E6%B5%8B%E8%AF%95

以及忘记是哪个的B站上的ASP.NET MVC教程(

HW专项行动小组
大师!教我打攻防
 最新文章