Kolay Hack: Siteler Arası Komut Dosyası Dahil Etme Yoluyla Veri Nasıl Elde Edilir. XSS güvenlik açıklarından en iyi şekilde yararlanma Xss noscript uyarısı

XSS güvenlik açığı nedir? Ondan korkmalı mıyım?

Siteler Arası Komut Dosyası (kısaca XSS), birçok web uygulamasını etkileyen yaygın bir güvenlik açığıdır. Saldırganın, siteyi ziyaret eden kullanıcının tarayıcısı kodu çalıştıracak şekilde bir web sitesine kötü amaçlı kod enjekte etmesine olanak tanır.

Tipik olarak, bu tür bir güvenlik açığından yararlanmak, kullanıcıyla bir miktar etkileşim gerektirir: ya sosyal mühendislik kullanılarak virüslü bir siteye çekilirler ya da yalnızca kullanıcının siteyi ziyaret etmesini beklerler. Bu nedenle, geliştiriciler genellikle XSS güvenlik açıklarını ciddiye almazlar. Ancak ele alınmazlarsa, ciddi bir güvenlik tehdidi oluşturabilirler.

Yeni içerik ekleyerek WordPress yönetici panelinde olduğumuzu hayal edin. Bunun için XSS'ye karşı savunmasız bir eklenti kullanırsak, tarayıcıyı yeni bir yönetici oluşturmaya, içeriği değiştirmeye ve diğer kötü niyetli eylemler gerçekleştirmeye zorlayabilir.

Siteler arası komut dosyası çalıştırma, bir saldırgana bugünlerde en önemli yazılım parçası olan tarayıcı üzerinde neredeyse tam kontrol sağlar.

XSS: Enjeksiyon Güvenlik Açığı

Herhangi bir web sitesi veya uygulamanın birden çok veri giriş konumu vardır - URL'nin kendisine kadar form alanları. Veri girişinin en basit örneği, bir forma bir kullanıcı adı ve şifre girdiğimiz zamandır:

Şekil 1. Veri giriş formu

İsmimiz, gelecekte bizimle iletişim kurmanız için sitenin veritabanında saklanacaktır. Elbette, herhangi bir siteye giriş yaptığınızda, "Hoş Geldiniz Ilya" tarzında kişisel bir selamlama gördünüz. Bu amaçla, kullanıcı adları veri tabanında saklanır.

Enjeksiyon, bir ad veya parola yerine özel bir karakter dizisi girildiğinde sunucuyu veya tarayıcıyı saldırganın ihtiyaç duyduğu belirli bir şekilde yanıt vermeye zorlayan bir prosedürdür.

Siteler arası komut dosyası oluşturma, bir web sitesi adına tarayıcıda eylemleri yürütecek kodu enjekte eden bir enjeksiyondur. Bu, kullanıcının bilgisi olmadan hem kullanıcının bildirimiyle hem de arka planda olabilir.

Şekil 2. Siteler arası komut dosyası oluşturmanın görsel bir diyagramı

En basit örnek, bir bildirim penceresi görüntüleyen temel bir komut dosyasıdır. Şuna benzer:

Tablo 1. Açılır pencereyi çağıran komut dosyası

Bu komut dosyası "BU XSS GÜVENİLİRLİĞİ !!!" yazısıyla bir pencere çağırır. Kullanıcının tarayıcısı, bu komut dosyasını sitenin yasal kodunun bir parçası olarak algılar ve yürütür.

XSS güvenlik açıklarının türleri

Tüm XSS güvenlik açıkları aynı değildir, birçok türü vardır. Türler ve nasıl etkileşimde bulundukları aşağıda verilmiştir:

Şekil 3. XSS güvenlik açıklarının türleri


Sunucu tarafı kodunun neden olduğu güvenlik açıkları (Java, PHP, .NET vb.):

Geleneksel XSS saldırıları:

  1. Yansıyan (süreksiz). Yansıyan bir XSS saldırısı, bir kullanıcı özel olarak hazırlanmış bir bağlantıya tıkladığında tetiklenir. Bu güvenlik açıkları, bir web istemcisi tarafından, çoğunlukla HTTP istek parametrelerinde veya HTML biçiminde sağlanan veriler, uygun işlem yapılmadan o istemci için bir sonuç sayfasını ayrıştırmak ve görüntülemek için doğrudan sunucu tarafındaki komut dosyaları tarafından yürütüldüğünde ortaya çıkar.
  2. Saklandı (kalıcı). Depolanan XSS, bir saldırgan, orijinal sayfaya her erişildiğinde tarayıcıda çalışan bir sunucuya kötü amaçlı kod enjekte edebildiğinde mümkündür. Bu güvenlik açığının klasik bir örneği, HTML yorumlarına izin veren forumlardır.

İstemci tarafı kodunun neden olduğu güvenlik açıkları (JavaScript, Visual Basic, Flash vb.):

DOM modelleri olarak da bilinir:

  1. Yansıtılmış (süreksiz). Sunucu tarafında olduğu gibi, ancak bu durumda saldırı, kodun tarayıcı tarafından işlenmesi nedeniyle mümkündür.
  2. Saklandı (kalıcı). Sunucu tarafında depolanan XSS'ye benzer şekilde, yalnızca bu durumda kötü amaçlı bileşen, tarayıcı depolaması kullanılarak istemci tarafında depolanır.

Altyapı güvenlik açıkları (tarayıcı, eklentiler, sunucular vb.):

Çok nadir, ancak daha tehlikeli:

  1. İstemci tarafı altyapısı. Kötü amaçlı bir bileşen, tarayıcı işleviyle, örneğin XSS filtresi vb. İle herhangi bir değişiklik yaptığında ortaya çıkar.
  2. Sunucu tarafı altyapısı. Bir web sunucusu istekleri doğru şekilde işlemediğinde ve değiştirilmesine izin verdiğinde ortaya çıkar.
  3. Ağ. İstemci ile sunucu arasındaki iletişime sızmak mümkün olduğunda gerçekleşir.

Kullanıcı kaynaklı güvenlik açıkları:

  1. Kendinden XSS. Genellikle, bir kullanıcı tarayıcısında yanlışlıkla kötü amaçlı kod çalıştırdığında, sosyal mühendisliğin bir sonucu olarak gerçekleşir.

XSS tehlikesi nedir?

Sitenizi XSS'den nasıl koruyabilirsiniz? Güvenlik açıkları için kod nasıl kontrol edilir? Sucuri Güvenlik Duvarı gibi, bu tür saldırıları önlemek için özel olarak tasarlanmış teknolojiler vardır. Ancak bir geliştiriciyseniz, XSS güvenlik açıklarını nasıl belirleyeceğiniz ve düzelteceğiniz hakkında kesinlikle daha fazla bilgi edinmek isteyeceksiniz. XSS ile ilgili makalenin sonraki bölümünde bunun hakkında konuşacağız.

Herkes uzun zamandır bir saldırganın XSS kullanarak bir kurbana çerez göndermeye, CSRF belirteçlerini okumaya, kimlik avı saldırısı yapmaya (sahte bir giriş formu oluşturarak), bir kullanıcı adına bazı eylemler gerçekleştirmeye ve diğer bazı benzer saldırılara (belki de bu tüm olasılıklar, ancak bunlar şu anda bildiğim en popüler olanlar).

Bu yöntemin amacı, saldırıya uğrayan sitede ziyaret ettiği kullanıcı adına sayfaları izlemenin yanı sıra tuş vuruşlarını da izlemektir (ayrıca hareket ettirebilir ve fare tıklamalarını da yapabilirsiniz, ancak benim için bu gereksiz olacaktır, çoğu durumda pek kullanışlı bir bilgi olmayacaktır). ...
Şimdi maksimum fayda için - algoritmanın şöyle olacağına inanıyorum:

  • tanımlama bilgilerini okuyun ve gönderin;
  • bilgilerin geri kalanını okuyun ve gönderin (IP adresi, yüklü eklentiler, tarayıcı sürümü ve türü, flash desteği, silverlight desteği vb.) [isteğe bağlı]
  • dahili ağ hakkında bilgi alırız, yönlendiriciyi aşarız [isteğe bağlı]
  • farklı belirteçleri okuyun ve gönderin [isteğe bağlı];
  • phishing [isteğe bağlı] uyguluyoruz;
  • kullanıcı tarafından "elle" "bir şeyler yapın [isteğe bağlı];
  • sekmeyi kapatana veya siteden ayrılana kadar onu gözetlemeye ve bilgi almaya devam ediyoruz;

Listedeki tüm isteğe bağlı öğeler, duruma ve XSS kullanılarak elde edilecek amaçlar için belirli önceliklere bağlı olarak gerçekleştirilmelidir, bazen birbirleriyle çakışabilirler (daha doğrusu bunları birleştirmeye çalışırsanız, tek tek gerçekleştirirseniz) ve XSS kullanımının başarısız olma olasılığını artırabilirler.
Ancak her durumda ilk ve son noktalara mutlaka uyulmalı, aslında yazının ana kısmı bu listeden son nokta ile ilgili olacaktır.

Hedefe geliyoruz.

Uzaktan başlayacağım: JavaScript aracılığıyla, sayfayı yeniden yüklemeden adres çubuğundaki yolu değiştirmek mümkündür. Örneğin, bir kullanıcı şu adrese bir sayfa yüklediyse

http://site.com/some/path/to/page/


Ardından adres çubuğunda içerik aşağıdaki gibi olacaktır (sayfayı yeniden yüklemeden):

http://site.com/new-url/

http: //site.com/new-url/


Bu arada, bu özellik, Yansıtılmış XSS içeren bağlantıya tıkladıktan sonra URL'yi kullanıcılardan (veya daha dikkatli kullanıcı kategorisinden - yöneticilerden) gizlemek gerektiğinde, bazen oldukça yararlıdır, böylece daha sonra, sayfayı yükledikten sonra, adres çubuğuna hiçbir şey bulunamadı.

http: //site.com/search.php?q\u003d123

http://site.com/search.php?q\u003d123

http: //site.com/search.php?q\u003d123


onu bu fırsattan mahrum edeceğiz.

Ancak bu tekniğin daha da ilginç ve güçlü kullanımları vardır. Kullanıcının bağlantıya tıkladıktan sonra sitede kalışını simüle edeceğiz, aslında her zaman aynı sayfada kalacak ve bu sırada üçüncü taraf bir komut dosyası çalışacak, saldırgana bilgi çıkaracak ve gönderecektir. Böylece, XSS, kullanıcı bu alandaki bağlantıyı takip ettiği sürece çalışacaktır. .

Fikri biz tanımlıyoruz.

Genel çalışma prensibi şu şekildedir: bir kullanıcı XSS \u200b\u200bile bir sayfayı ziyaret ettiğinde, komut dosyası sayfayla aynı adrese sahip bir iframe oluşturur ve bunu ön plana "ekler", kullanıcı sayfanın normal olarak yüklendiğini gösterir, çünkü iframe yalnızca kodda görülebilir sayfalar.

Ve yardımcı komut dosyası, casus botun mantığını kontrol eder, yani, adres çubuğunda değiştirmek için çerçevedeki adres değiştiğinde izler, ancak çerçevenin yeni değiştirilen adresinde farklı bir alan varsa, yeni bir vlkadka'da açabilirsiniz veya sayfayı yeniden yüklemeniz gerekir. yanmamak için.
Bu nedenle, XSS'nin o anda çalışmayı durdurması için, kullanıcının ya sayfayı manuel olarak yenilemesi gerekir (XSS Yansıtılmışsa ve POST yöntemiyle iletilmişse, diğer durumlarda güncelleme kaydedilmez ve bu arada, bazı tarayıcılar artık sayfayı güncellerken POST isteğini tekrar gönderebilir) sekmeyi kapatın veya başka bir etki alanına geçin (bu durumda yine de kontrolü kaybetmekten kaçınabilirsiniz).

Saldırıya uğrayan etki alanının bir alt etki alanına giderse, saldırganın seçimi, yani XSS işe yarayacaktır, ancak kullanıcının adres arasında bir tutarsızlık görme olasılığı çok düşüktür. Buradaki duruma göre örneğin google.ru alanı saldırıya uğradıysa, kullanıcının Google'ın bulut dosya hizmetine gittiğini düşünüyorum, ki bu genellikle drive.google.ru alt etki alanında yer alıyor, o zaman adres çubuğuna bakarken yakalamayı fark etme olasılığı oldukça yüksek. , bu hizmeti sık sık kullanırsa... Aksi takdirde riske girebilirsiniz. Ancak, Cross Origin Politikası buna izin vermeyeceğinden, verilerini bir alt etki alanına sahip bir çerçeveden okuyamayacağımızı dikkate almalıyız. Ancak, gizli modda ana etki alanına sakince tırmanabiliriz (aşağıda bu konuda daha ayrıntılı olarak daha ayrıntılı bilgi vereceğiz).

Sadece bu yöntemin sınırlamaları vardır, yani - sitenin web sunucusunun yanıtlarında bir başlık varsa çalışmaz. X-Frame-Seçeneklerianlamı ile REDDETMEK... Ama şahsen, bu tür sitelerle sadece birkaç kez tanıştım, şimdi yarısı bile SAMEORIGINtam kısıtlama bir yana, maruz kalmamış REDDETMEK.

Fikri analiz ediyoruz.

Şimdi birçok kişi muhtemelen BeEF gibi harika bir şeyi hatırladı, ki bu da birçok ilginç şeye sahip. Bu arada, çerçevede zorunlu kullanıcı yeniden yönlendirme seçeneği de vardır, ancak adres çubuğundaki adres değişmez, bu da masayı hızlı bir şekilde yakabilir ve bu seçenek başka amaçlara biraz hizmet eder.
Genel olarak, BeEF'e ihtiyacınız olan hemen hemen her şeye ve hatta birçok ek işleve sahiptir, ancak kişisel olarak ek işlevler istedim, yani:

  • saldırıya uğrayan kullanıcının erişebildiği sayfaların kodunu gerçek zamanlı izleme yeteneği;
  • o sitede yazdığı her şeyi (giriş ve şifreden, kısayol tuşlarına ve mesajlara kadar), yani JS'de keylogger'ı izleme yeteneği;
  • alınan sayfaların kodunu görüntüledikten sonra botunuza gerçek zamanlı olarak JS komutları verme yeteneği;
  • komutları bota yerel olarak bırakma yeteneği, böylece komutları daha sonra onları "alır" ve doğrudan katılımımız olmadan yürütür;
  • botun yanma olasılığının düşük olması veya botun meraklı gözlerden "saklanma" yeteneği;

Yukarıda bahsedildiği gibi, BeEF'in harika komut yürütme kuyruğu fikrinden ödünç almaya karar verdim. Örneğin, ayrıcalıklı bir kullanıcı depolanmış XSS ile kontrol paneline tırmandığında botun attığı sayfaları analiz ettik, komutu bot - JS koduna bırakıyoruz, kullanıcının bir sonraki girişinde olduğu gibi, bu düğmeye basıp, bu değeri buraya yaz, vb. Bu kullanıcı bir sonraki sayfayı ziyaret ettiğinde, bot komutları okur ve onları çalıştırır ve onun dümeninde olmamız gerekmez - bu çok uygundur.

Temel olarak, böyle bir bot, elbette, içerik yönetimi için ek "kaldıraçlar" olan bazı sitelerin durum kullanıcıları, diğer kullanıcılar için tasarlanmıştır. İşlevsellik taleplerinden, sunucu tarafı olmadan yapamayacağınız açıktır.

Fikri uygulayalım.

Prensip olarak, makalenin bu bölümünü atlayabilirsiniz, çünkü birileri onu değiştirmek veya kendileri için bitirmek isterse, istenen botu ve bazı ayrıntılarını uygulama sürecini basitçe açıklar. Kodun başındaki bot, üzerinden bazı ayarları yapabileceğiniz değişkenlere sahip olsa da.
İlk olarak, yükleme anından itibaren bot eylemlerinin algoritması:

1) Bir başlığın kontrol edilmesi X Çerçeve Seçenekleri: DENY(varsa, oltaları yuvarlayın);
2) Bir çerçeve yerleştirmek ve botun tüm bileşenlerini kurmak;
3) Komut dosyasını ve HTML kodundaki tüm izleri kaldırma;
4) Sunucu tarafı ile iletişim kurmak ve veri göndermeye başlamak, yanıtlara tepki vermek (sunucudan komutlar almak);

İlk nokta tamamen tamamlanmadı, yani bot yalnızca ilk sayfayı ve kök başlığını kontrol ediyor. Gerçek şu ki, genellikle bu başlıklar web sunucusu tarafından tüm sayfalar için bir kerede gömülür ve her şeyin ayrı bir sayfa için "elle" yapılması çok nadirdir. Ve bu unvanın kendisi oldukça nadirdir. İkinci ve üçüncü hakkında söylenecek özel bir şey yok, her şey daha düşük olacak.

Kodunuza bot betiği kodunu eklemeden önce, tespit şansını azalttığı ve en önemlisi çerçeveye bir adres eklerken meydana gelen özyinelemeyi engellediği için, adres çubuğundaki XSS işaretlerinden hemen (JS kodundan) kurtulmanız gerektiğinin görece önemli bir nokta vardır. aynı XSS \u200b\u200bkoduyla, bu da kendi başına başka bir çerçeve oluşturur ve bu böyle devam eder.

Ancak her ihtimale karşı, bot kodu böyle bir çerçeve özyinelemesini tespit etme ve onu önceden oluşturulmuş bir çerçeveye ilk kez bir çerçeve ekleme girişiminde önleme olasılığını uygular, ancak yalnızca ona güvenmemek, bot kodunu yüklemeden önce ek olarak kodu silmek daha iyidir. Henüz herhangi bir sorunla karşılaşmadım.

Çerçeve güncelleme kontrol işlevi. Olay işleyicilerini asarak bu sorunu ekonomik olarak çözmenin birkaç yolunu denedim. contentWindowveya contentDocument, ancak hiçbir şey başarılı olmadı, bu yüzden çerçevenin adresini kontrol edecek ve bunu daha önce kaydedilenle karşılaştıracak bir işlev yazmam ve buna dayanarak çerçevenin güncellenip güncellenmeyeceğine (adresin değişip değişmediğine) karar vermem ve ardından kendini yinelemeli olarak çağırmam gerekti.

Saniyede bu tür kontrollerin sıklığı bir değişken tarafından kontrol edilir gecikmebot kod dosyasının başında belirtilir. Ancak daha sonra, daha önce yazdıktan sonra daha verimli bir çözüm buldum - basit bir çözüm kullanın yüklemekare başına, bu yüzden bu işlevi bıraktım, ancak daha sonra daha fazla talep görmesi durumunda onu yorumladım.

Sayfanın HTML kodunu gönderme.

Burada şema oldukça basittir - çerçevenin her yeniden yüklenmesinden sonra (ilk yükleme dahil), bot sunucuya sayfanın tüm HTML kodunu geçerli adresiyle birlikte gönderir, böylece daha sonra kodun gerekli sayfalara ait olup olmadığını ayırt edebilirsiniz.

Sunucu, sayfaları saklama mantığını uygular - her etki alanı için sunucu bu etki alanının adıyla bir klasör oluşturur ve orada tüm verileri kaydederiz. Sayfa kodları kaydedilir ve sürekli olarak en son sürümlere güncellenir, ancak her yeni günde sayfanın yeni bir kopyası oluşturulur, böylece gerekirse sürüm geçmişini kontrol edebilirsiniz. Yani /news.php1 Eylül'de durum güncellenecek ve 2 Eylül'de bunun bir kopyası oluşturulacak, yalnızca o gün için ve dolayısıyla her gün tekrar (kullanıcı bu sayfayı her gün ziyaret ederse) ilgili olacak. Sayfa adı, site köküne göre (yani, etki alanı olmadan) bu sayfanın tarih ve yolundan oluşur.

JavaScript'te Keylogger.

Fikir zaten bazı meraklılar tarafından uygulandı, ancak benim için geliştirmeleri uymuyordu, sadece çoğu oldukça basit olduğu için, yani basılan tuşun kodunu tespit ettiler ve aracılığıyla String.fromCharCodesembollere çevrildi. Ancak bu yöntemin bir takım dezavantajları vardır - vardiya, kontrol, boşluk vb. Gibi kontrol tuşları herhangi bir biçime dönüştürülmez (genellikle sadece boş bir karakterdir), alfanümerik tuşların shift tuşuyla etkileşimi yanlış şekilde kaydedilir, çünkü bunun programla uygulanması gerekir ve ayrıca, basılan tüm tuşlar büyük harf olarak görüntülenir ve bu da programla düzeltilebilir.

Sonuç, tüm sayı, harf ve temel karakter anahtarlarını doğru bir şekilde algılayan, her iki düzen üzerinde çalışan, vardiyaya yanıt veren ve tüm ana özel anahtarları günlüğe kaydeden bir keylogger oldu. Doğru, bazı makinelerde (vardiya ve numaraya basıldığında basılan dijital satırın üst kısmında) bazı karakterler, bazı şirketlerin bazıları için değiştirdiği ana standarda göre uygulandıkları için farklılık gösterebilir.
Basılan karakterlerin her bir bölümü, metin öğesi odağı kaybedene kadar müşteri tarafından tutulur. Daha sonra bu kısım, her gün yeni bir kopya ile oluşturulacak bir metin dosyasına kaydedildiği sunucuya gönderilir, böylece büyük boyutlarda büyüme olmaz ve kullanıcının böyle bir zamanda ne yazdığını hızlı bir şekilde bulabilirsiniz.
Anahtarların kendilerine ek olarak, metnin yazıldığı öğe hakkındaki bilgiler her bölümle birlikte sunucuya gönderilir (yani, ,