Özel HTTP başlıkları
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Kelime Listeleri & Araçlar
- https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers
- https://github.com/rfc-st/humble
Konum Değiştirmek İçin Başlıklar
IP kaynağını yeniden yaz:
X-Originating-IP: 127.0.0.1X-Forwarded-For: 127.0.0.1X-Forwarded: 127.0.0.1Forwarded-For: 127.0.0.1X-Forwarded-Host: 127.0.0.1X-Remote-IP: 127.0.0.1X-Remote-Addr: 127.0.0.1X-ProxyUser-Ip: 127.0.0.1X-Original-URL: 127.0.0.1Client-IP: 127.0.0.1X-Client-IP: 127.0.0.1X-Host: 127.0.0.1True-Client-IP: 127.0.0.1Cluster-Client-IP: 127.0.0.1Via: 1.0 fred, 1.1 127.0.0.1Connection: close, X-Forwarded-For(hop-by-hop header’ları kontrol edin)
Konumu yeniden yaz:
X-Original-URL: /admin/consoleX-Rewrite-URL: /admin/console
Hop-by-Hop header’ları
Hop-by-hop header, isteği şu anda işleyen proxy tarafından işlenip tüketilmek üzere tasarlanmış bir header’dır; son kullanıcıya kadar gidip gitmeyen end-to-end header’dan farklıdır.
Connection: close, X-Forwarded-For
HTTP Request Smuggling
Content-Length: 30Transfer-Encoding: chunked
HTTP Request Smuggling / HTTP Desync Attack
The Expect header
İstemci Expect: 100-continue header’ını gönderebilir ve sunucu buna HTTP/1.1 100 Continue ile yanıt vererek istemcinin isteğin gövdesini göndermeye devam etmesine izin verebilir. Ancak bazı proxy’ler bu header’ı pek sevmez.
Expect: 100-continue ile ilgili ilginç sonuçlar:
- HEAD isteği gövde ile gönderildiğinde, sunucu HEAD isteklerinin gövdesi olmadığını dikkate almayıp bağlantıyı zaman aşımına kadar açık tutmuştur.
- Bazı sunucular yanıt içinde garip veriler göndermiş: soketten rastgele okunan veriler, gizli anahtarlar veya ön uçun header değerlerini kaldırmasını engelleyen durumlar.
- Ayrıca backend 100 yerine 400 ile yanıtlayınca
0.CLdesync’e neden oldu; çünkü proxy ön uç, orijinal isteğin gövdesini göndermeye hazırlanmıştı, bu yüzden gövdeyi gönderdi ve backend bunu yeni bir istek olarak aldı. Expect: y 100-continuevaryasyonu da0.CLdesync’e neden oldu.- Benzer bir hata, backend 404 ile yanıtladığında
CL.0desync üretti; çünkü kötü amaçlı istek birContent-Lengthbelirtiyordu, bu yüzden backend kötü amaçlı isteği + sonraki isteğinContent-Lengthbaytlarını (bir kurbanın isteği) gönderdi. Bu kuyruğu desync etti çünkü backend kötü amaçlı istek için 404 yanıtını + kurban isteğinin yanıtını gönderirken, ön uç yalnızca 1 istek gönderildiğini düşündü; böylece ikinci yanıt başka bir kurbana gönderildi ve sonraki yanıt da bir sonrakine yönlendirildi…
HTTP Request Smuggling hakkında daha fazla bilgi için bakınız:
HTTP Request Smuggling / HTTP Desync Attack
Cache Header’ları
Sunucu Cache Header’ları:
X-Cachecevaptamissdeğeri isteğin cache’te olmadığını,hitise cache’te olduğunu gösterebilir- Benzer davranış
Cf-Cache-Statusheader’ında görülebilir Cache-Controlbir kaynağın cache’lenip cache’lenmediğini ve bir sonraki cache zamanını belirtir:Cache-Control: public, max-age=1800Varygenellikle cevapta, normalde cache anahtarının parçası olmayan ek header’ların da cache anahtarının parçası olarak değerlendirildiğini belirtmek için kullanılır.Agenesnenin proxy cache’te bulunduğu süreyi saniye olarak tanımlar.Server-Timing: cdn-cache; desc=HITayrıca bir kaynağın cache’lendiğini gösterir
Cache Poisoning and Cache Deception
Yerel Cache header’ları:
Clear-Site-Data: Kaldırılması gereken cache türünü belirtir:Clear-Site-Data: "cache", "cookies"Expires: Cevabın ne zaman süresinin dolacağını içerir:Expires: Wed, 21 Oct 2015 07:28:00 GMTPragma: no-cacheCache-Control: no-cacheile aynıWarning: Genel HTTP header’ı olanWarning, mesajın durumu ile ilgili olası problemlere dair bilgi içerir. Bir cevapta birden fazlaWarningheader’ı bulunabilir.Warning: 110 anderson/1.3.37 "Response is stale"
Koşullular (Conditionals)
- Bu header’ları kullanan istekler:
If-Modified-SinceveIf-Unmodified-Sinceyalnızca cevap header’ıLast-Modifiedfarklı bir zaman içeriyorsa veri ile yanıtlanır. If-MatchveIf-None-Matchkullanan koşullu istekler Etag değerini kullanır; web sunucusu, veri (Etag) değiştiyse cevabı gönderir.EtagHTTP cevabından alınır.- Etag değeri genellikle cevabın içeriğine göre hesaplanır. Örneğin,
ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"ifadesiEtag’in 37 byte için Sha1 olduğunu gösterir.
Range istekleri
Accept-Ranges: Sunucunun range isteklerini destekleyip desteklemediğini ve destekliyorsa hangi birimde range belirtilebileceğini gösterir.Accept-Ranges: <range-unit>Range: Sunucunun döndürmesi gereken belgenin parçasını belirtir. Örneğin,Range:80-100orijinal cevabın 80 ile 100 arasındaki byte’larını döndürür ve durum kodu 206 Partial Content olur. AyrıcaAccept-Encodingheader’ını istekten kaldırmayı unutmayın.- Bu, aksi halde kaçışlanan reflected javascript kodunu arbitrary olarak almak için yararlı olabilir. Ancak bunu kötüye kullanmak için bu header’ları isteğe enjekte etmeniz gerekir.
If-Range: Verilen etag veya tarih uzak kaynağa uyuyorsa yerine getirilecek koşullu bir range isteği oluşturur. Kaynağın uyumsuz versiyonlarından iki range indirilmeyi önlemek için kullanılır.Content-Range: Kısmi bir mesajın tam bir gövde mesajının neresine ait olduğunu belirtir.
Mesaj gövdesi bilgisi
Content-Length: Kaynağın boyutu, bayt cinsinden ondalık sayı.Content-Type: Kaynağın medya tipini belirtirContent-Encoding: Sıkıştırma algoritmasını belirtmek için kullanılır.Content-Language: Hedef kitle için amaçlanan insan dili(leri)ni tanımlar; böylece kullanıcı kendi tercih ettiği dile göre ayırt edebilir.Content-Location: Döndürülen veriler için alternatif bir konumu gösterir.
Bir pentest bakış açısından bu bilgiler genellikle “kullanışsız“dır, ancak kaynak bir 401 veya 403 ile korunuyorsa ve bu bilgiyi elde etmenin bir yolunu bulabiliyorsanız bu ilginç olabilir.
Örneğin, HEAD isteğinde Range ve Etag kombinasyonu sayfanın içeriğini HEAD istekleri aracılığıyla leak edebilir:
Range: bytes=20-20header’lı bir istek veETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"cevabı, byte 20’nin SHA1’ininETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Yolduğunu leak ediyor
Sunucu Bilgisi
Server: Apache/2.4.1 (Unix)X-Powered-By: PHP/5.3.3
Kontroller
Allow: Bu header bir kaynağın hangi HTTP yöntemlerini işleyebildiğini bildirir. Örneğin,Allow: GET, POST, HEADgibi belirtilerek kaynağın bu yöntemleri desteklediği gösterilir.Expect: İstemcinin, isteğin başarılı şekilde işlenebilmesi için sunucunun karşılaması gereken beklentileri iletmek için kullandığı header’dır. Yaygın bir kullanımExpect: 100-continueheader’ıdır; bu, istemcinin büyük bir veri yükü göndermeyi düşündüğünü işaret eder. İstemci, gönderime devam etmeden önce100 (Continue)yanıtını bekler. Bu mekanizma, sunucudan onay bekleyerek ağ kullanımını optimize etmeye yardımcı olur.
İndirilmeler
- HTTP cevaplarındaki
Content-Dispositionheader’ı bir dosyanın sayfa içinde (inline) gösterilip gösterilmeyeceğini veya bir attachment (indirilecek) olarak muamele edilip edilmeyeceğini belirtir. Örneğin:
Content-Disposition: attachment; filename="filename.jpg"
Bu, “filename.jpg” adlı dosyanın indirilip kaydedilmesi amaçlandığı anlamına gelir.
Güvenlik Başlıkları
İçerik Güvenlik Politikası (CSP)
Content Security Policy (CSP) Bypass
Trusted Types
Trusted Types’ı CSP aracılığıyla zorunlu kılarak, uygulamalar DOM XSS saldırılarına karşı korunabilir. Trusted Types, yalnızca belirli güvenlik politikalarına uygun şekilde özel olarak oluşturulmuş nesnelerin tehlikeli web API çağrılarında kullanılmasına izin vererek JavaScript kodunu varsayılan olarak korur.
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '<').replace(/>/g, '>');
});
}
// Assignment of raw strings is blocked, ensuring safety.
el.innerHTML = "some string" // Throws an exception.
const escaped = policy.createHTML("<img src=x onerror=alert(1)>")
el.innerHTML = escaped // Results in safe assignment.
X-Content-Type-Options
Bu header MIME türü tespitini engeller; bu uygulama XSS zafiyetlerine yol açabilir. Sunucu tarafından belirtilen MIME türlerine tarayıcıların uymasını sağlar.
X-Content-Type-Options: nosniff
X-Frame-Options
Clickjacking ile mücadele etmek için, bu header <frame>, <iframe>, <embed> veya <object> etiketlerine belgelerin nasıl gömülebileceğini kısıtlar ve tüm belgelerin gömme izinlerini açıkça belirtmesini önerir.
X-Frame-Options: DENY
Cross-Origin Resource Policy (CORP) and Cross-Origin Resource Sharing (CORS)
CORP, web sitelerinin hangi kaynakları yükleyebileceğini belirtmek için kritik öneme sahiptir; cross-site leaks’i azaltır. Öte yandan CORS, belirli koşullar altında same-origin policy’yi gevşeterek daha esnek bir cross-origin resource sharing mekanizması sağlar.
Cross-Origin-Resource-Policy: same-origin
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
Cross-Origin Embedder Policy (COEP) ve Cross-Origin Opener Policy (COOP)
COEP ve COOP, kökenler arası izolasyonu etkinleştirmek için gereklidir ve Spectre benzeri saldırı riskini önemli ölçüde azaltır. Bunlar sırasıyla kökenler arası kaynakların yüklenmesini ve kökenler arası pencerelerle etkileşimi kontrol eder.
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin-allow-popups
HTTP Strict Transport Security (HSTS)
Son olarak, HSTS tarayıcıların sunucularla yalnızca güvenli HTTPS bağlantıları üzerinden iletişim kurmasını zorunlu kılan bir güvenlik özelliğidir; böylece gizliliği ve güvenliği artırır.
Strict-Transport-Security: max-age=3153600
Permissions-Policy (formerly Feature-Policy)
Permissions-Policy, web geliştiricilerinin bir belge içinde belirli tarayıcı özelliklerini ve API’leri seçici olarak etkinleştirmesine, devre dışı bırakmasına veya davranışlarını değiştirmesine olanak tanır. Bu, artık kullanımdan kaldırılmış olan Feature-Policy başlığının ardılıdır. Bu başlık, kötüye kullanılabilecek güçlü özelliklere erişimi kısıtlayarak saldırı yüzeyini azaltmaya yardımcı olur.
Permissions-Policy: geolocation=(), camera=(), microphone=()
Yaygın direktifler:
| Directive | Açıklama |
|---|---|
accelerometer | Accelerometer sensörüne erişimi kontrol eder |
camera | Video giriş aygıtlarına (webcam) erişimi kontrol eder |
geolocation | Geolocation API’sine erişimi kontrol eder |
gyroscope | Gyroscope sensörüne erişimi kontrol eder |
magnetometer | Magnetometer sensörüne erişimi kontrol eder |
microphone | Ses giriş aygıtlarına erişimi kontrol eder |
payment | Payment Request API’sine erişimi kontrol eder |
usb | WebUSB API’sine erişimi kontrol eder |
fullscreen | Fullscreen API’sine erişimi kontrol eder |
autoplay | Medyanın otomatik oynatılmasına izin verilip verilmeyeceğini kontrol eder |
clipboard-read | Panodan içerik okumaya erişimi kontrol eder |
clipboard-write | Panoya yazma erişimini kontrol eder |
Sözdizimi değerleri:
()- Özelliği tamamen devre dışı bırakır(self)- Özelliğe yalnızca aynı origin için izin verir*- Özelliğe tüm originler için izin verir(self "https://example.com")- Aynı origin ve belirtilen domaine izin verir
Örnek yapılandırmalar:
# Restrictive policy - disable most features
Permissions-Policy: geolocation=(), camera=(), microphone=(), payment=(), usb=()
# Allow camera only from same origin
Permissions-Policy: camera=(self)
# Allow geolocation for same origin and a trusted partner
Permissions-Policy: geolocation=(self "https://maps.example.com")
Güvenlik açısından, eksik veya aşırı izin veren Permissions-Policy başlıkları, saldırganların (ör. XSS veya gömülü iframes aracılığıyla) güçlü tarayıcı özelliklerini suistimal etmesine izin verebilir. Özellikleri uygulamanız için gereken asgari düzeyle sınırlandırın.
Başlık Adı Büyük/Küçük Harf Bypass’ı
HTTP/1.1, başlık alan adlarını büyük/küçük harf duyarsız olarak tanımlar (RFC 9110 §5.1). Buna rağmen, alınan literal başlık adını önce harf biçimini normalleştirmeden karşılaştıran özel middleware, güvenlik filtreleri veya iş mantığına sıkça rastlanır (ör. header.equals("CamelExecCommandExecutable")). Eğer bu kontroller büyük/küçük harf duyarlı şekilde yapılıyorsa, bir saldırgan aynı başlığı farklı bir kapitalizasyonla göndererek bu kontrolleri atlayabilir.
Bu hatanın sık görüldüğü durumlar:
- İsteğin hassas bir bileşene ulaşmadan önce “tehlikeli” iç başlıkları engellemeye çalışan özel izin/engelleme listeleri.
- Reverse-proxy pseudo-headers’ın dahili uygulamaları (ör.
X-Forwarded-Forsanitisation). - Yönetim / debug uç noktalarını açığa çıkaran ve kimlik doğrulama veya komut seçimi için başlık isimlerine dayanan framework’ler.
Bypass’ın kötüye kullanımı
- Sunucu tarafında filtrelenen veya doğrulanan bir başlığı tespit edin (ör. kaynak kodu, dökümantasyon veya hata mesajları okuyarak).
- Aynı başlığı farklı bir harf biçimiyle gönderin (karışık harfli veya tamamen büyük harf). Çünkü HTTP yığınları genellikle başlıkları kullanıcı kodu çalıştıktan sonra normalleştirir; bu nedenle savunmasız kontrol atlanabilir.
- Eğer sonraki bileşen başlıkları büyük/küçük harf duyarsız şekilde ele alıyorsa (çoğu öyledir), saldırgan kontrollü değeri kabul edecektir.
Örnek: Apache Camel exec RCE (CVE-2025-27636)
Zafiyetli Apache Camel sürümlerinde Command Center rotaları, güvensiz istekleri CamelExecCommandExecutable ve CamelExecCommandArgs başlıklarını temizleyerek engellemeye çalışıyordu. Karşılaştırma equals() ile yapıldığından yalnızca tam olarak eşleşen (küçük harfli) isimler kaldırılıyordu.
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
curl "http://<IP>/command-center" \
-H "CAmelExecCommandExecutable: ls" \
-H "CAmelExecCommandArgs: /"
Başlıklar exec bileşenine filtrelenmeden ulaşır; bu da Camel işleminin ayrıcalıklarıyla uzaktan komut çalıştırılmasına yol açar.
Tespit ve Hafifletme
- Tüm başlık adlarını tek bir duruma (çoğunlukla küçük harf) izin/verme karşılaştırmalarını yapmadan önce normalleştirin.
- Şüpheli çoğaltmaları reddedin: hem
Header:hem deHeAdEr:varsa, bunu bir anomali olarak değerlendirin. - Kanonikleştirmeden sonra uygulanacak pozitif bir izin listesi (allow-list) kullanın.
- Yönetim endpoint’lerini kimlik doğrulama ve ağ segmentasyonu ile koruyun.
Kaynaklar
- CVE-2025-27636 – RCE in Apache Camel via header casing bypass (OffSec blog)
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
- https://web.dev/security-headers/
- https://web.dev/articles/security-headers
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
HackTricks

