首页 > 其他分享 >.NET漏洞分析 | 绕过某和OA全局权限验证

.NET漏洞分析 | 绕过某和OA全局权限验证

时间:2024-05-24 09:27:29浏览次数:26  
标签:Web URL text OA 漏洞 context NET aspx

01阅读须知

文章首发:先知社区,原文地址:https://xz.aliyun.com/t/14517

此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他方面

02漏洞背景

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

图片

图片

于是笔者带着群友们这些疑问点抽空研究总结了一下,于是便有了此文。

03ExtensionlessUrlHandler

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

图片

如果觉得图上XML代码看不清楚的话,也可以参考如下这段Web Handler以及Modules配置详情:

<modules runAllManagedModulesForAllRequests="true">
      <add name="JHSoft.CustomQuery" type="JHSoft.CustomQuery.HttpUploadModule, JHSoft.CustomQuery">
      </add>
      <add name="HttpUploadModule" type="JHWeb.qqfly.Upload.HttpUploadModule, JHWeb.qqfly.Upload">
      </add>
      <add name="JHSoft.Log" type="JHSoft.Log.LogHttpModule, JHSoft.Log">
      </add>
    </modules>
    <handlers accessPolicy="Read, Script">
      <remove name="ExtensionlessUrlHandler-Integrated-4.0">
      </remove>
      <remove name="OPTIONSVerbHandler">
      </remove>
      <remove name="TRACEVerbHandler">
      </remove>
      <add name="AjaxMethod" verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax">
      </add>
      <add name="scissors" path="scissors.axd" verb="*" type="BitmapCutter.Core.HttpHandler.BitmapScissors,BitmapCutter.Core">
      </add>
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0">
      </add>
    </handlers

在这里我们发现了一个名为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来处理,某和OA便使用此方法进行映射。如下配置所示。

<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。

04JHSoft.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模块,从名称上看应该是记录请求等日志数据的,其实反编译后发现不仅做了日志的处理,还有对整个请求做了安全校验。具体代码如下所示

public class LogHttpModule : IHttpModule
 {
  // Token: 0x06000002 RID: 2 RVA: 0x00002058 File Offset: 0x00001058
  public void Init(HttpApplication application)
  {
   application.BeginRequest += this.Application_BeginRequest;
   application.AcquireRequestState += this.application_AcquireRequestState;
   application.EndRequest += this.Application_EndRequest;
   application.Error += this.application_Error;
  }
}

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

private void application_AcquireRequestState(object sender, EventArgs e)
  {
   HttpApplication httpApplication = (HttpApplication)sender;
   HttpContext context = httpApplication.Context;
   string text = context.Request.Path.ToLower();
   if (!text.EndsWith(".aspx"))
   {
    text.EndsWith(".ashx");
   }
   if (text.EndsWith(".aspx"))
   {
    if (this.SqlFilter(context.Request))
    {
     context.Response.Write("传递的字符中含有敏感字符,操作已停止。");
     context.Response.End();
    }
  }

代码中对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 排除特定的页面,除此之外所有的请求都会被强制重定向至登录页。

图片

这里摘抄了一段代码,和某通一样在此处定义了很多需要排除验证的文件,如下所示。

if ((context.Session == null || context.Session["UserCode"] == null) && text.IndexOf("/jhsoft.web.login/password.aspx") == -1 && text.IndexOf("/jhsoft.web.login/passwordmode.aspx") == -1 && text.IndexOf("/jhsoft.web.login/newpass.aspx") == -1 && text.IndexOf("/jhsoft.web.epass/epasslogin.aspx") == -1 && text.IndexOf("/jhsoft.web.epass/epassloginverify.aspx") == -1 && text.IndexOf("/jhsoft.web.epass/epasspersonrepin.aspx") == -1 && text.IndexOf("/jhsoft.web.login/installationcontrol.aspx") == -1 && text.IndexOf("/jhsoft.web.login/clientcheck.aspx") == -1 ){
  string[] array = text.Split(new char[]
      {
       '/'
      });
      if (array.Length == 6)
      {
       context.Response.Redirect("../../../JHSoft.Web.Login/PassWord.aspx");
      }
      else if (array.Length == 5)
      {
       context.Response.Redirect("../../JHSoft.Web.Login/PassWord.aspx");
      }
      else
      {
       context.Response.Redirect("~/JHSoft.Web.Login/PassWord.aspx");
      }
}

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

图片

05全局绕过权限验证

经过上面两小节的分析得知,某和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注入漏洞,我们构造出/c6/JHsoft.web.Workflat/RssModulesHttp.aspx/?interfaceID=1请求便可实现注入漏洞,如下图所示。

图片

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

06推荐阅读

从漏洞分析到安全攻防,我们涵盖了.NET安全各个关键方面,为您呈现最新、最全面的.NET安全知识,下面是公众号发布的精华文章集合,推荐大家阅读!

图片

图片

图片

图片

图片

图片

07欢迎加入.NET安全知识库

为了更好地应对基于.NET技术栈的风险识别和未知威胁,dotNet安全矩阵星球从创建以来一直聚焦于.NET领域的安全攻防技术,定位于高质量安全攻防星球社区,也得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展。目前只需199元便可以加入我们,后期星球门票价格随着内容和质量的不断沉淀会适当提高,因此越早加入越好!

    目前dot.Net安全矩阵星球已成为中国.NET安全领域最知名、最活跃的技术知识库之一,从.NET Framework到.NET Core,从Web应用到PC端软件应用,无论您是初学者还是经验丰富的开发人员,都能在这里找到对应的安全指南和最佳实践。

星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。

图片

图片

图片

星球文化始终认为授人以鱼不如授人以渔!加入星球后可以跟星主和嘉宾们一对一提问交流,20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等。

图片

    我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。

图片

    我们还有一个会员专属的星球陪伴群,加入的成员可以通过在群里提出问题或参与论的方式来与其他成员交流思想和经验。此外还可以通过星球或者微信群私聊向我们进行提问,以获取帮助迅速解决问题。

图片

图片

标签:Web,URL,text,OA,漏洞,context,NET,aspx
From: https://blog.csdn.net/ahhacker86/article/details/139137097

相关文章

  • 网络故障 之二 tc和netem
    一、介绍   netem是Linux2.6及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低宽带,传输延迟,丢包等等情况。使用Liunx2.6(或以上)版本内核的很多发行版Linux都开启了该内核功能,比如Fedora、Ubuntu、Redhat......
  • 从0到1搭建.NET Core Web API项目
    1.设置.NET8WebAPI项目概念使用.NETCLI创建新的WebAPI项目。这设置了一个基本的项目结构,包括启动和WeatherForecast控制器作为示例。Program.cs代码示例dotnetnewwebapi-nMyWebApi2.Program.cs—最低限度的API配置概念.NET8延续了最小API的趋......
  • .netcore 对象存储帮助类
    说明:1、由于各平台对象存储规则存在细微差异,故在类中对于入参进行处理(使用时需要根据自身情况调整)。2、本文档写于2024年05月24日,由于版本的迭代,可能存在细微差异,可能导致错误,所以推荐下载文档使用NuGet引用版本进行测试。minio对象存储帮助类usingMinio;usingMinio.DataM......
  • TensorBoard相关学习
    TensorBoard是Google为TensorFlow框架开发的一个强大的可视化工具,它可以帮助用户更直观地理解、分析和调试机器学习模型的训练过程。通过TensorBoard,你可以可视化模型的结构、监控训练过程中的指标变化(如损失函数、准确率)、查看权重直方图、嵌入向量,甚至可以展示图像数据等......
  • .NET周刊【5月第3期 2024-05-19】
    国内文章WPF使用Shape实现复杂线条动画https://www.cnblogs.com/czwy/p/18192720文章介绍了利用WPF的Shape和动画功能,模仿CSS/SVG实现复杂的线条光效动画效果。首先,通过Polyline和StrokeDashArray实现了虚线动画,再通过StrokeDashOffset添加动画效果。然而,由于WPF不支持角向渐变......
  • Modbus转Profinet网关不限制plc插槽modbus指令轮询
    通过Modbus转Profinet(XD-MDPN100)网关的应用,不仅可以实现Modbus设备与Profinet网络的平滑对接,还能有效解决PLC插槽限制和Modbus指令轮询等问题,Modbus转Profinet网关(XD-MDPN100)在解决PLC插槽限制以及Modbus指令轮询问题方面,具有显著的优势。以下是对其如何不限制PLC插槽Modbus指令......
  • 传感器通过Profinet转Modbus网关与PLC通讯在生产线的应用
     Profinet转Modbus(XD-MDPN100/300)网关可视作一座桥梁,能够实现Profinet协议与Modbus协议相互转换,支持ModbusRTU主站/从站,并且Profinet转Modbus网关设备自带网口和串口,既可以实现协议的转换,也可以实现接口的转换,它从而实现了PLC与传感器之间的顺畅通讯。传感器通过Profinet转Mo......
  • 变频器通过Modbus转Profinet网关连接电机与PLC通讯
    Modbus转Profinet网关(XD-MDPN100)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口,PLC作为控制中枢,变频器作为控制电机转速,通过Modbus转Profinet网关,实现对电机的远程监控和调节,使得生产过程更加智能化和精准化。变频器通......
  • netcore webapi部署到docker容器,api调用后显示中文乱码
    vs2022webapi部署到docker容器,api调用后显示中文乱码。原因是:源代码文件不是utf-8编码(用vscode打开是乱码,在vscode修改后,再提交,正常)解决方法:在中文环境下用过微软家Visualstudio的都知道,新建文件的保存编码都默认为当前系统语言,所以你的文件编码永远都是GB2312,非常令人蛋......
  • 哪类漏洞容易被攻破
    这个取决于多种因素,包括漏洞的严重程度、攻击者的技术能力和资源、目标系统的安全配置等。然而,一些常见的漏洞类型由于其普遍性和严重性,往往更容易被攻破。例如,跨站脚本(XSS)漏洞是一种非常常见的安全漏洞,攻击者可以在网页中插入恶意代码,利用浏览器执行这些代码来窃取用户信息......