- Konu sahibi
- #1
Açık yönlendirme açığı, uygulamanın kullanıcıdan aldığı bir adresi yeterince doğrulamadan tarayıcıyı başka bir siteye yönlendirmesidir. Saldırgan, güvenilir alan adınız üzerinde bulunan bir bağlantıyı kullanarak ziyaretçiyi sahte giriş sayfasına, zararlı içeriğe veya kimlik avı sitesine gönderebilir. Örneğin
Uygulamalarda girişten sonra kullanıcının önceki sayfaya dönmesi, kampanya bağlantılarının işlenmesi veya bir dış kaynağa geçiş gibi amaçlarla URL parametreleri kullanılabilir. Güvensiz uygulama, parametredeki adresi doğrudan HTTP yönlendirmesine dönüştürür:
Saldırgan aynı parametreye kendi alan adını koyduğunda sunucunun
Bir giriş formu, başarılı oturum açmadan sonra
Aşağıdaki karar yaklaşımı, yönlendirme davranışını seçerken kullanılabilir:
Serbest hedef URL yerine sunucuda tanımlı hedef kimlikleri kullanmak kontrolü sadeleştirir: hesap kimliği /hesabim yoluna, yardim kimliği /yardim yoluna eşlenir. Bilinmeyen kimlik sabit güvenli hedefe döner. Yerel yol kabul edilmesi gerekiyorsa yalnız ilk karakterin / olması yeterli değildir; //, ters bölü ve kodlanmış biçimlerin tarayıcı tarafından nasıl çözüldüğü de değerlendirilmelidir. Harici yönlendirme gerçekten gerekiyorsa serbest URL kabul etmek yerine izin verilen alan adlarını açık bir listeyle sınırlayın. Alan adı karşılaştırmasını yalnızca metin içinde arama yaparak gerçekleştirmeyin;
Başarılı düzeltmede yerel hedef çalışmaya devam eder; reddedilen değer ise harici siteye gitmez ve güvenli bir yerel hedefe yönlenir ya da hata yanıtı alır. Yönlendirme zincirinin başka bir uç noktaya devredilmesi, istemci tarafında kodlanmış bir adres kullanılması veya bir URL kısaltıcının devreye girmesi durumunda tek bir kontrol noktası yeterli olmayabilir.
Yalnız alan adının içerilip içirilmediğini kontrol etmek: Bir metinde güvenilir alan adının geçmesi, hedefin güvenilir olduğu anlamına gelmez. Konak bileşeni ayrıştırılarak karşılaştırılmalıdır.
Sadece JavaScript doğrulaması yapmak: Saldırgan isteği doğrudan gönderebilir. Tarayıcıdaki form kontrolü, sunucu tarafındaki doğrulamanın yerine geçmez.
Kodlamayı göz ardı etmek: URL kodlaması, büyük-küçük harf, çift kodlama ve farklı URL biçimleri basit metin kontrollerini yanıltabilir. Uygulamanın URL ayrıştırıcısıyla normalize edilmiş değeri doğrulayın.
Her başarısız değeri kullanıcı girdisine geri yönlendirmek: Hatalı hedefte tekrar aynı parametreyi kullanmak, açığı düzeltmek yerine başka bir yönlendirme döngüsü oluşturabilir. Sabit ve yerel bir geri dönüş hedefi belirleyin.
https://example.com/giris?next=https://sahte-site.example isteği, uygulama next değerini kontrol etmeden kullanıyorsa yönlendirme açığı oluşturur.Nasıl çalışır?
Uygulamalarda girişten sonra kullanıcının önceki sayfaya dönmesi, kampanya bağlantılarının işlenmesi veya bir dış kaynağa geçiş gibi amaçlarla URL parametreleri kullanılabilir. Güvensiz uygulama, parametredeki adresi doğrudan HTTP yönlendirmesine dönüştürür:
Kod:
İstek hedefi: /giris?next=https://baska-alan.example
Örnek yanıt başlıkları:
HTTP/1.1 302 Found
Location: https://baska-alan.example
Saldırgan aynı parametreye kendi alan adını koyduğunda sunucunun
Location yanıtı bu adrese dönüşür. Kullanıcı bağlantıyı güvenilir sitenin alan adıyla başladığı için güvenli sanabilir; ancak tarayıcı sonrasında harici adrese gider. Açık yönlendirme tek başına sunucuya kod çalıştırmaz, fakat kimlik avı, güvenlik uyarılarının aşılması ve bazı saldırı zincirlerinin desteklenmesi için kullanılabilir.Somut örnek ve güvenli karar
Bir giriş formu, başarılı oturum açmadan sonra
next parametresindeki sayfaya dönüyor olsun. Kullanıcının kendi sitenizdeki /hesabim sayfasına dönmesine izin vermek makul bir ihtiyaçtır; ancak https://baska-alan.example gibi farklı bir alan adına yönlendirmek gerekmiyorsa reddedilmelidir.Aşağıdaki karar yaklaşımı, yönlendirme davranışını seçerken kullanılabilir:
| Gelen değer | Karar | Gerekçe |
|---|---|---|
/hesabim | İzin ver | Yerel, kökten başlayan yol |
hesabim | İhtiyaca göre normalize et veya reddet | Göreli yolun yorumlanması bağlama bağlı olabilir |
https://example.com/yardim | Yalnız açık izin varsa izin ver | Harici alan adı kontrol gerektirir |
//baska-alan.example | Reddet | Şema belirtilmemiş olsa da harici konağa işaret edebilir |
Serbest hedef URL yerine sunucuda tanımlı hedef kimlikleri kullanmak kontrolü sadeleştirir: hesap kimliği /hesabim yoluna, yardim kimliği /yardim yoluna eşlenir. Bilinmeyen kimlik sabit güvenli hedefe döner. Yerel yol kabul edilmesi gerekiyorsa yalnız ilk karakterin / olması yeterli değildir; //, ters bölü ve kodlanmış biçimlerin tarayıcı tarafından nasıl çözüldüğü de değerlendirilmelidir. Harici yönlendirme gerçekten gerekiyorsa serbest URL kabul etmek yerine izin verilen alan adlarını açık bir listeyle sınırlayın. Alan adı karşılaştırmasını yalnızca metin içinde arama yaparak gerçekleştirmeyin;
example.com.saldirgan.example veya benzeri bir değer güvenilir alan adı değildir.Açığı kontrol etme ve düzeltme
- Uygulamanızda
next,url,redirect,returnveya benzeri parametreleri arayın. Giriş, çıkış, bağlantı izleme ve hata sayfalarındaki yönlendirme noktalarını birlikte inceleyin. - Yetkili test ortamında parametreyi önce
/hesabim, sonrahttps://example.comgibi kontrollü bir değerle deneyin. YanıtınLocationbaşlığını veya tarayıcının son adresini kontrol edin. - Harici bir adrese geçtiğini görürseniz parametrenin doğrudan yönlendirmeye aktarıldığı noktayı bulun. Yalnız istemci tarafındaki kontrolü yeterli saymayın; karar sunucu tarafında da uygulanmalıdır.
- Harici yönlendirme gerekmiyorsa tercihen sabit sunucu içi hedef kimliklerini eşleyin; serbest yol kullanılıyorsa ayrıştırılmış sonucun beklenen origin içinde kaldığını ve izin verilen yolu gösterdiğini doğrulayın. Değer geçersizse yönlendirmeyi iptal edip sabit bir yerel sayfa döndürün.
- Harici yönlendirme gerekiyorsa şema, konak ve gerekirse bağlantı noktasını ayrıştırarak izin verilen alan adı listesiyle karşılaştırın. Sonuçta oluşturulan hedefi tekrar doğrulayın.
- Düzeltmeden sonra hem izin verilen yerel yolu hem de harici alan adı, şema eksik adres ve alan adı benzeri aldatıcı değerlerle yeniden test edin.
Başarılı düzeltmede yerel hedef çalışmaya devam eder; reddedilen değer ise harici siteye gitmez ve güvenli bir yerel hedefe yönlenir ya da hata yanıtı alır. Yönlendirme zincirinin başka bir uç noktaya devredilmesi, istemci tarafında kodlanmış bir adres kullanılması veya bir URL kısaltıcının devreye girmesi durumunda tek bir kontrol noktası yeterli olmayabilir.
Sık yapılan hatalar
Yalnız alan adının içerilip içirilmediğini kontrol etmek: Bir metinde güvenilir alan adının geçmesi, hedefin güvenilir olduğu anlamına gelmez. Konak bileşeni ayrıştırılarak karşılaştırılmalıdır.
Sadece JavaScript doğrulaması yapmak: Saldırgan isteği doğrudan gönderebilir. Tarayıcıdaki form kontrolü, sunucu tarafındaki doğrulamanın yerine geçmez.
Kodlamayı göz ardı etmek: URL kodlaması, büyük-küçük harf, çift kodlama ve farklı URL biçimleri basit metin kontrollerini yanıltabilir. Uygulamanın URL ayrıştırıcısıyla normalize edilmiş değeri doğrulayın.
Her başarısız değeri kullanıcı girdisine geri yönlendirmek: Hatalı hedefte tekrar aynı parametreyi kullanmak, açığı düzeltmek yerine başka bir yönlendirme döngüsü oluşturabilir. Sabit ve yerel bir geri dönüş hedefi belirleyin.