Open Redirect
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.
Basit URL Yapısı
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.
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:
Yukarıdaki görselde ilgili link’e tıklandığında gerçekleşen http isteği bir web proxy aracı ile incelenirse:
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.
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:
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.
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:
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:
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.
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.
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.
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:
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ülebilir.
Bu aşamada yine bir web proxy kullanarak http isteği incelendiğinde yönlendirilen adresin base64 değeri tekrardan görülebilmektedir:
Bir base64 encoder yardımı ile yönlendirme yapılmak istenen adresin (http://www[.]google[.]com) base64 değeri elde edilebilir:
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:
Open Redirect Zafiyeti Önlemleri
- 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.