首页 > 其他分享 >.NET 某和OA办公系统全局绕过漏洞分析

.NET 某和OA办公系统全局绕过漏洞分析

时间:2024-05-28 09:01:04浏览次数:30  
标签:Web 扩展名 请求 URL OA 漏洞 NET aspx

转自先知社区

作者:dot.Net安全矩阵

原文链接:.NET 某和OA办公系统全局绕过漏洞分析 - 先知社区

0x01 前言

某和OA协同办公管理系统C6软件共有20多个应用模块,160多个应用子模块,从功能型的协同办公平台上升到管理型协同管理平台,并不断的更新完善,全面支撑企业发展。从此OA C6版本外部已公开的多个漏洞详情,不难发现都有一些共同的特点,那就是URL里的 .aspx后都会加上一个 / ,然后再进行传递参数。比如 /RssModulesHttp.aspx/?interfaceID=1,为此有一些对.NET感兴趣的群友们在星球陪伴的微信群里问起这个原因。
于是笔者带着这些疑问点抽空研究总结了一下,于是便有了此文。

0x02 ExtensionlessUrlHandler

笔者对.NET系统进行漏洞挖掘时第一步喜欢看一下Web.config配置文件,因为此文件包含了一些关于HTTP请求需要经过的管道或者自定义方法,如下所示。

在这里我们发现了一个名为ExtensionlessUrlHandler的一般处理程序,关于此handle背景知识是这样的:.NET WebForms框架早期版本中对于URL请求的设计和管理一直沿用经典的ASP风格,通常URL地址上包含文件及扩展名,比如 UserName.aspx、CheckUser.ashx 等。随着 Web 开发的进步和用户体验需求的提升,陆续出现像MVC框架对无扩展名 URL的需求,即 extensionless URL。

无扩展名 URL 更简洁、易读,用户更容易记住和输入。例如,/about 比 /about.aspx 更直观和易记。因此.NET框架在后来4.0发布时引入了一个ExtensionlessUrlHandler这是一个专门用于处理无扩展名 URL 请求的 .NET Handler。

当启用该配置后基于WebForms框架实现的Web应用便可以像MVC那样通过使用 / 分割路径和参数。这比如 /Mall/Product/GetById/10 ,使用该组件时需要当运行在IIS7以上版本,并且需要IIS的一个快速修复程序KB980368,配置Web.config后将会正常处理上面这种 extensionless URL。

在IIS经典模式下,用的是aspnet_isapi.dll,通过映射到System.Web.DefaultHttpHandler进行处理,如下配置所示。

<system.webServer>
<handlers>
    <add
      name="ExtensionlessUrl-ISAPI-4.0_32bit"
      path="*."
      verb="GET,HEAD,POST,DEBUG"
      modules="IsapiModule"
    scriptProcessor="%WINDIR%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll"
      preCondition="classicMode,runtimeVersionv4.0,bitness32" 
      responseBufferLimit="0" />
</handlers>
</system.webServer>

在集成模式下,会映射到System.Web.Handlers.TransferRequestHandle来处理,如下配置所示。

<system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

这段配置中path="." 匹配所有无扩展名的 URL 请求,verb="" 表示谓词,就是IIS处理所有 HTTP 请求方法,包含了GET/POST/DELETE/PUT 等。type更是直接指向"System.Web.Handlers.TransferRequestHandler":调用使用TransferRequestHandler处理程序解析运行请求。preCondition表示预先处理的条件必须是应用程序池使用集成模式并且运行时版本为 v4.0 时生效。
ExtensionlessUrlHandler 的引入是为了满足当时WebForms应用具备现代 Web 架构对无扩展名 URL 的需求。随着.NET后续版本的迭代和更新,Web框架已不再需要此项配置便可实现无扩展名的URL。

0x03 JHSoft.Log.HttpModule

我们知道在 .NET 应用程序中,HTTP Modules用于处理进入的 HTTP 请求的生命周期事件。通过自定义 HTTP Modules可以为应用程序添加日志记录、安全验证防护等功能。在企业级应用某和OA中,我们可以看到对 HTTP 模块做了如下配置,例如:

<modules runAllManagedModulesForAllRequests="true">
    <add name="JHSoft.Log" type="JHSoft.Log.LogHttpModule, JHSoft.Log">
    </add>
</modules>

上述配置指定HTTP请求需要经过JHSoft.Log.LogHttpModule模块,从名称上看应该是记录请求等日志数据的,其实反编译后发现不仅做了日志的处理,还有对整个请求做了安全校验。具体代码如下图所示

Init 方法用于初始化自定义的模块,并注册一系列事件处理程序,其中AcquireRequestState事件在获取当前请求的状态时触发,常用于检查请求的数据。具体定义如下图所示

代码中对aspx扩展名做了深入的处理,通过 context.Request.Path.ToLower(); 获取请求路径并转换为小写,然后text.EndsWith(".aspx") 判断请求路径是否以 .aspx 结尾,如果是则调用 SqlFilter 方法检查请求是否包含敏感字符,这是一个防御SQL注入的方法。
这么看如果是.ashx或者.asmx文件有注入漏洞则完全不受该约束,可以顺利的进行SQL注入攻击。
如果没有注入的风险,程序会继续向下执行,通过 if ((context.Session == null || context.Session["UserCode"] == null) ... 检查会话是否为空。接着通过类似这样的判断 text.IndexOf("/jhsoft.web.login/password.aspx") == -1 排除特定的页面,除此之外所有的请求都会被强制重定向至登录页。这里和某通一样在此处定义了很多需要排除验证的文件,如下图所示

比如我们选择其中的一个文件名作为测试,访问 /jhsoft.web.workflat/isconnect.aspx 返回了预期的结果,并没有重定向到登录页。

0x04 全局绕过权限验证

经过上面两小节的分析得知,某和OA支持像MVC那样无扩展名的路由请求,而在全局用于检查的AcquireRequestState事件中错误的使用了EndsWith方法判断URL请求是否包含.aspx,因此我们可以构造出如下请求达到绕过全局的校验,如下所示。
/c6/JHsoft.web.Workflat/SetImageModule.aspx/id/121212,或者使用 /c6/JHsoft.web.Workflat/SetImageModule.aspx/?id=2222 均可以实现未授权访问。如图所示

我们以外部公开的RssModulesHttp.aspx存在SQL注入漏洞为例,查看此文件的Page_Load方法,发现参数 interfaceID 从 Request.QueryString客户端获取后并没有做任何过滤和处理便进入了 GetRssInfo函数,如下图所示


GetRssInfo 方法用于从数据库中获取特定 RSS 接口的信息。它使用传入的 interfaceID 参数来查询数据库中的 WFRssModule 表,并返回查询结果,具体代码如下图所示。


上述传入的 interfaceID 直接拼接到 SQL 查询字符串中并且执行查询,因此触发MSSQL注入漏洞,如下图所示。

0x05 总结

该系统由 ExtensionlessUrlHandler 和 JHSoft.Log.Module 组件两者配合引发的全局绕过漏洞,攻击者只需要构造出特定的URL请求便可实现任意接口的未授权访问,也证明了 Web应用程序在配置和权限管理上的薄弱环节,因此不当的配置可能导致严重的安全漏洞。

标签:Web,扩展名,请求,URL,OA,漏洞,NET,aspx
From: https://blog.csdn.net/ahhacker86/article/details/139248090

相关文章

  • [分享]OffensiveCon24 UEFI 和翻译器的任务:使用跨架构 UEFI Quines 作为 UEFI 漏洞开
    链接:OffensiveCon24-uefi-task-of-the-translator目录x64assemblyx64程序集x64assemblysourcecodeforBGGP4entry:bggp4winningentry-x64assemblysourcecodeBGGP4UEFISelf-replicatingapp:bggp4winningentry-UEFIself-replicatingapp,compiledfromx64......
  • .net中Base64编解码
    #region对字符串进行Base64编码///<summary>///对字符串进行Base64编码///</summary>///<paramname="source"></param>///<returns>string</returns>publicstaticstringBase......
  • .NET8序列化与反序列化
    序列化与反序列化JSON简介JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,采用类的形式来描述数据之间的关联关系。JSON是一个序列化的对象或数组。JSON中仅有六个构造字符([、]、{、}、:、,),以及无意义的空白符(换行、空间等)JSON中的数据类型:对象(使用{})、数组(使用[])、......
  • 命令启用Windows7 .NetFramework 3.5
    最近在测试某系统安装包在各个环境下的安装使用情况,在window7下使用时,安装完成iis后,发现.NetFramework3.5没有自动勾选;命令没有执行成功。通过以下命令可以在window7下打开自带的.netframework3.5.1(CMD窗口内执行)dism/online/enable-feature/featurename:NetFx3 ......
  • net core 建立webservice项目
    1、创建项目  2、通过NuGet安装SoapCore 3、创建服务接口及实现类本项目会创建2个webservice服务文件用于测试,所以创建了2个model类和2个接口文件。 Model类:[DataContract]publicclassFactoryModel{///<summary>///工厂号///<......
  • netcore构建webservice以及调用的完整流程
    目录构建前置准备编写服务挂载服务处理SoapHeader调用添加服务调用服务补充内容构建前置准备框架版本要求:netcore3.1以上引入nuget包SoapCore编写服务1.编写服务接口示例usingSystem.ServiceModel;namespaceServices;[ServiceContract(Namespace="http://Demo.WebService......
  • 方法重载(Overload)与方法覆盖(Override)
    方法重载​对于类的方法(包括从父类中继承的方法),如果有2个方法的方法名相同,但参数不同,那么一个方法是另一个方法的重载方法。​重载方法必须满足以下条件:方法名相同方法的参数类型,个数,顺序至少有一项不同方法的返回类型可以不相同方法的修饰符可以不相同......
  • netty建立数万客户端连接,并主动发消息
    @Slf4jpublicclassNettyClientTest{publicstaticvoidmain(String[]args)throwsException{EventLoopGroupworkerEventLoopGroup=newNioEventLoopGroup();try{Bootstrapbootstrap=newBootstrap();boo......
  • 【.NET深呼吸】线程信号量(Semaphore)
    Semaphore类可以控制某个资源允许访问的线程数,Semaphore有命名式的,也有不命名的;如果不考虑跨进程工作,一般在代码中使用不命名方式即可。信号量有点类似于等待句柄,某个线程如果调用了WaitOne方法,这个线程就会暂停,并且等待有可用的信号量时才会继续执行;某个线程调用Release方法,就......
  • .NET8极致性能优化AOT
    前言.NET8对于性能的优化是方方面面的,所以AOT预编译机器码也是不例外的。本篇来看下对于AOT的优化。原文:.NET8极致性能优化AOT详述首先明确一个概念,.NET里面的AOT它是原生的。什么意思呢?也就是说通过ILC编译器(AOT编译器,参考:.Net7新编译器ILC简析)编译出来的代码是各个平......