Bu makalede bir URL’nin yeniden yönlendirilmesi ile bir sisteme nasıl zarar verebileceği konusu yani “Open Redirect” zafiyeti detaylı şekilde kadar incelenecektir. 

URL Nedir?

Uniform Resource Locator (URL) internet üzerindeki herhangi bir dosyanın veya kaynağın benzersiz adresi anlamına gelir. Bu bir resim dosyası, HTML sayfası veya bir stil (CSS) dökümanı olabilir.

URL’ler birtakım segmentlere ayrılmıştır. Protokol, domain/host adı, port ve path -dosya yolu vb. olarak belirtilen bu bölümler, web tarayıcısına hedef kaynağa nasıl ulaşacağına dair talimatlar ile yol gösterir.

open redirect

 

Open Redirection Nedir?

Birçok geliştirici web sitelerini kodlarken bazen dış kaynaklardan veri talep etmek için bazen de kullanıcılarını farklı lokasyonlara yönlendirmek için bazı basit fonksiyonlar kullanırlar. PHP’de header(), Python’da redirect() gibi.

Ancak bu yönlendirme işlemleri çoğu zaman gereken şekilde filtrelenmediği ve kullanıcıların istedikleri veriyi girmelerine izin verdikleri için Open Redirect” zafiyeti oluşur.

Kendi başına küçük bir zafiyet gibi görünse de “RCE” ve “XSS” gibi zaafiyetlerle birlikte  kullanılabildiğinden etkili bir güvenlik zafiyetine dönüşebilmektedir. 

Konuyu daha iyi anlatabilmek adına basit bir örnek inceleyelim.

redirect

 

Yukarıdaki php kod bloğunda header() fonksiyonu kullanılarak $_GET superglobali ile yakalanan url parametresinin değerine basit bir yönlendirme yapıldığı görülmektedir. Index.php sayfasından gönderilen url parametresinin değeri ( https://www.infinitum.com.tr ) yakalanarak bu adrese sayfanın yönlendirildiği, kod bloğu localhost’da çalıştırıldığında daha net görülebilmektedir: 

web

Yukarıdaki görselde ilgili link’e tıklandığında gerçekleşen http isteği bir web proxy aracı ile incelenirse:

open redirect zafiyeti

Proxy ile yakalanan istekte görüleceği üzere php kod bloğunda herhangi bir filtreleme işlemi yapılmadığından bu aşamadaki url parametresi istenen herhangi bir adrese yönlendirilebilir.

redirected url

Bu aşamada url= parametresinin değeri http://www[.]google[.]com olarak değiştirilip, istek sunucuya yollandığında  işlemin başarılı bir şekilde gerçekleştiği görülecektir:

google yonlendirildi

Encoded Redirection

Bazı durumlarda geliştiriciler yönlendirilecek parametrenin değerini daha güvenli olması açısından URL-Encoding veya Base-64 Encoding yöntemleri ile değiştirirler. Ancak bu yöntemler tek taraflı bir maskeleme yöntemi olduğu için kullanılan metodun bilinmesi halinde yine url yönlendirme zafiyeti istismarında kullanılabilirler. Şimdi bu iki farklı konuyu ayrı ayrı inceleyelim.

 

Url Encoded Redirection

Url Encoding, bazı zararlı (<  > gibi) karakterlerin url  içine gömülmesinin engellenmesi için geliştiriciler tarafından en çok kullanılan encoding yöntemlerinden biridir. Aşağıdaki php kodu incelendiğinde konu biraz daha netleşecektir.

encoded  open redirect

Buradaki kod parçası ilk bölümden de hatırlanacağı üzere php dilinde yazılmış bir yönlendirme kodu. İlk örnekten farklı olarak, bu kod önceden encode edilmiş url parametresinden gelen veriyi urldecode() fonksiyonu ile çözüp ilgili adrese yönlendirmektedir. Bu kodlar localhost’da çalıştırılarak yönlendirme işlemleri daha net görülebilir:

encoded open redirection

Yukarıda görülen web sayfasında ilgili http isteği bir web proxy ile incelendiğinde url encode yöntemi ile maskelenmiş url görülebilmektedir:

encoded

Görselde url parametresinin değeri olan https://www.infinitumit.com.tr/ ’nin basit bir şekilde url encode işleminden geçirildiği görülmektedir. Bu aşamada yönlendirilmek istenen adres ilgili alana girilmeden önce url encode ile maskelenmelidir.

open redirection decode

Burp Suite’in Decoder aracı ile veya başka herhangi bir araç ile yukarıda görüldüğü gibi url encode işlemi yapılarak ilgili değer elde edilebilir.

sifreli urle yonlendirme

Son olarak elde edilen değer ilgili alana (url=) girildikten sonra http isteği sunucuya tekrar gönderildiğinde yönlendirmenin başarılı bir şekilde gerçekleştiği görülecektir.

google yonlendirildi

 

Base64 Redirection

URL Encoding, geliştiricilerin projelerinde uyguladıkları tek encoding yöntemi değildir. Daha güvenli bir yönlendirme işlemi için base64 encoding yöntemi de geliştiriciler tarafından kullanılmaktadır. Önceki bölümlerde kullanılan php kod bloğu tekrar ele alınacak olursa:

base64 open redirection

Bu defa basit yönlendirme işleminde index.php’den gelen base64_encode() fonskiyonu ile maskelenmiş url parametresinin değeri, $_GET supergloabal’i ile yakalanıp base64_decode() fonksiyonu ile tekrar normal haline dönüştürülmektedir. İlgili kod localhost’ta çalıştırıldığında tarayıcının alt panelinde url’in base64 ile maskelendiği görülebili

base64 open redirection

Bu aşamada yine bir web proxy kullanarak http isteği incelendiğinde yönlendirilen adresin base64 değeri tekrardan görülebilmektedir:

base64 url

Bir base64 encoder yardımı ile yönlendirme yapılmak istenen adresin (http://www[.]google[.]com) base64 değeri elde edilebilir:

base64  encoding

Elde edilen base64 değeri web proxy’de yakalanan url parametresi değeri ile değiştirilip istek sunucuya gönderildiğinde işlemin başarılı şekilde gerçekleştiği görülecektir:

base64 encoded

google yonlendirildi

Open Redirect Zafiyetine Karşı Alınabilecek Önlemler

  • Kullanıcılardan gelen veriler uygun şekilde filtrelenerek doğrulanmalıdır.
  • Geliştiriciler güvenilir URL adreslerinden oluşan listeler ile çalışmalıdır.
  • Web uygulaması, kullanıcı güvenilir olmayan bir URL’e yönlendirme yapmaya çalıştığında bir uyarı ile bunu bildirmelidir.
  • Geliştiriciler bir yönlendirme fonksiyonunu kullanmak yerine, özel linkler ile bağlantı kurmayı öncelik edinmelidir.