İletişim

Açık Yönlendirme (Open Redirect) Nedir?

Kısa tanım

Açık yönlendirme (open redirect), bir sitenin URL parametresiyle aldığı hedef adrese, adresi doğrulamadan yönlendirme yapması sonucu oluşan güvenlik açığıdır. Bağlantı güvenilir alan adıyla başladığı için kullanıcılar, e-posta filtreleri ve arama motorları onu o siteye ait sanır; oysa ziyaretçi kimlik avı veya spam sayfasına gönderilir. Açık, oturum açma ve OAuth akışlarında token sızdırmaya da zemin hazırlayabilir.

Diğer adları: Open Redirect, açık yönlendirme açığı, unvalidated redirect, doğrulanmamış yönlendirme

Doğrulanmayan url parametresi yüzünden güvenilir sitenin ziyaretçiyi 302 ile saldırganın kimlik avı sayfasına yönlendirdiği sıra diyagramı

Güvenilen alan adının ödünç alınması

Birçok sitede kullanıcıyı bir işlemden sonra başka bir sayfaya gönderen parametreler bulunur: giriş sonrası dönülecek sayfa için ?next=, dış bağlantı sayacı için ?url=, kampanya takibi için ?redirect=. Sunucu bu parametredeki değeri kontrol etmeden Location başlığına yazarsa, dünyadaki herkes sizin alan adınızla başlayıp istediği yere giden bir bağlantı üretebilir.

Bu bağlantı ilk bakışta tamamen meşru görünür. Kullanıcı adres çubuğunda ya da e-postadaki bağlantının üzerinde bankasının veya tanıdığı bir markanın alan adını görür, tıklar ve bir anda sahte bir giriş sayfasına düşer. OWASP de bu nedenle doğrulanmamış yönlendirmeleri kimlik avına (phishing) güvenilirlik kazandıran bir araç olarak tanımlar. Açığın kendisi sitenizden veri sızdırmaz; ama itibarınızı başkasının saldırısına kalkan yapar.

SEO ve alan adı itibarı açısından

Google, açık yönlendirmelerin spam kampanyalarında nasıl kullanıldığını yıllar önce kendi blogunda anlatmıştı: spam yapan kişiler, e-postalarda, forumlarda ve yorumlarda kendi adresleri yerine sizin yönlendirme URL'lerinizi paylaşır; bağlantı sizin sitenize gidiyor gibi görünür, sonunda ise onların sayfasına varır. Bunun pratikteki sonuçları şunlardır:

  • Alan adınız spam ve kimlik avı bağlantılarıyla birlikte anılmaya başlar; e-posta filtreleri ve güvenlik servisleri alan adınıza daha şüpheyle bakabilir.
  • Kötüye kullanılan yönlendirme URL'leri dizine girebilir. site: aramasında tanımadığınız sonuçlar, özellikle sitenizle ilgisiz ticari veya yetişkin içerikli kelimelerle eşleşen adresler, bir uyarı işaretidir.
  • Sorun büyürse kullanıcıların güvenlik uyarısı görmesi, markanın kendisine zarar verir.

Bu, sitenin kendisinin ziyaretçiyi gizlice başka yere gönderdiği ve Google spam politikalarında ayrıca tanımlanan “sinsi yönlendirme” ile karıştırılmamalıdır; açık yönlendirmede niyet site sahibine değil, açığı kullanan üçüncü kişiye aittir. Meşru bir yönlendirme sunucuda sabit tanımlıdır, açık yönlendirmede hedefi ziyaretçinin getirdiği URL belirler.

Oturum açma ve OAuth akışlarında risk büyür

Yönlendirme bir kimlik doğrulama akışının parçası olduğunda, açık yönlendirme yalnızca sahte sayfaya göndermekle kalmaz. OAuth'ta yetkilendirme sunucusu, işlem bitince kullanıcıyı uygulamanın redirect_uri adresine yetkilendirme kodu veya token ile gönderir. Kayıtlı yönlendirme adresi gevşek eşleştirilirse ya da izin verilen bir sayfada açık yönlendirme varsa, kod veya erişim token'ı yanlış yere taşınabilir. Bu yüzden OAuth sağlayıcılarında yönlendirme adresleri tam eşleşmeyle kaydedilmeli, joker karakterlerden kaçınılmalıdır.

Güvenli yönlendirme tasarımı

  1. İhtiyacı sorgulayın: Kullanıcı girdisine bağlı yönlendirme gerçekten gerekli değilse kaldırın. Dosya indirme gibi işlemlerde bağlantıyı doğrudan dosyaya verin.
  2. Adres yerine kimlik kullanın: Parametrede tam URL yerine kısa bir anahtar taşıyın (?to=fiyatlar) ve sunucuda bu anahtarı izinli bir adrese eşleyin.
  3. Site içi göreli yol kabul ediyorsanız, ayrıştırarak doğrulayın: “/ ile başlıyor mu?” veya “alan adımızı içeriyor mu?” gibi metin kontrolleri yanıltıcıdır. Adresi tarayıcının kullandığı URL ayrıştırıcısıyla çözüp origin'i karşılaştırmak daha güvenilirdir.
  4. Dış hedefler için izin listesi ve ara sayfa: Dışarıya yönlendirme gerekiyorsa yalnızca bilinen alan adlarına izin verin; gerekirse kullanıcıya “siteden ayrılıyorsunuz” diyerek hedefi açıkça gösteren bir ara sayfa kullanın.
// Riskli
res.redirect(req.query.next);

// Daha güvenli: yalnızca aynı origin içindeki yollara izin ver
const base = "https://example.com";
const target = new URL(String(req.query.next ?? "/"), base);
res.redirect(target.origin === base ? target.pathname + target.search : "/");

İlgili terimler

← Sözlüğe dön