# Önbellek Zehirlenmesi ve Önbellek Aldatmacası
AWS hackleme konusunda sıfırdan kahramana kadar öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)! HackTricks'ı desteklemenin diğer yolları: * **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)! * [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin * [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu * **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.** * **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
\ [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın **en gelişmiş topluluk araçları tarafından desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin**.\ Bugün Erişim Alın: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} ## Fark > **Web önbellek zehirlenmesi ile web önbellek aldatmacası arasındaki fark nedir?** > > * **Web önbellek zehirlenmesinde**, saldırgan uygulamayı önbelleğe bazı kötü niyetli içerikler depolamaya zorlar ve bu içerik önbellekten diğer uygulama kullanıcılarına sunulur. > * **Web önbellek aldatmacasında**, saldırgan uygulamayı önbelleğe başka bir kullanıcıya ait hassas içerikleri depolamaya zorlar ve ardından bu içeriği önbellekten alır. ## Önbellek Zehirlenmesi Önbellek zehirlenmesi, istemci tarafı önbelleğini manipüle etmeyi amaçlayan ve istemcileri beklenmeyen, kısmi veya saldırganın kontrolü altındaki kaynakları yüklemeye zorlayan bir saldırıdır. Etki derecesi, kirletilmiş yanıtın yalnızca önbelleğin kirletilme süresi boyunca sayfayı ziyaret eden kullanıcılara sunulması nedeniyle etkilenen sayfanın popülerliğine bağlıdır. Önbellek zehirlenmesi saldırısının gerçekleştirilmesi birkaç adımı içerir: 1. **Anahtarsız Girişlerin Tanımlanması**: Bu, önbelleğe alınması için gerekli olmasa da sunucu tarafından döndürülen yanıtı değiştirebilen parametrelerdir. Bu girişlerin tanımlanması, önbelleği manipüle etmek için sömürülebileceği için önemlidir. 2. **Anahtarsız Girişlerin Sömürülmesi**: Anahtarsız girişleri tanımladıktan sonra, bir sonraki adım bu parametreleri nasıl kötüye kullanacağınızı belirlemektir, böylece saldırganın yararına sunucunun yanıtını değiştirebilirsiniz. 3. **Zehirli Yanıtın Önbelleğe Alınmasının Sağlanması**: Son adım, manipüle edilmiş yanıtın önbelleğe alındığından emin olmaktır. Bu şekilde, önbelleğin zehirlendiği sırada etkilenen sayfaya erişen herhangi bir kullanıcı kirletilmiş yanıtı alacaktır. ### Keşif: HTTP başlıklarını kontrol edin Genellikle bir yanıtın **önbelleğe alındığında buna işaret eden bir başlık** olacaktır, bu başlıklara dikkat etmeniz gereken başlıkları bu yazıda kontrol edebilirsiniz: [**HTTP Önbellek başlıkları**](../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers). ### Keşif: 400 kodunu önbelleğe alma Eğer yanıtın önbelleğe alındığını düşünüyorsanız, **kötü bir başlıkla istek göndermeyi** deneyebilirsiniz, bu durumda bir **durum kodu 400** ile yanıt verilmesi gerekmektedir. Daha sonra isteği normal olarak erişmeye çalışın ve yanıtın **400 durum kodu** olup olmadığını kontrol edin, eğer öyleyse zayıf olduğunu bilirsiniz (ve hatta bir DoS gerçekleştirebilirsiniz).\ Kötü yapılandırılmış bir başlık sadece `\:` olabilir.\ _Not: Bu tür durum kodlarının bazen önbelleğe alınmadığını unutmayın, bu test işe yaramaz olabilir._ ### Keşif: Anahtarsız girişleri tanımlayın ve değerlendirin [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) kullanarak sayfanın yanıtını değiştirebilecek **parametreleri ve başlıkları brute-force** yöntemiyle bulabilirsiniz. Örneğin, bir sayfa istemciye oradan betiği yüklemesi için `X-Forwarded-For` başlığını kullanabilir. ```markup ``` ### Zararlı bir yanıtı arka uç sunucudan çıkarın Belirlenen parametre/başlık ile kontrol edin, nasıl **temizlendiğini** ve nerede yansıtıldığını veya yanıtı nasıl etkilediğini kontrol edin. Herhangi bir şekilde kötüye kullanabilir misiniz (XSS gerçekleştirebilir veya sizin tarafınızdan kontrol edilen bir JS kodu yükleyebilir misiniz? DoS gerçekleştirebilir misiniz?...) ### Yanıtı önbelleğe alın Kötüye kullanılabilecek **sayfayı** belirledikten sonra, hangi **parametre**/**başlık**'ı kullanacağınızı ve nasıl **kötüye kullanacağınızı** belirledikten sonra, sayfayı önbelleğe almanız gerekmektedir. Önbelleğe alınmaya çalıştığınız kaynağa bağlı olarak, bu biraz zaman alabilir, birkaç saniye boyunca denemek zorunda kalabilirsiniz.\ Yanıtta bulunan **`X-Cache`** başlığı, isteğin önbelleğe alınmadığında **`miss`** değerine sahip olabileceği ve önbelleğe alındığında **`hit`** değerine sahip olabileceği için çok yararlı olabilir.\ **`Cache-Control`** başlığı da ilginç olabilir, bir kaynağın önbelleğe alınıp alınmadığını ve kaynağın bir sonraki sefer ne zaman önbelleğe alınacağını bilmek için: `Cache-Control: public, max-age=1800`\ Başka bir ilginç başlık ise **`Vary`**. Bu başlık genellikle önbellek anahtarı olarak işlenen normalde anahtarlanmamış ek başlıkları belirtmek için kullanılır. Bu nedenle, saldırgan, hedef aldığı kurbanın `User-Agent`'ını biliyorsa, o belirli `User-Agent`'ı kullanan kullanıcılar için önbelleği zehirleyebilir.\ Önbellekle ilgili bir başka başlık ise **`Age`**. Bu, nesnenin proxy önbelleğinde kaç saniye boyunca bulunduğunu tanımlar. Bir isteği önbelleğe alırken, kullanacağınız başlıklara **dikkat edin** çünkü bunlardan bazıları beklenmedik şekilde **anahtarlanabilir** ve **kurbanın aynı başlığı kullanması gerekebilir**. Her zaman **farklı tarayıcılar** kullanarak bir Önbellek Zehirlenmesini **test edin** ve çalışıp çalışmadığını kontrol edin. ## Sömürü Örnekleri ### En kolay örnek `X-Forwarded-For` gibi bir başlık yanıtta temizlenmeden yansıtılıyor.\ Temel bir XSS yükü gönderebilir ve önbelleği zehirleyebilirsiniz, böylece sayfaya erişen herkes XSS olacaktır: ```markup GET /en?region=uk HTTP/1.1 Host: innocent-website.com X-Forwarded-Host: a.">" ``` ### Web önbellek zehirlenmesini kullanarak çerez işleme açıklarını sömürme Çerezler ayrıca bir sayfanın yanıtında da yansıtılabilir. Örneğin bir XSS oluşturmak için bunu kötüye kullanabilirseniz, kötü amaçlı önbellek yanıtını yükleyen birkaç istemcide XSS'i sömürebilirsiniz. ```markup GET / HTTP/1.1 Host: vulnerable.com Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" ``` ### API anahtarını çalmak için yol gezinme ile önbellek zehirlenmesi [**Bu yazıda açıklandığı gibi**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` gibi bir URL ile bir OpenAI API anahtarının çalınabilmesinin mümkün olduğu çünkü `/share/*` ile eşleşen her şey, Cloudflare'ın URL'yi normalize etmeden önbelleğe alınacağı ve bu işlemin web sunucusuna ulaştığında gerçekleştiği belirtilmiştir. ### Web önbellek zehirlenmesi açıklarını sömürmek için birden fazla başlık kullanma Bazen bir önbelleği kötüye kullanabilmek için **birkaç anahtarsız girişi sömürmeniz gerekebilir**. Örneğin, `X-Forwarded-Host`'u sizin kontrol ettiğiniz bir alan adına ve `X-Forwarded-Scheme`'i `http` olarak ayarlarsanız, bir **Açık yönlendirme** bulabilirsiniz. **Eğer** sunucu tüm **HTTP** isteklerini **HTTPS'ye yönlendiriyorsa** ve yönlendirme için `X-Forwarded-Scheme` başlığını alan adı olarak kullanıyorsa, yönlendirmenin hedeflendiği yeri kontrol edebilirsiniz. ```markup GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ X-Forwarded-Scheme: http ``` ### Sınırlı `Vary` başlığı ile istismar Eğer yanıtta **`User-Agent`**'ı gösteren **`Vary`** başlığı kullanılıyorsa ancak **`X-Host`** başlığının bir JS kaynağını yüklemek için **alan adı** olarak kullanıldığını tespit ettiyseniz, kurbanın User-Agent'ını dışarı sızdırmak ve bu kullanıcı ajanını kullanarak önbelleği zehirlemek için bir yol bulmanız gerekecektir: ```markup GET / HTTP/1.1 Host: vulnerbale.net User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM X-Host: attacker.com ``` ### HTTP İsteği Kaçırarak HTTP Önbellek Zehirlenmesini Sömürme [HTTP İsteği Kaçırarak Web Önbellek Zehirlenmesini Gerçekleştirmek için](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning) nasıl yapılacağını öğrenin. ### Web Önbellek Zehirlenmesi için Otomatik Test [Web Önbellek Zafiyet Tarayıcısı](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) web önbellek zehirlenmesi için otomatik test yapmak için kullanılabilir. Birçok farklı teknik destekler ve yüksek derecede özelleştirilebilir. Örnek kullanım: `wcvs -u example.com`
\ [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen **iş akışlarını kolayca oluşturun ve otomatikleştirin**.\ Bugün Erişim Alın: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %} ## Zafiyetli Örnekler ### Apache Trafik Sunucusu ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577)) ATS, URL içindeki parçayı silmeden iletmiş ve önbellek anahtarını sadece ana bilgisayar, yol ve sorgu kullanarak oluşturmuş (parçayı yok sayarak). Bu nedenle, `/#/../?r=javascript:alert(1)` isteği, `/#/../?r=javascript:alert(1)` olarak backend'e gönderilmiş ve önbellek anahtarı içinde yalnızca ana bilgisayar, yol ve sorgu bulunmuş. ### GitHub CP-DoS İçerik türü başlığında kötü bir değer göndermek, önbelleğe alınmış bir 405 yanıtını tetiklemiştir. Önbellek anahtarı çerez içerdiği için yalnızca kimlik doğrulaması yapılmamış kullanıcılara saldırı yapmak mümkün olmuştur. ### GitLab + GCP CP-DoS GitLab, statik içeriği depolamak için GCP kovalarını kullanır. **GCP Kovaları**, **`x-http-method-override`** başlığını destekler. Bu nedenle, `x-http-method-override: HEAD` başlığını göndermek ve önbelleği boş bir yanıt gövdesi döndürmek mümkün olmuştur. Ayrıca `PURGE` yöntemini de destekleyebilir. ### Rack Ara Yazılımı (Ruby on Rails) Ruby on Rails uygulamalarında genellikle Rack ara yazılımı kullanılır. Rack kodunun amacı, **`x-forwarded-scheme`** başlığının değerini almak ve isteğin şeması olarak ayarlamaktır. `x-forwarded-scheme: http` başlığı gönderildiğinde, aynı konuma yönlendirilen bir 301 yönlendirmesi gerçekleşir, bu da potansiyel olarak bir hizmet Reddi (DoS) oluşturabilir. Ayrıca, uygulama `X-forwarded-host` başlığını kabul edebilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, saldırganın sunucusundan JavaScript dosyalarını yüklemesine neden olabilir ve güvenlik riski oluşturabilir. ### 403 ve Depolama Kovaları Cloudflare önceden 403 yanıtlarını önbelleğe almıştır. Yanlış Yetkilendirme başlıkları ile S3 veya Azure Depolama Bloklarına erişmeye çalışmak, önbelleğe alınan bir 403 yanıtına neden olmuştur. Cloudflare 403 yanıtlarını önbelleğe almaktan vazgeçmiş olsa da, bu davranış diğer proxy hizmetlerinde hala mevcut olabilir. ### Anahtarlı Parametreler Enjekte Etme Önbellekler genellikle özel GET parametrelerini önbellek anahtarında saklar. Örneğin, Fastly'nin Varnish'i isteklerde `size` parametresini önbelleğe almıştır. Ancak, URL kodlanmış bir sürümü (örneğin, `siz%65`) yanlış bir değerle gönderildiğinde, önbellek anahtarı doğru `size` parametresini kullanarak oluşturulur. Ancak, backend URL kodlanmış parametreyi işler. İkinci `size` parametresini URL kodlayarak, önbellek tarafından atlanmasına ve backend tarafından kullanılmasına neden olmuştur. Bu parametreye 0 değeri atamak, önbelleğe alınabilir 400 Kötü İstek hatası sonucunu vermiştir. ### Kullanıcı Ajanı Kuralları Bazı geliştiriciler, sunucu yükünü yönetmek için FFUF veya Nuclei gibi yüksek trafikli araçların kullanıcı ajanlarıyla eşleşen istekleri engeller. İronik bir şekilde, bu yaklaşım önbellek zehirlenmesi ve DoS gibi zafiyetlere neden olabilir. ### Yasadışı Başlık Alanları [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230), başlık adlarında kabul edilebilir karakterleri belirtir. Belirtilen **tchar** aralığının dışındaki karakterleri içeren başlıklar ideal olarak 400 Kötü İstek yanıtını tetiklemelidir. Uygulamada sunucular her zaman bu standartlara uymaz. Akamai gibi, geçersiz karakterler içeren başlıkları iletir ve `cache-control` başlığı mevcut olmadığı sürece herhangi bir 400 hatasını önbelleğe alır. Geçersiz bir karakter içeren bir başlık göndermenin, örneğin `\`, önbelleğe alınabilir 400 Kötü İstek hatası sonucunu vereceği bir açıklanabilir model belirlenmiştir. ### Yeni başlıklar bulma [https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) ## Önbellek Aldatmacası Önbellek Aldatmacasının amacı, istemcilerin **duyarlı bilgileriyle birlikte önbelleğe kaydedilecek kaynakları yüklemesini sağlamaktır**. Öncelikle **.css**, **.js**, **.png** gibi **uzantıların** genellikle **önbelleğe kaydedilmesi** için **yapılandırıldığını** unutmayın. Bu nedenle, `www.example.com/profile.php/nonexistent.js`'e erişirseniz, önbellek muhtemelen yanıtı saklayacaktır çünkü **.js** uzantısını görür. Ancak, **uygulama** _www.example.com/profile.php/_ içinde **saklanan duyarlı** kullanıcı içeriğiyle **yeniden oynuyorsa**, diğer kullanıcılardan bu içerikleri **çalabilirsiniz**. Test edilecek diğer şeyler: * _www.example.com/profile.php/.js_ * _www.example.com/profile.php/.css_ * _www.example.com/profile.php/test.js_ * _www.example.com/profile.php/../test.js_ * _www.example.com/profile.php/%2e%2e/test.js_ * _.avif_ gibi daha az bilinen uzantıları kullanın Bu yazıda çok açık bir örnek bulabilirsiniz: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ Örnekte, _http://www.example.com/home.php/non-existent.css_ gibi mevcut olmayan bir sayfa yüklerseniz, önceki kullanıcıların **duyarlı bilgilerini** içeren _http://www.example.com/home.php_ içeriği dönecek ve önbellek sunucusu sonucu kaydedecektir.\ Ardından, **saldırgan** kendi tarayıcısında _http://www.example.com/home.php/non-existent.css_'e erişebilir ve önceki kullanıcıların **gizli bilgilerini** gözlemleyebilir. Önbellek **proxy**'sinin dosyaları **içerik türüne** göre değil, dosya uzantısına göre önbelleğe alacak şekilde **yapılandırılması** gerektiğini unutmayın (_.css_). Örneğin, _http://www.example.com/home.php/non-existent.css_ önbelleğe alınmış bir `text/html` içerik türüne sahip olacaktır, beklenen `text/css` mime türü yerine (bir _.css_ dosyası için beklenen) olacaktır. [HTTP İsteği Kaçırarak Web Önbellek Aldatmaları Saldırılarını gerçekleştirmek için](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception) nasıl yapılacağını öğrenin. ## Otomatik Araçlar * [**toxicache**](https://github.com/xhzeem/toxicache): Web önbellek zehirlenmesi zafiyetlerini bulmak için bir URL listesinde tarayan ve birden fazla enjeksiyon tekniğini test eden Golang tarayıcı. ## Referanslar * [https://portswigger.net/web-security/web-cache-poisoning](https://portswigger.net/web-security/web-cache-poisoning) * [https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities](https://portswigger.net/web-security/web-cache-poisoning/exploiting#using-web-cache-poisoning-to-exploit-cookie-handling-vulnerabilities) * [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712) * [https://youst.in/posts/cache-poisoning-at-scale/](https://youst.in/posts/cache-poisoning-at-scale/) * [https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9](https://bxmbn.medium.com/how-i-test-for-web-cache-vulnerabilities-tips-and-tricks-9b138da08ff9) * [https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/](https://www.linkedin.com/pulse/how-i-hacked-all-zendesk-sites-265000-site-one-line-abdalhfaz/)
\ [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen **iş akışlarını kolayca oluşturun ve otomatikleştirin**.\ Bugün Erişim Alın: {% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)! HackTricks'ı desteklemenin diğer yolları: * **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın! * [**Resmi PEASS & HackTricks ürünlerini edinin**](https://peass.creator-spring.com) * [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz * **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'da takip edin.** * **Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.