.NET 异常过滤器实现虚拟WebShell

0x01 背景

这几天稍微研究了下.NET MVC的全局异常处理以及捕获,相比.NET Web Form,.NET MVC的处理方式有所不同,以往是通过注册Global.asax文件中的Application_Error事件进行全局异常捕获,现在MVC可以使用强大的过滤器进行自定义错误的处理。本文作为学习笔记,将.NET MVC中已知的几种全局异常捕获及处理的思路进行整理和对比分析。.

1.1 基本原理

.NET MVC为异常处理提供了一个HandleErrorAttribute特性,该特性主要捕获及处理由操作方法引发的异常,一般新建的项目都是默认全局注册,通过GlobalFilter全局过滤器注册了此特性,所以整个.NET MVC网站程序中所引发的异常默认都会被HandleError捕获到!打开项目中的Global.asax文件,可以看到默认调用了FilterConfig类对HandleError特性进行全局注册

using System.Web;using System.Web.Mvc;
namespace Test{    public class FilterConfig    {        public static void RegisterGlobalFilters(GlobalFilterCollection filters)        {                        filters.Add(new HandleErrorAttribute());        }    }}

1.2 HandleErrorAttribute

异常过滤器用来处理操作或结果执行期间可能抛出的异常。参与异常处理的操作过滤器需要实现IExceptionFilter接口。.NET MVC 框架只提供了一个异常过滤器:[HandleError],说到IExceptionFilter接口,就要提到上面所介绍的HandleError特性,可以从源码中看到HandleErrorAttribute就是实现了IExceptionFilter接口和FilterAttribute特性,但是HandleErrorAttribute作为默认提供的异常处理特性,有很多限制和不灵活的地方,比如不处理404,需要开启自定义错误,只能使用视图界面等。因此我们可以通过继承IExceptionFilter这个异常过滤接口,扩展和编写我们自己所需的处理流程。继承IExceptionFilter接口,需要实现void OnException(ExceptionContext filterContext)方法,通过方法中的ExceptionContext类参数,我们可以极为灵活的编写各种异常处理流程

0x02 WebShell

笔者将改写OnException方法,方法内获取外部传入的base64数据,得到request对象后解码,另外为了具备命令执行后回显,使用StandardOutput.ReadToEnd读取命令执行后的所有返回数据,代码片段如下

.NET 异常过滤器实现虚拟WebShell

效果实现如下 请求/Home/Error?content=tasklist正常触发,成功结果如下图

.NET 异常过滤器实现虚拟WebShell

0x03 结语

.NET MVC下还有很多这样的过滤器可以被用来实现虚拟Webshell,如果对这些技巧感兴趣的话可以多关注我们的博客、公众号dotNet安全矩阵以及星球,下一篇将继续分享 .NET相关的安全知识,请大伙继续关注。另外文章涉及的PDF和Demo以及工具已打包发布在星球,欢迎对.NET安全关注和关心的同学加入我们,在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事。

.NET 异常过滤器实现虚拟WebShell