ASP.NET Core'da açık yeniden yönlendirme saldırılarını ASP.NET Core

sorgu dize veya form verileri gibi istek yoluyla belirtilen bir URL'ye yeniden yönlendiren bir web uygulaması, kullanıcıları dış, kötü amaçlı bir URL'ye yönlendirmek için üzerinde oynanma olasılığı vardır. Bu kurcalama açık yeniden yönlendirme saldırısı olarak adlandırılan bir saldırıdır.

Uygulama mantığınız belirtilen bir URL'ye her yeniden yönlendiriliyorsa, yeniden yönlendirme URL'sinin üzerinde oynanmadığını doğrulamanız gerekir. ASP.NET Core, uygulamaları açık yeniden yönlendirme (açık yeniden yönlendirme olarak da bilinir) saldırılarına karşı korumaya yardımcı olan yerleşik işlevlere sahip olur.

Açık yeniden yönlendirme saldırısı nedir?

Web uygulamaları, kimlik doğrulaması gerektiren kaynaklara erişen kullanıcıları sıklıkla bir oturum açma sayfasına yönlendirmektedir. Yeniden yönlendirme genellikle bir querystring parametresi içerir, böylece kullanıcı başarıyla oturum açtıktan sonra başlangıçta istenen returnUrl URL'ye döndürülebilirsiniz. Kullanıcı kimlik doğrulamasının ardından başlangıçta isteğine sahip olduğu URL'ye yeniden yönlendirildi.

Hedef URL isteğin sorgu dizesinde belirtilmiş olduğundan, kötü amaçlı bir kullanıcı sorgu dizesini kurcalamış olabilir. Kurcalanmış sorgu dizeleri, sitenin kullanıcıyı dış, kötü amaçlı bir siteye yönlendirmesine olanak sağlar. Bu teknik açık yeniden yönlendirme (veya yeniden yönlendirme) saldırısı olarak anılır.

Örnek bir saldırı

Kötü amaçlı bir kullanıcı, kötü amaçlı kullanıcının bir kullanıcının kimlik bilgilerine veya hassas bilgilerine erişmesine izin vermek için tasarlanmış bir saldırı geliştirebilir. Kötü amaçlı kullanıcı, saldırıya başlamak için url'ye sorgu dize değeri eklenmiş şekilde, sitenizin oturum açma sayfasına bir bağlantıya tıklamaya returnUrl ikna eder. Örneğin, sayfasında oturum açma contoso.com sayfası içeren bir uygulama http://contoso.com/Account/LogOn?returnUrl=/Home/About düşünün. Saldırı şu adımları izler:

  1. Kullanıcı kötü amaçlı bir bağlantıya tıklar http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn (ikinci URL "contoso 1.com" şeklindedir, "contoso.com").
  2. Kullanıcı başarıyla oturum açtığında.
  3. Kullanıcı (site tarafından) için (tam olarak gerçek http://contoso1.com/Account/LogOn siteye benzer kötü amaçlı bir site) yeniden yönlendirildi.
  4. Kullanıcı yeniden oturum alar (kötü amaçlı siteye kimlik bilgilerini sağlar) ve yeniden gerçek siteye yeniden yönlendirildi.

Kullanıcı büyük olasılıkla ilk oturum açma girişiminin başarısız olduğuna ve ikinci girişiminin başarılı olduğuna inanıyor. Kullanıcı büyük olasılıkla kimlik bilgilerinin ele geçirildiklerinden haberdar değildir.

Yeniden Yönlendirme Saldırısı İşlemlerini Açma

Bazı siteler, oturum açma sayfalarına ek olarak yeniden yönlendirme sayfaları veya uç noktalar da sağlar. Imagine açık yeniden yönlendirmesi olan bir sayfası /Home/Redirect vardır. Örneğin, bir saldırgan adresine giden bir e-postada bağlantı [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login oluşturabilir. Tipik bir kullanıcı URL'ye bakar ve url'nin site adınızla başladığını görebilir. Güvenerek bağlantıya tıklarlar. Açık yeniden yönlendirme daha sonra kullanıcıya kimlik avı sitesine gönderir ve bu site sizinkiyle aynı olur ve kullanıcı büyük olasılıkla siteniz olduğuna inandığı sitede oturum açar.

Açık yeniden yönlendirme saldırılarına karşı koruma

Web uygulamaları geliştirmede, kullanıcı tarafından sağlanan tüm verileri güvenilmeyen olarak işle. Uygulamanız, url'nin içeriğine göre kullanıcıya yeniden yönlendirme işlevine sahipse, bu tür yeniden yönlendirmelerin yalnızca uygulama içinde yerel olarak (veya sorgu dizesinde sağlanmalıdır herhangi bir URL'ye değil, bilinen bir URL'ye) yapıldıklardan emin olun.

LocalRedirect

Temel LocalRedirect sınıftan yardımcı yöntemini Controller kullanın:

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

LocalRedirect , yerel olmayan bir URL belirtilirse bir özel durum oluşturur. Aksi takdirde, yöntemi gibi Redirect davranır.

IsLocalUrl

Yeniden yönlendirmeden önce URL'leri test etmek için IsLocalUrl yöntemini kullanın:

Aşağıdaki örnek, yeniden yönlendirmeden önce URL'nin yerel olup olmadığını denetlemeyi gösterir.

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

yöntemi, IsLocalUrl kullanıcıların yanlışlıkla kötü amaçlı bir siteye yönlendirilmesine karşı koruma sağlar. Yerel URL'yi beklenen bir durumda, yerel olmayan bir URL sağlanıyorken sağlanan URL'nin ayrıntılarını günlüğe abilirsiniz. Yeniden yönlendirme URL'lerini günlüğe kaydetme, yeniden yönlendirme saldırılarını tanılamaya yardımcı olabilir.