所有文章 > 技术杂货铺 > .NET访问中断控制指南:示例及预防
.NET访问中断控制指南:示例及预防

.NET访问中断控制指南:示例及预防

本文的目的是探讨访问控制这一主题,以及如何为您的网站提供适当的安全性。首先,我们将简要介绍什么是损坏的访问控制。然后,我们将使用示例来说明损坏的访问控制是什么样子,以及哪些漏洞会成为目标。最后,我们将为您提供针对这些漏洞的几种缓解解决方案。 

不用多说,让我们开始吧。 

什么是访问控制?

首先,我们来介绍一下访问控制的基本知识。 

访问控制,通常也称为授权,是一组管理资源访问的机制和策略。通常,一旦服务器使用身份验证机制确定了您的凭据,它就会授予或限制您可以在系统中访问的资源。此外,授权基础设施是用户跟踪资源监控的支柱。 

此外,大多数平台的用户通常扮演多个角色,这意味着访问控制的复杂性呈指数级增长。 

不要将身份验证与授权混淆,这一点很重要。根据Microsoft 的说法,“身份验证是确定用户身份的过程。授权是确定用户是否有权访问资源的过程。” 

正确实施可靠且安全的访问控制系统非常复杂且棘手,因为它与系统架构密切相关。因此,即使对于经验丰富的工程师来说,为应用程序开发访问控制机制的任务也可能令人望而生畏。事实上,根据系统的规模和复杂性,适当的解决方案可能是实施第三方库或简单的身份验证,或者甚至是两者的结合。

解释访问控制失效

既然我们已经解释了访问控制是什么,那么就可以更好地理解访问控制失效的含义。简单地说,访问控制失效描述的是系统访问控制中存在的漏洞。  

如前所述,任何违反访问控制机制的行为都可能对系统造成灾难性的影响。鉴于一次成功的攻击可能让攻击者完全控制您的平台,因此解决任何存在的漏洞至关重要。

常见的访问控制漏洞

现在让我们来探讨一下常见的访问控制漏洞是什么样的。 

在本文中,我们介绍了不安全 ID、路径遍历、文件权限和客户端缓存攻击。但这里我们来简单回顾一下。 

不安全 ID 漏洞

大多数现代网站都使用某种类型的 ID 或索引来快速引用数据,这在大多数情况下都很有效。也就是说,如果这些 ID 太简单以至于别人无法破解,无论是手动破解还是暴力破解,那么您将面临安全问题。 

为了说明这一点,假设您有一个个人资料页面部分,其中显示用户个人资料。然后,此 URL 检索我们的用户个人资料:https ://www.mywebsite.com/profile?id=123 

如果我决定手动更改查询字符串中的数字,并且没有主动访问控制来验证我的请求,那么我可以访问我想要的任何配置文件。 

路径遍历漏洞

路径遍历的概念是指用户自由浏览文件系统目录树的能力。  

缺乏适当访问控制的系统可能会受到路径遍历攻击,并可能让攻击者访问服务器中的受限资源。当系统允许检索的资源路径可以更改且未经过适当验证时,可能会发生这种情况。 

例如,请参考以下 URL:https://www.mywebsite.com/photos? file=user.png 

例如,如果我将“user.png”更改为“../../etc/passwd”,那么我就可以访问应用程序机密。

文件权限漏洞

文件权限漏洞与服务器文件系统的权限机制中的漏洞有关。  

每个 Web 应用都有外部人员无法访问的关键配置文件和资源。但如果没有制定正确的配置策略,黑客就可以攻击这些文件,然后控制整个平台。 

以下是某人试图进入他们无法访问的文件的示例:https://www.mywebsite.com/photos?file=../../gradle.json 

客户端缓存漏洞

涉及客户端缓存的漏洞可能难以解决。黑客不是远程攻击,而是物理接管用户的计算机。这意味着黑客能够使用已存在且经过身份验证的缓存页面、会话凭据和浏览器数据。 

一旦攻击者完成此操作,他们就能够快速获取用户的信息。 

解决访问控制问题

综上所述,许多变量可能会使解决访问控制漏洞成为一个简单的过程,也可能是一个极其复杂的过程。平台的复杂性、架构和数据敏感性只是其中的一部分。话虽如此,第一步应该始终是实施适当的身份验证机制。  

正如微软官方文档站点所解释的那样,“在 ASP.NET Core 中,身份验证由身份验证中间件使用的IAuthenticationService处理。身份验证服务使用注册的身份验证处理程序来完成与身份验证相关的操作。”  

为了实现身份验证,我们将使用 Auth0 SSO 服务来提供强大而可靠的第三方解决方案。 

首先,我们必须访问 Auth0 网站并注册我们的应用程序。如果您还没有 Auth0 帐户,则必须注册一个。

进入仪表板后,转到“应用程序”部分并单击“创建应用程序”按钮。然后,输入应用程序的名称,并确保选择“常规 Web 应用程序 作为应用程序类型。  

最后,单击“创建”按钮。 

创建应用程序后,转到“设置”选项卡并获取您的 Auth0“域”和“客户端 ID”。然后,将“允许的回调 URL”设置为“https://localhost:9595/callback”,并将“允许的注销 URL”设置为“https://localhost:9595/”。 

第一个 URL 将向 Auth0 指示在身份验证后将用户重定向到哪里,而第二个 URL 指示在注销后将用户重定向到哪里。 

最后,保存您的更改。 

现在,转到项目的appsettings.json文件并设置以下内容:

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Auth0": {
"Domain": "YOUR_DOMAIN",
"ClientId": "YOUR_CLIENT_ID"
}
}

将 YOUR_DOMAIN 和 YOUR_CLIENT_ID 替换为您从 Auth0 仪表板复制的相应值。 

实现身份验证 SDK

现在已经设置好 Auth0,您可以实施授权更改,以便您的应用程序可以利用它。 

 首先,通过运行以下命令 安装 Auth0 ASP.NET Core 身份验证 SDK :

dotnet add package Auth0.AspNetCore.Authentication

该库可让您轻松、快速且毫不费力地将基于 OpenID Connect 的身份验证集成到您的网站中。 

现在让我们修改我们的应用程序代码以支持身份验证机制。  

转到Program.cs文件并更新其内容:

// ADDED CODE
using Auth0.AspNetCore.Authentication;

var builder = WebApplication.CreateBuilder(args);

// ADDED CODE
builder.Services
.AddAuth0WebAppAuthentication(options => {
options.Domain = builder.Configuration["Auth0:Domain"];
options.ClientId = builder.Configuration["Auth0:ClientId"];
});

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment()) {
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
// ADDED CODE
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

这里我们首先添加了对 Auth0.AspNetCore.Authentication 的引用。然后我们使用Auth0 作为域和我们的客户端 ID调用方法AddAuth0WebAppAuthentication() 。最后,我们调用UseAuthentication()方法以允许身份验证中间件执行其工作。

.NET 破坏访问控制指南:示例和预防图像

实现登录

为了实现登录机制,在Controllers文件夹中添加一个AccountController.cs类,并添加以下代码: 

using Microsoft.AspNetCore.Authentication;
using Auth0.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;

public class AccountController : Controller {

public async Task Login(string URLtoReturn = "/") {
var properties = new LoginAuthenticationPropertiesBuilder()
.WithRedirectUri(URLtoReturn)
.Build();

await HttpContext.ChallengeAsync(Auth0Constants.AuthenticationScheme, properties);
}
}

此类定义一个控制器来处理标准用户功能。 

最后,确保添加一个重定向到该控制器的登录链接,这样您就有一个登录表单。 

重要的是要记住,即使身份验证的基础工作已经完成,您还没有用它来保护任何方法。要做到这一点,您只需在其上添加[Authorize]指令,然后 ASP 将为您完成剩下的工作。

解决破坏的访问控制漏洞

我们需要对我们的平台做一些调整来解决上述特定的漏洞。 

不安全的 ID:您可以通过将 GUID 实现为 ID 来轻松解决不安全的 ID。您必须尽早开发系统并考虑到此漏洞。属于敏感资源的 ID 必须是唯一的且隐藏的。 

路径遍历:解决路径遍历缓解问题需要您验证用户输入并限制对关键资源的访问。幸运的是,您不需要做太多事情来实施适当的路径遍历策略,因为 Spring Security 等库非常强大。 

文件权限:就文件权限而言,您无需做太多工作即可保证安全,除非您必须使用服务器权限并添加与文件操作相关的功能。尽管如此,如果需要,最好与您的服务器管理员沟通。 

客户端缓存:使用客户端缓存,最好的解决方案也是最简单的解决方案:只要您不在客户端浏览器上存储敏感的用户信息,就没问题。但如果您必须探索复杂的功能,请务必使用异步验证和 HTML 元标记在页面加载时确认权限。 

最后的想法

在构建可靠的 Web 应用程序时,我们不断做出可能影响业务稳定性和安全性的微小决策。我们依靠对开发、基础设施和安全基础知识的广泛了解来正确履行这一职责。  

此外,没有什么比确保我们的平台稳定和用户信息安全更重要。这样做是一个越来越复杂和敏感的过程。为了举例说明,SD Times表示,访问控制中断是 OWASP 2021 年十大漏洞中最大的漏洞。 

开发人员应该关注这一点。但尽管它很复杂,但提供有效的访问控制却相当简单,正如本文所述。

文章来源:.NET Broken Access Control Guide: Examples and Prevention

#你可能也喜欢这些API文章!