01
阅读须知
文章首发:先知社区,原文地址:https://xz.aliyun.com/t/14517
此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他方面
02
漏洞背景
某和OA协同办公管理系统C6软件共有20多个应用模块,160多个应用子模块,从功能型的协同办公平台上升到管理型协同管理平台,并不断的更新完善,全面支撑企业发展。从此OA C6版本外部已公开的多个漏洞详情,不难发现都有一些共同的特点,那就是URL里的 .aspx后都会加上一个 / ,然后再进行传递参数。比如 /RssModulesHttp.aspx/?interfaceID=1,为此有一些对.NET感兴趣的群友们在星球陪伴的微信群里问起这个原因
于是笔者带着群友们这些疑问点抽空研究总结了一下,于是便有了此文。
03
ExtensionlessUrlHandler
笔者对.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.NETFrameworkv4.0.30319aspnet_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。
04
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模块,从名称上看应该是记录请求等日志数据的,其实反编译后发现不仅做了日志的处理,还有对整个请求做了安全校验。具体代码如下所示
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#工具库等等。
我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。
我们还有一个会员专属的星球陪伴群,加入的成员可以通过在群里提出问题或参与论的方式来与其他成员交流思想和经验。此外还可以通过星球或者微信群私聊向我们进行提问,以获取帮助迅速解决问题。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...