Header injection (başlık enjeksiyonu), bir proxy üzerinden yapıldığında, istekler veya yanıtlar proxy sunucusundan geçerken HTTP başlıklarının kontrollü biçimde eklenmesi, değiştirilmesi ya da kaldırılması anlamına gelir. Bu manipülasyon istemci ile kaynak sunucu arasında veya kaynak sunucu ile istemci arasında gerçekleşir; böylece ne istemci uygulaması ne de sunucu uygulaması değiştirilmeden iletişim meta verileri dinamik olarak değiştirilebilir.
Proxy üzerinden header injection'ı anlamak
Bir proxy sunucusu, başka sunuculardan kaynak talep eden istemci istekleri için aracı görevi görür. Bu aracılık sırasında proxy, HTTP iletişiminin başlıklar dahil çeşitli yönlerini inceleyebilir ve değiştirebilir. Header injection; belirli operasyonel, güvenlik veya geliştirme hedeflerine ulaşmak için proxy üzerinde bilinçli olarak yapılan bir yapılandırmadır.
Proxy'ler başlıkları şu durumlarda manipüle edebilir:
* Giden istekler: İstemciden kaynak sunucuya gönderilen başlıkları değiştirme.
* Gelen yanıtlar: Kaynak sunucudan istemciye gönderilen başlıkları değiştirme.
Bu yetenek, bir saldırganın uygulama açığını istismar ederek istenmeyen başlıklar enjekte ettiği kötü niyetli header injection zafiyetlerinden farklıdır. Burada header injection, proxy operatörünün yapılandırdığı meşru bir işlemdir.
Başlık manipülasyonunun mekanizması
Bir HTTP isteği veya yanıtı proxy'den geçtiğinde, başlıkların nasıl işleneceğini proxy sunucusunun yapılandırması belirler. Süreç tipik olarak şunları içerir:
1. Yakalama: Proxy, HTTP mesajını alır.
2. Ayrıştırma: Proxy mesajı ayrıştırır ve başlıkları çıkarır.
3. Kural değerlendirme: Proxy; URL, metot, istemci IP'si veya mevcut başlık değerleri gibi ölçütlere göre yapılandırılmış kuralları uygular.
4. Manipülasyon: Kurallara göre proxy yeni başlıklar ekler, mevcut başlıkların değerlerini değiştirir ya da başlıkları tamamen kaldırır.
5. İletme: Değiştirilen mesaj, hedefine (kaynak sunucu veya istemci) iletilir.
Yaygın kullanım senaryoları ve faydaları
Proxy üzerinden header injection çeşitli pratik amaçlara hizmet eder.
1. Güvenlik ve anonimlik
Proxy'ler, kimlik belirten başlıkları manipüle ederek güvenliği ve anonimliği artırmada temel rol oynar.
* IP anonimleştirme: İstemcinin gerçek IP adresini kaynak sunucudan gizlemek için X-Forwarded-For, Via veya Remote-Addr başlıklarını kaldırma ya da değiştirme.
* User-Agent maskeleme: Sunucu tarafı takibi veya içerik uyarlamasını engellemek için User-Agent başlığını farklı bir tarayıcı ya da cihaz gibi görünecek şekilde değiştirme.
* Referer kontrolü: Kaynak sunucuların istemcinin daha önce ziyaret ettiği sayfayı öğrenmesini engellemek için Referer başlığını değiştirme veya kaldırma.
* Kimlik doğrulama: Proxy tarafındaki kimlik bilgilerine dayalı doğrulama isteyen upstream servisler için Authorization başlıkları ya da özel token'lar enjekte etme.
2. Performans optimizasyonu
Başlık manipülasyonu, önbellekleme ve içerik dağıtımını önemli ölçüde etkileyebilir.
* Önbellek kontrolü: Kaynak sunucuların veya ara önbelleklerin içeriği nasıl önbelleğe alacağını etkilemek için Cache-Control ya da Pragma başlıkları enjekte etme; örneğin yeniden doğrulamayı zorlama (Cache-Control: no-cache) veya önbellek ömrünü uzatma.
* İçerik sıkıştırma: İstemci göndermediyse Accept-Encoding: gzip, deflate ekleyerek kaynak sunucunun sıkıştırılmış içerik döndürmesini sağlama.
3. Geliştirme ve test
Geliştiriciler, farklı istemci koşullarını simüle etmek veya sunucu davranışlarını test etmek için proxy kullanır.
* Tarayıcı emülasyonu: Birden fazla gerçek tarayıcıya ihtiyaç duymadan sitenin farklı tarayıcılardaki görüntülenmesini test etmek için User-Agent değiştirme.
* Dil testi: Bir web uygulamasının uluslararasılaştırma ve yerelleştirme özelliklerini test etmek için Accept-Language başlıkları enjekte etme.
* API testi: İstemci uygulamasından kolayca ayarlanamayan, bir API'nin gerektirdiği X-API-Key veya özel başlıkları ekleme.
* Hata ayıklama: Kaynak sunucuda ayrıntılı loglama için hata ayıklama modunu tetiklemek üzere X-Debug başlıkları enjekte etme.
4. İçerik uyarlama ve yönlendirme
Proxy'ler, içeriğin nasıl sunulacağını veya isteklerin nasıl yönlendirileceğini etkileyebilir.
* Coğrafi hedefleme simülasyonu: Fiziksel olarak konum değiştirmeden bölgeye özel içerik dağıtımını test etmek için X-Geo-Location veya benzeri başlıklar enjekte etme.
* Yük dengeleme: Özel başlıklar, upstream yük dengeleyiciler tarafından istekleri belirli sunucu örneklerine yönlendirmek için kullanılabilir.
* A/B testi: A/B testi kapsamında kullanıcıları bir sitenin farklı sürümlerine yönlendirmek için özel başlıklar enjekte etme.
Başlık manipülasyonu türleri
Proxy'ler başlıklar üzerinde genellikle üç temel işlemi destekler:
1. Yeni başlık ekleme
Orijinal istekte veya yanıtta bulunmayan bir başlığın eklenmesidir.
* Örnek: Takip amacıyla her giden isteğe X-MyProxy-ID: P123 ekleme.
* Örnek: HSTS'i zorunlu kılmak için tüm yanıtlara Strict-Transport-Security: max-age=31536000; includeSubDomains ekleme.
2. Mevcut başlıkları değiştirme
Bu işlem, halihazırda bulunan bir başlığın değerini değiştirir.
* Örnek: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) değerini User-Agent: MyCustomBot/1.0 olarak değiştirme.
* Örnek: Mevcut bir başlığa bilgi ekleme, örneğin X-Forwarded-For: client_ip, proxy_ip.
3. Başlık kaldırma
Mesaj iletilmeden önce bir başlığın mesajdan çıkarılmasıdır.
* Örnek: Gizliliği artırmak için isteklerden Cookie başlıklarını kaldırma.
* Örnek: Sunucu parmak izini azaltmak için yanıtlardan Server veya X-Powered-By başlıklarını kaldırma.
Proxy yapılandırma örnekleri
Header injection yöntemi, kullanılan proxy yazılımına veya hizmetine göre değişir.
Nginx (ters proxy olarak)
Nginx, istekler için proxy_set_header, yanıtlar için add_header gibi direktifler kullanır.
http {
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
# İstek başlıklarını ekle/değiştir
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header User-Agent "MyCustomUserAgent/1.0";
proxy_set_header X-My-Custom-Header "Value";
# Bir istek başlığını kaldır (boş değere ayarlayarak)
# Not: Nginx istek başlıklarını doğrudan 'kaldırmaz',
# ancak iletilmelerini engelleyebilir veya boş değerle üzerine yazabilirsiniz.
# Gerçekten kaldırmak için Lua ya da daha gelişmiş modüller gerekebilir.
# Yanıt başlıklarını ekle/değiştir
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header Cache-Control "no-cache, no-store, must-revalidate";
# Bir yanıt başlığını kaldır (daha gelişmiş modüller veya header_filter_by_lua gerekir)
# ngx_headers_more modülündeki `more_clear_headers` ile örnek
# more_clear_headers 'Server';
}
}
}
Squid Proxy (ileri proxy olarak)
Squid; request_header_add, request_header_replace, request_header_access, reply_header_add ve benzeri direktifleri kullanır.
# İstemci isteklerine bir başlık ekle
request_header_add X-Proxy-Client-IP %<A
# İstemci isteklerindeki mevcut bir başlığı değiştir
request_header_replace User-Agent MySquidAgent/1.0
# İstemci isteklerinden bir başlığı kaldır
request_header_access Referer deny all
# Sunucu yanıtlarına bir başlık ekle
reply_header_add X-Squid-Cache-Status %s
# Sunucu yanıtlarından bir başlığı kaldır
reply_header_access Server deny all
Genel proxy hizmeti (kavramsal API/UI)
Ticari bir proxy hizmeti, yapılandırmayı bir panel veya API üzerinden sunabilir.
{
"proxy_rules": [
{
"match": {
"url_pattern": ".*",
"method": "GET"
},
"actions": {
"request_headers": {
"add": {
"X-Proxy-Request-ID": "{{request_id}}"
},
"modify": {
"User-Agent": "BotCrawler/1.0"
},
"remove": ["Accept-Encoding"]
},
"response_headers": {
"add": {
"X-Cache-Status": "HIT"
},
"modify": {
"Content-Security-Policy": "default-src 'self'"
},
"remove": ["X-Powered-By"]
}
}
}
]
}
Karşılaştırma: İstemci tarafı ve proxy tarafı başlık manipülasyonu
| Özellik | İstemci tarafı başlık manipülasyonu | Proxy tarafı başlık manipülasyonu |
|---|---|---|
| Kontrol noktası | Tarayıcı eklentileri, istemci tarafı scriptler, geliştirici araçları | Proxy sunucusu yapılandırması |
| Kapsam | Yalnızca ilgili istemci örneğini etkiler | Proxy üzerinden geçen tüm istemcileri etkiler |
| Görünürlük | Yalnızca istemci tarafında; sunucu değiştirilmiş başlığı görür | Sunucu değiştirilmiş başlığı görür; istemcinin haberi olmaz |
| Karmaşıklık | İstemci aracına göre değişir; çoğunlukla manuel | Merkezi yapılandırma; scriptlenebilir |
| Kullanım senaryoları | Yerel hata ayıklama, kişisel tarama tercihleri | Anonimlik, güvenlik, performans, A/B testi, kurumsal politika uygulama |
| Ölçeklenebilirlik | Düşük; her istemci için ayrı çaba | Yüksek; milyonlarca isteğe uygulanır |
| Yönetim | Merkezi değil | Merkezi |
Riskler ve dikkat edilmesi gerekenler
Güçlü bir yöntem olmakla birlikte, proxy üzerinden header injection bazı riskler taşır:
- Güvenlik etkileri: Yanlış yapılandırılmış header injection, hassas bilgileri istemeden açığa çıkarabilir (örneğin amaçlanmadığı halde
X-Forwarded-Forüzerinden dahili IP adresleri) veya dikkatli yönetilmezse atlatmalara (bypass) yol açabilir. - Uygulama uyumluluğu: Zorunlu başlıkları (örneğin
Host,Content-Length,Cookie) değiştirmek ya da kaldırmak, bunların orijinal değerlerine veya varlığına dayanan uygulamaları bozabilir. - Hata ayıklama karmaşıklığı: Sorun çıktığında, nedenin proxy'nin başlık manipülasyonu olup olmadığını belirlemek zor olabilir; çünkü istemci ve sunucu logları farklı başlık kümeleri gösterebilir.
- Performans maliyeti: Kapsamlı başlık manipülasyonu kuralları, her istek ve yanıta işlem gecikmesi ekleyerek genel proxy performansını etkileyebilir.
- Mevzuata uyum: Bazı düzenlemeler (örneğin GDPR, CCPA) kimlik belirten başlıkların nasıl işlendiğine dair yükümlülükler getirebilir; uyum için dikkatli yapılandırma gerekir.
- Önbellek geçersizleştirme:
VaryveyaCache-Controlbaşlıklarını yanlış değiştirmek, eskimiş içeriğin sunulmasına ya da önbellek isabet oranının düşmesine yol açabilir.
