Share via


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

Sorgu dizesi veya form verileri gibi istek aracılığıyla belirtilen bir URL'ye yönlendiren bir web uygulaması, kullanıcıları dış, kötü amaçlı bir URL'ye yönlendirmek için üzerinde oynanabilir. Bu kurcalama, açık yeniden yönlendirme saldırısı olarak adlandırılır.

Uygulama mantığınız belirtilen BIR URL'ye her yeniden yönlendirildiğinde, yeniden yönlendirme URL'sinin değiştirilmediğini doğrulamanız gerekir. ASP.NET Core, uygulamaların açık yeniden yönlendirme (açık yeniden yönlendirme olarak da bilinir) saldırılarına karşı korunmasına yardımcı olan yerleşik işlevlere sahiptir.

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

Web uygulamaları, kimlik doğrulaması gerektiren kaynaklara eriştiğinde kullanıcıları sık sık oturum açma sayfasına yönlendirir. Yeniden yönlendirme genellikle bir returnUrl querystring parametresi içerir, böylece kullanıcı başarıyla oturum açtıktan sonra başlangıçta istenen URL'ye döndürülebilir. Kullanıcı kimlik doğrulamasından sonra, başlangıçta istediği URL'ye yönlendirilir.

Hedef URL isteğin sorgu dizesinde belirtildiğinden, kötü amaçlı bir kullanıcı sorgu dizesiyle oynanabilir. Üzerinde oynanmış bir sorgu dizesi, sitenin kullanıcıyı dış, kötü amaçlı bir siteye yönlendirmesine izin verebilir. Bu teknik, açık yeniden yönlendirme (veya yeniden yönlendirme) saldırısı olarak adlandırılır.

Örnek bir saldırı

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

  1. Kullanıcı kötü amaçlı bir bağlantıya http://contoso.com/Account/LogOn?returnUrl=http://contoso1.com/Account/LogOn tıklar ("contoso.com değil, ikinci URL "contoso1.com").
  2. Kullanıcı başarıyla oturum açar.
  3. Kullanıcı (site tarafından) öğesine http://contoso1.com/Account/LogOn (tam olarak gerçek siteye benzeyen kötü amaçlı bir site) yönlendirilir.
  4. Kullanıcı yeniden oturum açar (kötü amaçlı siteye kimlik bilgilerini verir) ve gerçek siteye yeniden yönlendirilir.

Kullanıcı büyük olasılıkla ilk oturum açma denemesinin başarısız olduğuna ve ikinci denemesinin başarılı olduğuna inanıyor. Kullanıcı büyük olasılıkla kimlik bilgilerinin tehlikeye girdiğinin farkında değil.

Open Redirection Attack Process

Oturum açma sayfalarına ek olarak, bazı siteler yeniden yönlendirme sayfaları veya uç noktalar sağlar. Uygulamanızın açık yeniden yönlendirmesi /Home/Redirectolan bir sayfası olduğunu düşünün. Saldırgan, örneğin adresine giden [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Loginbir e-postada bağlantı oluşturabilir. Tipik bir kullanıcı URL'ye bakar ve sitenizin adıyla başladığını görür. Bu güvenerek bağlantıya tıklarlar. Açık yeniden yönlendirme daha sonra kullanıcıyı sizinkiyle aynı görünen kimlik avı sitesine gönderir 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ştirirken, kullanıcı tarafından sağlanan tüm verileri güvenilmez olarak değerlendirin. Uygulamanızın kullanıcıyı URL'nin içeriğine göre yönlendiren işlevleri varsa, bu tür yeniden yönlendirmelerin yalnızca uygulamanızda yerel olarak yapıldığından emin olun (veya sorgu dizesinde sağlanacak herhangi bir URL'ye değil, bilinen bir URL'ye).

LocalRedirect

Temel Controller sınıftan LocalRedirect yardımcı yöntemini 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

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

Aşağıdaki örnekte, yeniden yönlendirmeden önce URL'nin yerel olup olmadığının nasıl denetlendiği gösterilmektedir.

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

IsLocalUrl yöntemi, kullanıcıların yanlışlıkla kötü amaçlı bir siteye yönlendirilmesini engeller. Yerel olmayan bir URL sağlandığında sağlanan URL'nin ayrıntılarını yerel URL'yi beklediğiniz bir durumda günlüğe kaydedebilirsiniz. Yeniden yönlendirme URL'lerinin günlüğe kaydedilmesi, yeniden yönlendirme saldırılarının tanılanmasında yardımcı olabilir.