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/About
içeren bir uygulama düşünün. Saldırı şu adımları izler:
- 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"). - Kullanıcı başarıyla oturum açar.
- 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. - 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.
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/Redirect
olan bir sayfası olduğunu düşünün. Saldırgan, örneğin adresine giden [yoursite]/Home/Redirect?url=http://phishingsite.com/Home/Login
bir 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.
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin