Merhabalar ben saldırı timlerinden Bunjo, bu konuda "Host Header Injection" web zafiyetinin neden kaynaklandığını,
nasıl sömürülebileceğini anlatacağım. Tanımlar internetten alınmıştır.
Host Header Injection
Host header injection, bir web uygulamasındaki güvenlik açıklıklarından biridir. Bu tür bir zafiyet, HTTP taleplerinin başlık bölümündeki "Host" alanını manipüle etmek suretiyle ortaya çıkar. HTTP başlıkları, bir isteği veya yanıtı tanımlayan metin bilgilerini içerir.
Normalde, tarayıcılar ve sunucular arasındaki iletişimde "Host" başlığı, kullanıcının ziyaret ettiği web sitesinin adını veya IP adresini içerir. Ancak, bazı durumlarda, web uygulamaları doğrudan bu başlığı kontrol etmeyebilir veya güvenlik kontrollerini yeterince uygulamayabilir.
Host header injection saldırganların, kullanıcı girişi aracılığıyla veya doğrudan HTTP isteği başlıklarını değiştirerek bu "Host" başlığını manipüle etmelerine izin verir.
Şimdi ise bu zafiyeti barındıran php ile bir site kodlayalım.
Xampp kurulumunu yaptım ve dosya ağacım bu şekilde.
index.php
PHP:
<?php
echo $url = $_SERVER["HTTP_HOST"];
?>
server kullanarak ekrana hostu yazdırıyoruz.
ben localhost içerisinde olduğum için locahost yazdı. Burada öğrenmeniz gereken şey php kodunun sunucunun
kendi ip adresini ekrana yazdırmak yerine url kısmında yazan hostu ekrana direkt bastırmasıydı.
şimdi de bir header ile yönlendirme kodlayalım.
PHP:
<?php
echo $url = $_SERVER["HTTP_HOST"];
header("Location: test.php")
?>
yönlendirme başarılı oluyor mu diye test.php dosyamıza bir kod yazalım.
test.php
PHP:
<?php
echo "yonlendirme basarili";
?>
index.php uzantısına gidelim.
yönlendirmenin başarılı olduğunu anladık.
şuan bu kodun herhangi bir işlevi yok.
yönlendirme şu şekilde de yapılabilir fakat bu sefer güvenlik zafiyeti ortaya çıkıyor.
PHP:
<?php
$url = "http://".$_SERVER["HTTP_HOST"]."/host_header_injection/test.php";
header("Location: $url")
?>
yukarıda bahsettiğim gibi burada host dinamik olarak alınıyor yani girilen uzantıda yazan host kısmı host olarak kabul ediliyor.
Bu size gayet doğal bir şey gibi gelebilir fakat böyle yapılmaması lazımdı. Host değişkenine başka değerler girerek kodu manipüle edebiliriz.
bu şekilde yönlendirmeyi test edelim.
evet yine bir sorun yaşamadan yönlendirme işlemini yaptık.
Şimdi ise açığın varlığını bilmeden açığı nasıl tespit edeceğinizi anlatacağım.
burp suite ile araya giriyorum.
gördüğünüz üzere isteği düşürdük.
forward diyerek isteği yolluyorum.
yönlendirme işlemi yapıldı.
daha detaylı anlatmak adına isteği repeatere yolluyorum ve isteği gönderiyorum.
Response:
CoffeeScript:
HTTP/1.1 302 Found
Date: Sat, 03 Feb 2024 09:45:37 GMT
Server: Apache/2.4.58 (Unix) OpenSSL/1.1.1w PHP/8.0.30 mod_perl/2.0.12 Perl/v5.34.1
X-Powered-By: PHP/8.0.30
Location: http://localhost/host_header_injection/test.php
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8
burada incelediğiniz zaman 302 found ve Location headerini görüyorum.
Rich (BB code):
Location: http://localhost/host_header_injection/test.php
burada bir yönlendirme işlemi yapılmış.
request kısmında host için verilen parametreyi kurcalayarak farklı bir yere yönlendirme yapmaya çalışıyorum.
evet google için yönlendirme başarıyla gerçekleşti ve google içerisindeyiz. Bu da bize zafeyin kaynaklandığını gösteriyor.
şimdi ise bu zafiyeti nasıl sömürebileceğinizi anlatayım.
Burada bizim kodumuzun bir işlevi yok ama siz bu açığa şifre sıfırlama gibi yerlerde karşılaşırsanız eğer kendiniz bir sunucu oluşturursunuz örneğin bunjo.com olsun
ve istediğiniz kullanıcı örneğin admin veya herhangi bir yetkiye sahip bir kullanıcıya şifre sıfırlama isteği yollarken host kısmına kendi sunucunuzu yazarsınız.
şifre sıfırlamaları php?token=TOKEN gibisinden veya başka bir parametre kullanarak yapıldığı için
http://bunjo.com/host_header_injection/test.php?token=kullanıcı_tokeni
şeklinde sıfırlama isteği yolladığınız anda bu istek mail ile gidecek kullanıcı da bu bağlantıyı kullandığında kendi sitenize hedef sitedeki gibi bir şifre sıfırlama ekranı yazarsınız.
Kullanıcının şifresini tokenini artık ne varsa elde edersiniz.
açığın nasıl önleneceğini de anlatacaktım fakat konuyu burada sonlandırmam gerekiyor, daha sonra düzenleyip eklerim.
okuyan herkese teşekkür ederim.