所有文章 > 技术杂货铺 > .NET Open Redirect 指南:示例与预防
.NET Open Redirect 指南:示例与预防

.NET Open Redirect 指南:示例与预防

这篇文章旨在为读者提供有关开放重定向漏洞的见解和指导。我们将重点介绍在没有适当安全性的平台中通常会发现的不同漏洞以及如何针对它们应用缓解措施。  

重要的是要知道,我们对开放重定向的讨论将简洁且范围有限。此外,如果您对 .NET(本文选择的开发堆栈)的经验有限,您可能需要查看Microsoft 的 ASP.NET 文档。

什么是开放重定向?

要理解开放重定向,首先必须了解什么是重定向以及为什么重定向在网络上如此普遍。 

重定向是平台将用户从一个 URL 移动到另一个 URL 以延续功能的方式。此外,开发人员还使用它们作为防止来自错误或未经授权的地址的入侵的应急措施。从广义上讲,重定向是开发人员确保其用户遵循正确流程的工具。 

理解了这一点,我们就能明白它们在网络上是多么必要和无处不在。然而,这也使这些重定向成为不良行为者的潜在目标,他们试图误导用户,将他们引导到恶意网站。 

当 Web 应用程序接受未经验证的输入并最终将用户重定向到恶意网站时,就会发生开放重定向。现在,攻击者在使用网络钓鱼诈骗或试图窃取访问者凭据时有了一条路径。 

遗憾的是,开放重定向是当今用户最容易受到忽视的威胁之一。开发和安全社区之所以忽视它,主要原因是它对平台本身的影响很小,而且存在漏洞的代码很少。  

尽管如此,用户仍然可能成为这些漏洞的受害者,并且足够坚定的攻击者可以利用用户,事实上,对用户对您的平台的信任程度造成严重损害。 

探索一些开放重定向示例

现在您已经对开放重定向有了基本的了解,我们将对此进行阐述。让我们看看开放重定向攻击在网络上是什么样子的。 

http://mysafesite.com/page.php?to_url=http://attackersite.com

您应该能够从该 URL 中看到,存在漏洞的站点“mysafesite.com”包含一个名为“page”的页面,该页面包含一个接收用户输入的功能(在本例中为查询字符串中的 URL),并使用它来重定向用户。

.NET 开放重定向指南:示例和预防图像

当毫无戒心的用户点击此链接时,浏览器会将其重定向到合法网站。但是,如果服务器未验证 URL 是否正确重定向,则会将用户重定向到恶意网站。此外,由于 URL 包含合法域名,攻击者可以轻松欺骗用户恶意网站的合法性。  

一旦用户进入攻击者的网站,攻击者就可以伪装网站并要求输入凭证。最后,攻击者可以在存储凭证后将用户重定向回合法网站。因此,攻击者成功获取凭证,而受害者却毫不知情。

.NET 开放重定向指南:示例和预防图像

坏消息

您可能已经听到团队中的安全工程师主张解雇您,因为您甚至考虑了如此糟糕的实施。可以理解的是,您可能认为这种实施在当今时代肯定不存在。然而,您会对大量此类实施不佳的解决方案感到惊讶。 

这并不是说这就是开放重定向漏洞的全部。远非如此。尽管开放重定向攻击的复杂程度较低,但它们通常作为网络钓鱼和跨站点脚本攻击套件的一部分存在。这些攻击协同工作,形成一种更复杂、多步骤的攻击,以阻止更具弹性和更强大的平台。 

开放重定向攻击有以下几种: 

基于标头的开放重定向

基于标头的开放重定向攻击直接利用用户输入的易受攻击的代码。与上述示例非常相似,这些攻击在很大程度上取决于平台中重定向背后的逻辑和社会工程。此外,这种攻击不需要 JavaScript 即可奏效,因此它特别邪恶。 

基于 JavaScript 的开放重定向

仅当执行 JavaScript 作为重定向功能的一部分时,才会触发基于 JavaScript 的开放重定向。因此,这种形式的未经验证的重定向不适用于服务器端功能。 

如何预防开放重定向漏洞

为了防止开放重定向漏洞,您必须重新考虑依赖于重定向的解决方案的方法。  

解决开放重定向问题最成功的办法就是取消重定向。当然,对于某些人来说,这可能不是一个可行的解决方案,我们将提供一些替代方案,但我们确实想强调的是,即使您认为需要重定向,但实际上可能并不需要。有更现代、更安全、更可靠的方法可以提供相同的功能,而不会让自己面临这种漏洞。 

但是,如果您必须进行重定向,请考虑限制用户可用的可能的重定向目的地。但是,再次强调,在 HTML 元素中使用固定选项可以大大减轻这些漏洞的影响。 

此外,解析和识别潜在的恶意输入可以清除服务可能收到的许多攻击。例如,如果用户不应该离开您的域并且表现出这样做的意图,这已经是一个危险信号。在 .NET 中,我们可以使用“LocalRedirect”助手实现这样的解决方案。  

public IActionResult SomeAction(string redirectUrl)
{
return LocalRedirect(redirectUrl);
}

只需将助手添加到提供的输入即可。 

如果指定了非本地 URL,则“LocalRedirect”将引发异常。否则,其行为与重定向方法相同。 

进一步

此外,通过使用“Url.IsLocalUrl”方法,我们可以检查提供的 URL 是否是本地的,并在需要处理此类行为时改变应用程序的行为。

private IActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(HomeController.Index), "Home");
}
}

“URL.IsLocalUrl”方法可防止用户无意中重定向到恶意网站。此外,您可以记录在您预期本地 URL 的情况下提供非本地 URL 时提供的 URL 详细信息。记录重定向 URL 可能有助于您诊断重定向攻击。 

除了这些策略之外,您还可以实施防火墙、重定向通知等平台解决方案。 

重要的是要意识到,执行渗透测试、安全审计和保持库更新被认为是良好做法,也是确保平台安全的最佳方式。但是,完成所有这些工作可能既耗时又复杂。这就是为什么我们鼓励您考虑使用 StackHawk。 

结论

正如你所见,解决这些漏洞并不复杂。只是需要时间。  

在所有可能的方面进行漏洞缓解可能非常困难,有时与其他潜在漏洞相比,不值得花费时间进行开发。这就是为什么我们鼓励您为您的团队考虑强大且经过测试的解决方案。 

我们希望本文能帮助您为用户和客户提供更好的解决方案。 

文章来源:.NET Open Redirect Guide: Examples and Prevention

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