Uygulama Güvenliği
Host Header Injection Zafiyeti
Günümüz web dünyasında, bir sunucu üzerinde birden çok uygulamanın hizmet verdiği durumlarla sık sık karşılaşmaktayız. Aynı sunucu üzerinde birden fazla uygulama "virtual host" tanımlamaları ile servis verebilir. Bu durumda, tüm bu uygulamaların IP adresi aynı olacağı için sunucuya gelen isteğin hangi uygulamaya yönlendirileceği bilgisi, HTTP isteğinde yer alan "Host" başlık bilgisi üzerinden belirtilmektedir.
Host Header Injection zafiyetinin ortaya çıkmasındaki en büyük sebep, Host başlık bilgisinin manipüle edilemeyeceği düşüncesidir. Host başlık bilgisi, gün sonunda HTTP isteğinde yer alan bir kullanıcı girdisi olduğu için buradan gelen veriye güvenilmesi ve kontrol edilmeden işletilmesi durumunda bu zafiyetin varlığından söz ediyor olacağız.
Uygulamamız üzerinde, bazı işlemler gerçekleştirirken host bilgisine ihtiyaç duyabiliriz. Örneğin, parola sıfırlama fonksiyonunda kullanıcı için bir parola sıfırlama bağlantısı oluşturduğumuzu düşünelim. İlgili kullanıcıya ait bir token oluşturuyoruz ve bu token'ı bağlantımıza ekleyerek, kullanıcıya mail gönderiyoruz.
Yapılan istek:
POST /password-reset HTTP/1.1
Host: example.com
…
email=test@example.com
Mail'de gelen bağlantı: https://example.com/password-reset?token=TOKEN_DEGERI
Kullanıcı, mailden gelen bağlantıyı ziyaret ederek parolasını değiştiriyor. Eğer bu akışta, kullanıcıdan gelen "Host" başlık bilgisine güveniliyorsa, saldırgan hedeflediği kişi için parola sıfırlama işlemi yaparken kendi kontrolünde olan sunucuyu "Host" başlığı üzerinden gönderdiğinde parola sıfırlama bağlantısının, kendi gönderdiği adres ile oluşmasını sağlayabilir.
Yapılan istek:
POST /password-reset HTTP/1.1
Host: hacker.com
…
email=test@example.com
Mail'de gelen bağlantı: https://hacker.com/password-reset?token=TOKEN_DEGERI
Maili alan kullanıcının, gelen bağlantıyı ziyaret etmesi durumunda parola sıfırlaması için kullanacağı token bilgisi, saldırganın eline geçecektir.
Host Header Injection zafiyeti üzerinden:
- Önbellek zehirlenmesi
- Parola sıfırlama bağlantılarının zehirlenmesi
- Yönlendirmelerden kaynaklı olarak SSRF saldırıları gerçekleştirilebilir.
Zafiyetin giderilmesi için:
- Absolute URL'ler yerine Relative URL'ler kullanılmalıdır.
Örneğin:
Absolute URL: <a href = "https://www.example.com/src/sample.html">
Relative URL: <a href = "/src/sample.html">
- Kullanıcıdan gelen host başlık bilgisine güvenilmemelidir. Örneğin, host bilgisi sunucu tarafında bir konfigürasyon dosyasına yazılabilir ve ihtiyaç duyulması durumunda buradan okunabilir.
- Host başlık bilgisi beyaz liste yaklaşımı ile kontrol edilmelidir. Gelen host bilgisi, sadece izin verdiğiniz host'lar içerisinde yer alıyorsa kabul edilmelidir.
- Host başlık bilgisinin kontrol edildiği durumlarda saldırganlar, load blancer veya reverse proxy altyapılarında kullanılan "X-Forwarded-Host" gibi başlık bilgilerini isteğe dahil ederek bu durumu atlatmaya çalışabilir. Bu başlık bilgileri, siz özel olarak belirtmeseniz bile varsayılan olarak desteklenebilir. Bu sebeple, host başlık bilgisinin ezilmesine olanak tanıyan bu başlık bilgilerinin desteklenmediği kontrol edilmelidir.
Kaynaklar:
- https://portswigger.net/web-security/host-header
Harika içerik 👍 elinize sağlık