HTML enjeksiyonu ile daha iyi eksfiltrasyon | D0NUT tarafından


Google çizimlerini kullandım ve bundan utanç yok
d0nut

Bu, bir sömürü tekniğini nasıl keşfettiğim ve mevcut hafifletmeleri atlayarak 5 basamaklı bir ödül için oldukça sınırlı bir hata aldığımla ilgili bir hikaye.

André Baptista Ve Önbellek çok garip bir hata üzerinde çalışıyorlardı. Basit bir karakter seti bypass olarak başladı ve hedefte başka bir yerde HTML enjeksiyonuna dönüştüğü çılgın bir dizi adımla (ancak tam gelişmiş XSS değil, Doppurifik etmek). Bu serin bir zincirdi ve büyük bir şeyin üzerine olduklarını söyleyebilirlerdi, ama bir sonraki adım onlara biraz sorun veriyordu.

Yaptıkları ilerlemeyi duyduktan sonra, bu hatayı artırmak için herhangi bir yardım teklif edip edemeyeceğimi görmek için atladım. Bu noktada, yapabileceğimiz en kötüsünün oldukça etkili bir tıklama saldırısı olduğunu belirledik. 0xacb (Andre) ve Cache-Money, potansiyel olarak yüksek etkili bir vuln elde etmek için birkaç saldırının nasıl bir araya geleceği konusunda güzel bir fikre sahipti, ancak farklı fikirlerim vardı.

Dompurify’ı belirledikten sonra izin verilmiş style Etiketler Varsayılan olarak, DOM’u manipüle etmekten daha fazlasını yapmak için CSS’den nasıl yararlanabileceğimizle oldukça ilgi duydum. Zaten bazı gönderilerimi okuduysanız, CSS enjeksiyon sömürüsüne yabancı olmadığımı bileceksiniz. Ne yazık ki, bu sayfanın her ikisi de çerçeve koruması vardı ve enjeksiyonu tetiklemek için bazı kullanıcı etkileşimleri gerekiyordu. Hassas bir şeyi dışarı atmak istersek, sızıntıyı gerçekleştirmek uzun zaman alacak (günlerce) sürecek gibi görünüyordu. Tabii ki bu oldukça zayıf, hataya eğilimli bir saldırıdır ve en iyi ihtimalle, bu hedefte düşük 4 haneli bir ödül verir.

Bu çalışma gibi bir saldırı yapmak için birden fazla CSS yükünü yeniden değerlendirmek için tarayıcıyı yeniden yüklemeden, iframe veya ek kullanıcı etkileşimi almadan almanın bir yoluna ihtiyacım vardı. Buna ek olarak, bizi daha da ileri ayarlamaya enjekte edebileceğimiz yükün uzunluğu konusunda sınırlamalarımız vardı. Sadece bir kullanarak bunu kullanmak gerçekten mümkün görünmüyordu tag… until I started thinking about interesting CSS features, namely @import.

Tekniğin etine girmeden önce, CSS enjeksiyonunda kullanılan geleneksel jeton eksfiltrasyon tekniğini tanımlamak için burada kısa bir bölüm bırakmak istiyorum. Zaten aşina iseniz, bir sonraki bölüme atlamaktan çekinmeyin. Ayrıca, önceki bir blog yazısında teknik üzerinde daha derinlemesine giriyorum.

Geleneksel CSS enjeksiyon jetonu eksfiltrasyon tekniği, CSS'nin bir özelliğine dayanır. Öznitelik seçicileri. Öznitelik seçicileri, bir geliştiricinin belirli bir stilin yalnızca bu öğenin bir özniteliği seçici tarafından belirtilen koşulu karşılarsa, bir öğeye uygulanması gerektiğini belirtmesine izin verir.

Yalnızca belirli koşullar verilen sayfadaki hassas öğeler için geçerli olan kurallar oluşturmak için öznitelik seçicisinden yararlanabiliriz. O zaman gibi özellikleri kullanabiliriz background-image Bu stiller uygulandığında tarayıcının saldırgan kontrollü bir sisteme çağırmasını sağlamak için. Bu, jeton eksfiltrasyonunu yönlendiren bir geri bildirim döngüsü oluşturmamızı sağlar.

Tipik bir CSS enjeksiyon jetonu exfil yükü

Bu örnekte, tarayıcıya şunu söylüyoruz "CSRF jetonu bir a Sonra ayarlayın background-image bulunan görüntü olmak https://attacker.com/exfil/a". Daha sonra, jetonun başlayabileceği her karakter için bu kuralı tekrarlarız (A, B, C, .. 7, 8, 9, vb.).

Jetonun ilk karakterinin ne olduğunu öğrendikten sonra, saldırıyı tekrar (genellikle IFrame kullanarak) ancak biraz değiştirilmiş bir yükle gerçekleştirebiliriz.

CSRF jetonunun ilk kömürü göz önüne alındığında, tipik bir CSS enjeksiyon jetonu exfil yükü 'C'

Bu örnekte, CSRF jetonunun ilk jetonunun bir c . Bu şekilde, önceki kuralı yeniden canlandırarak CSRF jetonunun ikinci karakterini belirleyebiliriz, ancak tüm jetonlar bir c.

Önkoşul

Yukarıda belirtilen teknik genellikle 3 şeyin doğru olmasını gerektirir:

  1. CSS enjeksiyonunun yeterince uzun yüklere izin vermesi gerekiyor
  2. Yeni oluşturulan yüklerin CSS'nin yeniden değerlendirilmesini tetiklemek için sayfayı çerçeveleme yeteneği
  3. Harici olarak barındırılan görüntüleri kullanma yeteneği (CSP tarafından engellenebilir)

Bu, enjeksiyon yeterince boyutlu yüklere izin vermiyorsa veya sayfa çerçevelenemiyorsa, önceki tekniğin uygulanamayacağı anlamına gelir. Bizim durumumuzda bu, hem çerçeveleme hafifletmelerinin varlığı hem de aslında enjekte edebileceğimiz sınırlı sayıda karakter nedeniyle bu tekniği kullanamadığımız anlamına geliyordu.

Birçok programlama dili, diğer kaynak dosyalardan kod içe aktarma yeteneğine sahiptir. CSS bir istisna değildir. Birçoğu sadece farkında olsa da CSS aslında bir tüfek isminde @import.

@import çoğu durumda, getirilen stillerin mevcut stil sayfasına doğrudan yerinde takas gerçekleştirir. Bu, bir geliştiricinin harici stilleri çekmesine ve aynı zamanda harici kaynakta tanımlanan istenmeyen yönergeleri aynı anda geçersiz kılmasına izin verir. @import astar.

Bu özelliğin bazı tarayıcılarda (yani krom) nasıl uygulandığının ilginç bir yan etkisi, harici kaynağın getirilebilmesidir paralel olarak Tarayıcıya, stil sayfasının geri kalanını da işleyen. Anladığım kadarıyla, bu davranışın “çözülmemiş içeriğin yanıp sönmesini” hafifletmeye çalışırken sayfanın TTI'sini arttırmasıdır (bkz:: Fouc problemi) ama aslında sömürüde pratik kullanıma sahiptir.

Bir an için aşağıdaki stil sayfasını içeren bir web sayfamız olduğunu düşünün:

@import url(https://laggysite.com/base.css);* { color: red; }

Chrome bu stil sayfasını 3 adımda işler:

  1. Bir istek vermek http://laggysite.com/base.css
  2. Kalan direktifleri değerlendirin (başvurun * { color: red; } )
  3. Ne zaman http://laggysite.com/base.css Geri döner, yanıtı stil sayfasına değiştirin ve stil sayfasını yeniden değerlendirin.

Stil sayfalarının yeniden değerlendirilmesinin bu tarayıcı davranışından yararlanabiliriz @import Hedefler, eski teknikte IFrame'lerden ihtiyaç duyduğumuz “CSS'nin yeniden değerlendirilmesini kontrol etme yeteneğini” simüle eden yanıt verir. Kullanmamız gereken tek gereklilik @import Başlangıçta kontrol sahibi olmalıyız style Etiket (ki bu HTML enjeksiyonudur).

Bunu yapmak için birkaç tane yaratacağız @import Stil sayfamızdaki kurallar ve sunucumuzun tüm bağlantıları açık tutmasına izin verin. Ardından, ilk jetonu hedef özniteliğimizden çıkarmak için standart bir CSS enjeksiyon jetonu exfil yükü kullanacağız. Sunucumuz bu jetonu aldıktan sonra background Stil, bir sonraki belirteci exfil yükünü oluşturabilir ve bir sonraki planlamaya yanıt verebiliriz @import Yeni basılmış yükü kullanarak kural.

Hepsini güzel ve düzgün hale getirmek için, her şeyi yalnız, başlangıç ​​ile başlatabiliriz @import kural (ayrıca yükün boyutunu sınırlama hedefimizi gerçekleştirmemize yardımcı olur).





Source link