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