HTTP Host Header Attack

Hatırlanması Gereken Pratik Noktalar

  1. Host hedaerını test ederken önce tamamen değişik bir host girmeyi deneyebiliriz.
  2. Hata alıyorsak header sabit kalırken yanına port kısmına port yerine :port şeklinde farklı birşeyler girebiliriz.
  3. Bu da olmazsa hostu içeren notvuln-site.com gibi bir yeni site adresi deneyebiliriz.
  4. Denenebilecek bir diğer konu da Host headerını tekrar yazmak. Bazı yorumlayıcılar ikincisini esas alabiliyor.
    1. Bunu denerken birinci hostun başına boşluk koyarak da deneyebiliriz.
  5. Daha sonra denenebilecek bir diğer konu da requestte / ile gösterilen kısmı tam url yapıp host headerındaki kontrolü atlatmaya çalışmak.
  6. Host header yerine localhost veya local ip’lerden birisini veya sitenin ip’sini girmeyi de deneyebiliriz. Bu da erişilemeyecek kısımlara erişmemizi sağlayabilir.
  7. Son yöntem de X-Forwarded-Host , X-Forwarded-Server, X-HTTP-Host-Override ve Forwarded Headerlerını set ederek Host headerını override etmeyi deneyebiliriz.
  8. Bu saldırıların çalışması için host header’ının bir yerde kullanılıyor ve yansıtılıyor olması gerekir. Örnek olarak password sıfırlamada bu header kullanılabilir veya mail atarken kullanılabilir veya cachelenen bir veride kullanılabilir.

Bu saldırı header kısmındaki Host headerını kullanarak yapılır. Bir ip adresinde, bir sunucuda birden fazla site barındığı için bu host hedaerları kullanılabilir. Sunucu bu header yardımıyla veya load balancer bu header yardımıyle yönlendirmeler yapabilir. Bu yüzden bu header’dan zaafiyetler çıkabilir karşımıza.

  1. Host headerını değiştirip sitenin nasıl davrandığına bakabiliriz. Bazen sistemler bu alanda bozulma olduğunda ne yapacağını bilemediği için bir varsayılan veya fallback adresine yönlendirir. Bazen de Invalid Host Header hatası gelir.
  2. Bazı SSRF teknikleri, eksik kontrol sebebiyle uygulanabilir olur. Örnek olarak port kısmından payload gönderebilir ⇒ vuln-site.com:bad-stuf-here veya aynı domaini içeren başka bir domainle host değiştirilebilir ⇒ notvuln-site.com veya daha güvensiz bir subdomain ile bu kısım atlatılabilir ⇒ hacked.vuln-site.com
  3. Belirsiz Host hedaerları gönderilebilir.
  • X-Host
  • X-Forwarded-Server
  • X-HTTP-Host-Override
  • Forwarded

Öncelikle Host Header saldırılarını mümkün kılan headerdan bahsedelim. IPV4 sayısının kısıtlı olmasından dolayı artık bir makinede birden fazla web uygulaması barınabiliyor. Bu yüzden load balancer’lar reverse proxy’ler vs bu headerı kullanarak ayırt edebiliyor.

Bu headerı kullanarak password reset saldırıları, SSRF saldırıları ve XSS’den SQL injection’a kadar birçok soruna sebep olabilir.

Saldırılarda kullanılan temel yöntemler :

  1. Host headerı doğrudan değiştirmek
  2. Host hedaerın altına bir tane daha host yazıp tepkisini görmek
    1. Bunu denerken ilk headerın başına boşluk koymak da denenebilir.
  3. Host headerın adresin sonuna port eklemek :port şeklinde istediğimizi yazıp yazamadığımıza bakabiliriz.
  4. X-Forwarded-Host gibi headerlarla override etmek
  5. GET /admin HTTP/1.1 adresindeki “/” kısmını tam URL ile değiştirdiğimizde bazı sunucular Host kısmını kontrol etmez. Böylece oraya yazdığımız kısmı istediğimiz gibi değiştirip SSRF yaptırabiliriz.
  6. Host kısmına localhost veya networkün içindeki iplerden bir tanesini girmek 192.168.0.32 örneği gibi.

Saldırıların genel mantığı bu header’ın kullanılması esnasında yetersiz kontrol yapılmasından kaynaklanır.

Labların içerikleri :

  • Password reset using host : Password reset token gönderen yerde hostu değiştirip passwordu bizim adresimize göndermesini sağlayabiliriz. Örnek olarak hoste evilsite.com girdiğimizde tokeni evilsite.com/forgot-password?token=sakdh2131khkljh12g3jk şeklinde gönderebilir. Kullanıcı da bilmeden bu linke tıklarsa bizim sitemize böyle bir istek atmış olur ve biz de tokeni öğrenmiş oluruz.
  • Password reset using host and middleware : Password tokeni gönderen isteğin Host headerını X-Forwarded-For ile tekrar yazıp bir önceki labda uyguladığımız sistemi uyguladık. Başka bir kullanıcının kullanıcı adını girerek hostu değiştirip token elde etmiş olduk.
  • Password reset dangling html : Burada password reset yapmak istediğimizde bir token gelmediğini onun yerine mail olarak yeni passwordun geldiğini gördük. Ancak kullanılan antivirüs, mailin içindeki linklere otomatik tıklayıp zararlı olup olmadığını kontrol ediyordu. Bu yüzden biz de password reset işlemini yapan yerde yukarıdaki payload yöntemlerini denedik ancak yalnızca site.com:port değişikliğinde sunucunun sorun çıkartmadığını gördük. Bu durumda da port yerine ‘ ><a href=”//zararlisite.com/? şeklinde belirsiz html’i gömdük. Daha sonra da bunu kullanıcıya mail olarak attık. Kullanıcının antivirüsü hem linke otomatik olarak tıkladı ve şifre dahil bütün bilgiler bizim sitemize istek şeklinde gelmiş oldu.
  • Bu labda web cache poisoning amacıyla host headerini kullanıyoruz. Bir js kaynağını host headerından aldığını gördüğümüzde cachelenen değeri değiştirmek için host headerının altına tekrar bir host yazıp bunun değerini : evilsite.com şeklinde değiştirip arka arkaya istek gönderiyoruz.
  • Authentication Bypass with Host Header Attack : Bu labda da admin paneline girip bir kullanıcı silmemiz gerekiyordu. Host headerini değiştirip istek sanki admin panelinden gelmiş gibi gösteriyoruz. Böylece host değerinde admin panelden geldiğimizi gören sunucu admin olarak giriş yapmış olduğumuzu varsayıp hem paneli görmemize hem de kullanıcıyı silmemize izin veriyor.
  • Routing Based SSRF : Bu labda da admin paneline gitmek istediğimizde yalnızca içerideki kullanıcıların bu panele erişebileceği uyarısını alıyoruz. Bunu aşmak için Intruder kullanıyoruz. Intruderda host kısmını değiştirerek 192.168.0.0/24 bu range aramasını sağlıyoruz. Bir ip değerinde 200 döndüğünü görünce SSRF gerçekleşmiş oluyor ve böylece admin paneline içeriden bir ip ile erişmiş oluyoruz.
  • SSRF via flawed request parsing : Bu labda da Host headerını değiştirmek istediğimizde her sefer hata aldığımızı görüyoruz. Bu noktada da requestin metotdan sonraki kısmını değiştirmeyi deniyoruz. Bu kısmı tam olarak https://URL.com/ gibi tam url ile sonunda / olacak şekilde değiştiriyoruz. Böyle yaptığımızda host headerindeki değişikliklerin hata vermediğini gördük. Şimdi burası sabit dururken admin paneline erişmek için bir önceki SSRF mantığını deniyoruz ve attığımız istekte /admin ile tam url’yi giriyoruz ve bir ip değerinde 200 görüyoruz. Admin paneline erişmiş oluyoruz.