226 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Özel HTTP başlıkları
{{#include ../../banners/hacktricks-training.md}}
## Kelime Listeleri & Araçlar
- [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers)
- [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble)
## Konumu Değiştirmek için Başlıklar
**IP kaynağını** yeniden yaz:
- `X-Originating-IP: 127.0.0.1`
- `X-Forwarded-For: 127.0.0.1`
- `X-Forwarded: 127.0.0.1`
- `Forwarded-For: 127.0.0.1`
- `X-Forwarded-Host: 127.0.0.1`
- `X-Remote-IP: 127.0.0.1`
- `X-Remote-Addr: 127.0.0.1`
- `X-ProxyUser-Ip: 127.0.0.1`
- `X-Original-URL: 127.0.0.1`
- `Client-IP: 127.0.0.1`
- `X-Client-IP: 127.0.0.1`
- `X-Host: 127.0.0.1`
- `True-Client-IP: 127.0.0.1`
- `Cluster-Client-IP: 127.0.0.1`
- `Via: 1.0 fred, 1.1 127.0.0.1`
- `Connection: close, X-Forwarded-For` (Hop-by-hop başlıklarını kontrol et)
**Konumu** yeniden yaz:
- `X-Original-URL: /admin/console`
- `X-Rewrite-URL: /admin/console`
## Hop-by-Hop başlıkları
Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tüketilmek üzere tasarlanmış bir başlıktır, uçtan uca başlıkların aksine.
- `Connection: close, X-Forwarded-For`
{{#ref}}
../../pentesting-web/abusing-hop-by-hop-headers.md
{{#endref}}
## HTTP İstek Kaçırma
- `Content-Length: 30`
- `Transfer-Encoding: chunked`
{{#ref}}
../../pentesting-web/http-request-smuggling/
{{#endref}}
## Önbellek Başlıkları
**Sunucu Önbellek Başlıkları**:
- **`X-Cache`** yanıtında, istek önbelleğe alınmadığında **`miss`** değeri ve önbelleğe alındığında **`hit`** değeri olabilir.
- **`Cf-Cache-Status`** başlığında benzer bir davranış.
- **`Cache-Control`** bir kaynağın önbelleğe alınıp alınmadığını ve bir sonraki önbelleğe alma zamanını belirtir: `Cache-Control: public, max-age=1800`
- **`Vary`** genellikle yanıt içinde, normalde anahtarlanmayan ek başlıkların **önbellek anahtarının** bir parçası olarak ele alındığını belirtmek için kullanılır.
- **`Age`** nesnenin proxy önbelleğinde kaç saniye kaldığını tanımlar.
- **`Server-Timing: cdn-cache; desc=HIT`** ayrıca bir kaynağın önbelleğe alındığını gösterir.
{{#ref}}
../../pentesting-web/cache-deception/
{{#endref}}
**Yerel Önbellek başlıkları**:
- `Clear-Site-Data`: Silinmesi gereken önbelleği belirtmek için kullanılan başlık: `Clear-Site-Data: "cache", "cookies"`
- `Expires`: Yanıtın ne zaman sona ereceğini içeren tarih/saat: `Expires: Wed, 21 Oct 2015 07:28:00 GMT`
- `Pragma: no-cache` `Cache-Control: no-cache` ile aynı.
- `Warning`: **`Warning`** genel HTTP başlığı, mesajın durumu ile ilgili olası sorunlar hakkında bilgi içerir. Yanıt içinde birden fazla `Warning` başlığı görünebilir. `Warning: 110 anderson/1.3.37 "Response is stale"`
## Koşullu İstekler
- Bu başlıkları kullanan istekler: **`If-Modified-Since`** ve **`If-Unmodified-Since`** yalnızca yanıt başlığı **`Last-Modified`** farklı bir zaman içeriyorsa veri ile yanıtlanır.
- **`If-Match`** ve **`If-None-Match`** kullanan koşullu istekler, web sunucusunun verinin (Etag) değişip değişmediğini kontrol etmesi için bir Etag değeri kullanır. `Etag`, HTTP yanıtından alınır.
- **Etag** değeri genellikle yanıtın **içeriğine** dayalı olarak **hesaplanır**. Örneğin, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` ifadesi, `Etag`'ın **37 bayt**'ın **Sha1**'ı olduğunu gösterir.
## Aralık İstekleri
- **`Accept-Ranges`**: Sunucunun aralık isteklerini destekleyip desteklemediğini ve destekliyorsa aralığın hangi birimde ifade edilebileceğini belirtir. `Accept-Ranges: <range-unit>`
- **`Range`**: Sunucunun döndürmesi gereken belgenin kısmını belirtir. Örneğin, `Range:80-100` orijinal yanıtın 80 ile 100 arasındaki baytlarını 206 Partial Content durum kodu ile döndürecektir. Ayrıca istekte `Accept-Encoding` başlığını kaldırmayı unutmayın.
- Bu, aksi takdirde kaçırılabilecek rastgele yansıtılmış javascript kodu ile bir yanıt almak için yararlı olabilir. Ancak bunu kötüye kullanmak için bu başlıkları isteğe enjekte etmeniz gerekir.
- **`If-Range`**: Verilen etag veya tarih eşleşirse yalnızca yerine getirilen koşullu bir aralık isteği oluşturur. Kaynağın uyumsuz sürümlerinden iki aralığın indirilmesini önlemek için kullanılır.
- **`Content-Range`**: Tam bir gövde mesajında bir kısmi mesajın nereye ait olduğunu belirtir.
## Mesaj gövdesi bilgileri
- **`Content-Length`:** Kaynağın boyutu, ondalık sayı olarak bayt cinsinden.
- **`Content-Type`**: Kaynağın medya türünü belirtir.
- **`Content-Encoding`**: Sıkıştırma algoritmasını belirtmek için kullanılır.
- **`Content-Language`**: Hedef kitle için tasarlanan insan dili(leri)ni tanımlar, böylece kullanıcıların kendi tercih ettikleri dile göre ayırt etmelerine olanak tanır.
- **`Content-Location`**: Döndürülen veriler için alternatif bir konumu belirtir.
Bir pentest açısından bu bilgi genellikle "işe yaramaz", ancak kaynak **401** veya **403** ile **korunuyorsa** ve bu **bilgiyi** **almanın** bir **yolunu** bulursanız, bu **ilginç** olabilir.\
Örneğin, bir HEAD isteğinde **`Range`** ve **`Etag`** kombinasyonu, HEAD istekleri aracılığıyla sayfanın içeriğini sızdırabilir:
- `Range: bytes=20-20` başlığına sahip bir istek ve `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` içeren bir yanıt, 20. baytın SHA1'inin `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` olduğunu sızdırmaktadır.
## Sunucu Bilgisi
- `Server: Apache/2.4.1 (Unix)`
- `X-Powered-By: PHP/5.3.3`
## Kontroller
- **`Allow`**: Bu başlık, bir kaynağın işleyebileceği HTTP yöntemlerini iletmek için kullanılır. Örneğin, `Allow: GET, POST, HEAD` olarak belirtilmişse, kaynak bu yöntemleri destekliyor demektir.
- **`Expect`**: İsteğin başarılı bir şekilde işlenmesi için sunucunun karşılaması gereken beklentileri iletmek için istemci tarafından kullanılır. Yaygın bir kullanım durumu, istemcinin büyük bir veri yükü göndermeyi planladığını belirten `Expect: 100-continue` başlığıdır. İstemci, iletimi sürdürmeden önce `100 (Continue)` yanıtını bekler. Bu mekanizma, sunucu onayını bekleyerek ağ kullanımını optimize etmeye yardımcı olur.
## İndirmeler
- HTTP yanıtlarındaki **`Content-Disposition`** başlığı, bir dosyanın **inline** (web sayfası içinde) mi yoksa **ek** (indirilmiş) olarak mı görüntülenmesi gerektiğini yönlendirir. Örneğin:
```
Content-Disposition: attachment; filename="filename.jpg"
```
Bu, "filename.jpg" adlı dosyanın indirilip kaydedilmek üzere tasarlandığı anlamına gelir.
## Güvenlik Başlıkları
### İçerik Güvenlik Politikası (CSP) <a href="#csp" id="csp"></a>
{{#ref}}
../../pentesting-web/content-security-policy-csp-bypass/
{{#endref}}
### **Güvenilir Türler**
CSP aracılığıyla Güvenilir Türlerin zorunlu kılınması, uygulamaların DOM XSS saldırılarına karşı korunmasını sağlar. Güvenilir Türler, yalnızca belirli güvenlik politikalarına uygun olarak hazırlanmış nesnelerin tehlikeli web API çağrılarında kullanılmasını sağlar ve böylece JavaScript kodunu varsayılan olarak güvence altına alır.
```javascript
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => str.replace(/\</g, '&lt;').replace(/>/g, '&gt;');
});
}
```
```javascript
// 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 başlık, XSS güvenlik açıklarına yol açabilecek bir uygulama olan MIME türü sniffing'ini engeller. Tarayıcıların sunucu tarafından belirtilen MIME türlerine saygı göstermesini sağlar.
```
X-Content-Type-Options: nosniff
```
### **X-Frame-Options**
Clickjacking ile mücadele etmek için, bu başlık belgelerin `<frame>`, `<iframe>`, `<embed>` veya `<object>` etiketlerinde 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) ve Cross-Origin Resource Sharing (CORS)**
CORP, hangi kaynakların web siteleri tarafından yüklenebileceğini belirlemek için kritik öneme sahiptir ve cross-site leak'leri azaltır. CORS ise, belirli koşullar altında aynı köken politikasını gevşeterek daha esnek bir cross-origin kaynak paylaşım 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, cross-origin izolasyonunu sağlamak için gereklidir ve Spectre benzeri saldırıların riskini önemli ölçüde azaltır. Sırasıyla, cross-origin kaynakların yüklenmesini ve cross-origin 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 yalnızca güvenli HTTPS bağlantıları üzerinden sunucularla iletişim kurmasını zorlayan bir güvenlik özelliğidir ve böylece gizliliği ve güvenliği artırır.
```
Strict-Transport-Security: max-age=3153600
```
## Header Name Casing 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). Yine de, alınan *literal* başlık adını önce normalleştirmeden karşılaştıran özel ara katmanlar, güvenlik filtreleri veya iş mantığı bulmak oldukça yaygındır (örneğin, `header.equals("CamelExecCommandExecutable")`). Eğer bu kontroller **büyük/küçük harf duyarlı** olarak gerçekleştirilirse, bir saldırgan, farklı bir büyük harf kullanarak aynı başlığı göndererek bunları atlayabilir.
Bu hatanın ortaya çıktığı tipik durumlar:
* İsteğin hassas bir bileşene ulaşmadan önce “tehlikeli” dahili başlıkları engellemeye çalışan özel izin/red listeleri.
* `X-Forwarded-For` sanitizasyonu gibi ters proxy sahte başlıklarının şirket içi uygulamaları.
* Yönetim / hata ayıklama uç noktalarını açan ve kimlik doğrulama veya komut seçimi için başlık adlarına güvenen çerçeveler.
### Abusing the bypass
1. Sunucu tarafında filtrelenen veya doğrulanan bir başlığı tanımlayın (örneğin, kaynak kodunu, belgeleri veya hata mesajlarını okuyarak).
2. **Farklı bir büyük/küçük harf ile aynı başlığı** gönderin (karışık büyük/küçük harf veya tamamen büyük harf). HTTP yığınları genellikle başlıkları yalnızca *kullanıcı kodu çalıştıktan sonra* kanonikleştirdiğinden, savunmasız kontrol atlanabilir.
3. Eğer aşağıdaki bileşen başlıkları büyük/küçük harf duyarsız bir şekilde ele alıyorsa (çoğu öyle yapar), saldırgan kontrolündeki değeri kabul edecektir.
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
Apache Camel'ın savunmasız sürümlerinde *Command Center* rotaları, `CamelExecCommandExecutable` ve `CamelExecCommandArgs` başlıklarını kaldırarak güvenilmeyen istekleri engellemeye çalışır. Karşılaştırma `equals()` ile yapıldığından, yalnızca tam küçük harfli adlar kaldırılmıştır.
```bash
# 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 ve bu da Camel sürecinin ayrıcalıklarıyla uzaktan komut yürütmeye yol açar.
### Tespit ve Azaltma
* Tüm başlık adlarını tek bir duruma (genellikle küçük harf) **önce** izin verme/reddetme karşılaştırmaları yapmadan normalleştirin.
* Şüpheli kopyaları reddedin: hem `Header:` hem de `HeAdEr:` mevcutsa, bunu bir anomali olarak değerlendirin.
* Kanonizasyon **sonrası** uygulanan pozitif bir izin listesi kullanın.
* Yönetim uç noktalarını kimlik doğrulama ve ağ segmentasyonu ile koruyun.
## Referanslar
- [CVE-2025-27636 RCE in Apache Camel via header casing bypass (OffSec blog)](https://www.offsec.com/blog/cve-2025-27636/)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
- [https://web.dev/security-headers/](https://web.dev/security-headers/)
- [https://web.dev/articles/security-headers](https://web.dev/articles/security-headers)
{{#include ../../banners/hacktricks-training.md}}