diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index f557d9d04..0a9b19348 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -2,14 +2,14 @@ {{#include ../../banners/hacktricks-training.md}} -## Kelime Listeleri & Araçlar +## Wordlists & Tools - [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 +## Konumu Değiştirmek İçin Başlıklar -**IP kaynağını** yeniden yaz: +IP kaynağını yeniden yaz: - `X-Originating-IP: 127.0.0.1` - `X-Forwarded-For: 127.0.0.1` @@ -26,42 +26,63 @@ - `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) +- `Connection: close, X-Forwarded-For` (Hop-by-hop header'ları kontrol edin) -**Konumu** yeniden yaz: +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. +Bir hop-by-hop header, isteği şu anda işleyen proxy tarafından işlenip tüketilmek üzere tasarlanmış bir başlıktır; end-to-end header'dan farklı olarak yalnızca ara düğümün işlemine yöneliktir. - `Connection: close, X-Forwarded-For` + {{#ref}} ../../pentesting-web/abusing-hop-by-hop-headers.md {{#endref}} -## HTTP İstek Kaçırma +## HTTP Request Smuggling - `Content-Length: 30` - `Transfer-Encoding: chunked` + {{#ref}} ../../pentesting-web/http-request-smuggling/ {{#endref}} +## Expect başlığı + +İstemcinin `Expect: 100-continue` başlığını gönderip ardından sunucunun `HTTP/1.1 100 Continue` ile yanıt vererek istemcinin isteğin gövdesini göndermeye devam etmesine izin vermesi mümkündür. Ancak bazı proxy'ler bu başlığı pek sevmez. + +`Expect: 100-continue`'ün ilginç sonuçları: +- Bir HEAD isteğine gövde gönderildiğinde, sunucu HEAD isteklerinin gövde içermediğini hesaba katmayıp bağlantıyı zaman aşımına uğrayana kadar açık tutabiliyor. +- Diğer sunucular garip veriler gönderdi: yanıtta soketten rastgele okunan veriler, gizli anahtarlar veya hatta ön uçun başlık değerlerini kaldırmasını engelleyen durumlar görüldü. +- Ayrıca backend 100 yerine 400 ile yanıtladığında `0.CL` desync'e yol açtı; çünkü proxy ön uç ilk 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-continue` benzeri varyasyonlar da `0.CL` desync'e sebep oldu. +- Backend 404 ile yanıtladığında oluşan benzer bir hata `CL.0` desync üretti; kötü niyetli istek bir `Content-Length` belirttiği için backend kötü niyetli isteği + sonraki isteğin (bir victim'ın) `Content-Length` baytlarını gönderiyor. Bu, kuyruğun desync olmasına neden oluyor: backend kötü niyetli istek için 404 yanıtını + victim isteklerinin yanıtlarını gönderirken, ön uç sadece 1 istek gönderildiğini sanıyor; böylece ikinci yanıt farklı bir victim isteğine gidiyor ve onun yanıtı bir sonrakiye aktarılıyor... + +HTTP Request Smuggling hakkında daha fazla bilgi için bakınız: + +{{#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ı** önbellek anahtarının bir parçası olarak işaretlemek 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. +- **`X-Cache`** yanıtında, istek önbelleğe alınmadıysa değer **`miss`**, önbelleğe alındıysa **`hit`** olabilir +- Benzer davranış **`Cf-Cache-Status`** başlığında görülebilir +- **`Cache-Control`** bir kaynağın önbelleğe alınıp alınmadığını ve bir sonraki ne zaman önbelleğe alınacağını gösterir: `Cache-Control: public, max-age=1800` +- **`Vary`** genellikle yanıtta, normalde önbellek anahtarında olmayan ek başlıkların önbellek anahtarının parçası olarak ele alındığını belirtmek için kullanılır +- **`Age`** nesnenin proxy önbelleğinde bulunduğu süreyi saniye cinsinden tanımlar +- **`Server-Timing: cdn-cache; desc=HIT`** ayrıca bir kaynağın cachelendiğini gösterir + {{#ref}} ../../pentesting-web/cache-deception/ @@ -69,37 +90,37 @@ Bir hop-by-hop başlığı, isteği işleyen proxy tarafından işlenmek ve tük **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"` +- `Clear-Site-Data`: Hangi önbelleğin kaldırılması gerektiğini belirtir: `Clear-Site-Data: "cache", "cookies"` +- `Expires`: Yanıtın ne zaman sona ermesi gerektiğini içeren tarih/saat: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` +- `Pragma: no-cache` `Cache-Control: no-cache` ile aynı +- `Warning`: Genel HTTP başlığı olan **`Warning`**, mesajın durumu ile ilgili olası sorunlar hakkında bilgi içerir. Bir yanıtta 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 veri (Etag) değiştiğinde yanıt içeriğini göndermesini sağlamak 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. +- **`If-Modified-Since`** ve **`If-Unmodified-Since`** başlıklarını kullanan isteklere, yalnızca yanıt başlığı **`Last-Modified`** farklı bir zamanı içeriyorsa veri ile yanıt verilir. +- **`If-Match`** ve **`If-None-Match`** kullanan koşullu istekler bir Etag değeri kullanır; sunucu verinin (Etag) değişmesi durumunda yanıt içeriğini gönderir. `Etag` HTTP yanıtından alınır. +- **Etag** değeri genellikle yanıtın **içeriğine** göre hesaplanır. Örneğin, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` ifadesi, `Etag`'in **37 baytın Sha1**'i olduğunu gösterir. -## Aralık İstekleri +## Range istekleri -- **`Accept-Ranges`**: Sunucunun aralık isteklerini destekleyip desteklemediğini ve destekliyorsa aralığın hangi birimde ifade edilebileceğini belirtir. `Accept-Ranges: ` -- **`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 mesajın içinde kısmi bir mesajın nerede bulunduğunu belirtir. +- **`Accept-Ranges`**: Sunucunun range isteklerini destekleyip desteklemediğini ve destekliyorsa hangi birimde range belirtilebileceğini gösterir. `Accept-Ranges: ` +- **`Range`**: Sunucunun döndürmesi gereken belgenin kısmını belirtir. Örneğin, `Range:80-100` orijinal yanıtın 80 ile 100 baytları arasını 206 Partial Content statü kodu ile döndürecektir. Ayrıca istekte `Accept-Encoding` başlığını kaldırmayı unutmayın. +- Bu, aksi takdirde kaçışlanan reflected javascript kodunu almak için faydalı olabilir. Ancak bunu kötüye kullanmak için bu başlıkları isteğe enjekte etmeniz gerekir. +- **`If-Range`**: Verilen etag veya tarih uzaktaki kaynakla eşleşiyorsa yerine getirilecek koşullu bir range isteği oluşturur. Kaynağın uyumsuz sürümlerinden iki range indirmeyi önlemek için kullanılır. +- **`Content-Range`**: Kısmi bir mesajın tam bir gövde mesajı içindeki yerini belirtir. -## Mesaj gövdesi bilgileri +## Mesaj gövdesi bilgisi -- **`Content-Length`:** Kaynağın boyutu, ondalık sayı olarak bayt cinsinden. -- **`Content-Type`**: Kaynağın medya türünü belirtir. +- **`Content-Length`:** Kaynağın boyutu, ondalık bayt sayısı olarak. +- **`Content-Type`**: Kaynağın medya tipini belirtir - **`Content-Encoding`**: Sıkıştırma algoritmasını belirtmek için kullanılır. -- **`Content-Language`**: Hedef kitle için tasarlanan insan dili(ler)ini 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. +- **`Content-Language`**: Hedef kitle için amaçlanan insan dil(ler)ini tanımlar; böylece kullanıcıların tercih ettiği dile göre ayrım yapmasına olanak verir. +- **`Content-Location`**: Döndürülen veri için alternatif bir konumu gösterir. -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: +Pentest açısından bu bilgiler genellikle "kullanışsız"dır, ancak kaynak 401 veya 403 ile **korunuyorsa** ve bu bilgiyi **almanın** 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-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. +- `Range: bytes=20-20` başlığı ile yapılan bir istek ve `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` içeren bir yanıt, 20. baytın SHA1'inin `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` olduğunu leaking ediyor ## Sunucu Bilgisi @@ -108,28 +129,29 @@ Bir pentest açısından bu bilgi genellikle "işe yaramaz", ancak kaynak **401* ## 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. +- **`Allow`**: Bu başlık bir kaynağın hangi HTTP metodlarını işleyebileceğini iletmek için kullanılır. Örneğin `Allow: GET, POST, HEAD` şeklinde belirtilerek kaynağın bu metodları desteklediği gösterilebilir. +- **`Expect`**: İstemcinin, isteğin başarılı işlenmesi için sunucunun karşılaması gereken beklentileri iletmek için kullandığı başlıktır. Yaygın kullanım örneği `Expect: 100-continue` başlığıdır; bu, istemcinin büyük bir veri yükü göndermeyi planladığını sinyaller. İstemci, devam etmeden önce `100 (Continue)` yanıtını bekler. Bu mekanizma, sunucudan onay gelene kadar veri göndermeyi erteleyerek 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 olarak** (indirilmiş) mi gösterileceğini yönlendirir. Örneğin: +- HTTP yanıtlarındaki **`Content-Disposition`** başlığı, bir dosyanın **inline** (sayfa içinde gösterilmesi) mı yoksa **attachment** (indirilen) olarak mı muamele edileceğini yönlendirir. Örneğin: ``` Content-Disposition: attachment; filename="filename.jpg" ``` -Bu, "filename.jpg" adlı dosyanın indirilip kaydedilmek üzere tasarlandığı anlamına gelir. +Bu, "filename.jpg" adlı dosyanın indirilip kaydedilmesinin amaçlandığı anlamına gelir. ## Güvenlik Başlıkları ### İçerik Güvenlik Politikası (CSP) + {{#ref}} ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Güvenilir Türler** +### **Trusted Types** -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ına izin vererek, JavaScript kodunu varsayılan olarak güvence altına alır. +CSP aracılığıyla Trusted Types uygulanarak, uygulamalar DOM XSS saldırılarına karşı korunabilir. Trusted Types, yalnızca belirlenmiş güvenlik politikalarına uygun, özel olarak oluşturulmuş nesnelerin tehlikeli web API çağrılarında kullanılmasına izin vererek JavaScript kodunu varsayılan olarak güvence altına alır. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -148,19 +170,19 @@ 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. +Bu header, MIME türlerini tahmin etme (MIME type sniffing) uygulamasını engeller; bu uygulama XSS zafiyetlerine yol açabilir. Tarayıcıların sunucu tarafından belirtilen MIME türlerine uymasını sağlar. ``` X-Content-Type-Options: nosniff ``` ### **X-Frame-Options** -Clickjacking ile mücadele etmek için, bu başlık belgelerin ``, `