hacktricks/pentesting-web/cache-deception.md

19 KiB
Raw Blame History

Ö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ı:


Dünyanın en gelişmiş topluluk araçları tarafından desteklenen iş akışlarını kolayca oluşturmak ve otomatikleştirmek için Trickest'i kullanın.
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:

  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ı belirlemeyi içerir, böylece saldırganın yararına sunucunun yanıtını değiştirebilir.
  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ı.

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 verilecektir. Daha sonra isteği normal olarak erişmeyi deneyin 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 kullanarak sayfanın yanıtını değiştirebilecek parametreleri ve başlıkları brute-force yöntemiyle belirleyebilirsiniz. Örneğin, bir sayfa istemciye oradan betiği yüklemesi için X-Forwarded-For başlığını kullanabilir:

<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 kontrolünüzdeki bir JS kodu yükleyebilir misiniz? DoS gerçekleştirebilir misiniz?...)

Yanıtı önbelleğe alın

Kötüye kullanılabilecek sayfayı, hangi parametre/başlığı 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 denemeler yapmanız gerekebilir.
Yanıtta bulunan X-Cache başlığı, isteğin önbelleğe alınmadığı durumlarda miss değerine sahip olabileceği gibi, önbelleğe alındığında hit değerine sahip olabilir.
Cache-Control başlığı da 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 ilginç olabilir: 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, 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 süredir bulunduğ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 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:

GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"

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 istismar edebilirseniz, kötü niyetli önbellek yanıtını yükleyen birkaç istemcide XSS'i sömürebilirsiniz.

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://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 normalleştirilmeden önbelleğe alınacaktır, bu da isteğin web sunucusuna ulaştığında yapıldı.

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 ık yönlendirme bulabilirsiniz. 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'ı 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ıya çıkarmak ve bu kullanıcı ajanını kullanarak önbelleği zehirlemek için bir yol bulmanız gerekecektir:

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 Zehirlenmesi Yapmak için nasıl saldırı yapılacağını öğrenin.

Web Önbellek Zehirlenmesi için Otomatik Testler

Web Önbellek Zafiyet Tarayıcısı web önbellek zehirlenmesi için otomatik testler yapmak için kullanılabilir. Birçok farklı teknik 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 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" %}

Zafiyetli Örnekler

Apache Trafik Sunucusu (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 backend'e /#/../?r=javascript:alert(1) olarak gönderildi ve önbellek anahtarı içinde yük yoktu, sadece ana bilgisayar, yol ve sorgu vardı.

GitHub CP-DoS

İçerik türü başlığında kötü bir değer göndermek 405 önbelleğe alınmış yanıtı tetikledi. Önbellek anahtarı çerez içerdiği için yalnızca kimlik doğrulama yapılmamış kullanıcılara saldırı yapmak mümkündü.

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ündü. 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 oluşur, 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 alıyordu. 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 olurdu. 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ına dahil eder. Örneğin, Fastly'nin Varnish'i isteklerde size parametresini önbelleğe alırdı. 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şturulurdu. Ancak, backend URL kodlanmış parametreyi işlerdi. İkinci size parametresini URL kodlamak, önbellek tarafından atlanmasına ancak backend tarafından kullanılmasına neden olurdu. Bu parametreye 0 değeri atamak, önbelleğe alınabilir 400 Kötü İstek hatası oluştururdu.

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 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 standarta uymazlar. Akamai gibi belirgin bir örnek, 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ına neden olabileceği bir açık model belirlendi.

Yeni başlıklar bulma

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 ayarlandığı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'de 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 konuda çok net bir örnek şu yazıda bulunabilir: 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ı bilgileriyle http://www.example.com/home.php içeriği döndürülecek 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 ayarlanmış olması gerektiğini unutmayın (.css). Örneğin http://www.example.com/home.php/non-existent.css önbelleğe alınacak bir text/css mime türü yerine text/html içerik türüne sahip olacaktır (ki bu bir .css dosyası için beklenen budur).

HTTP İsteği Kaçırarak Web Önbellek Aldatmacaları Saldırıları Yapmayı öğrenin.

Referanslar


Trickest 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" %}

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları: