Uygulamalarla XSS’e Gerçekçi Bir Yaklaşım

XSS’e Gerçekçi Bir Yaklaşım

Web güvenliğinin temel taşlarından biri olan XSS (Cross-Site Scripting) zafiyeti, hem kullanıcıların kişisel verilerini riske atar hem de uygulamanın güvenliğini zedeler. Günümüzde birçok web sitesi bu açıkla karşı karşıya kalmakta ve kullanıcılarının bilgilerini korumakta zorluk çekmektedir. XSS, saldırganların zararlı kodları kullanıcı tarayıcısında çalıştırmasına olanak tanıyarak oturum çalma, kimlik avı gibi ciddi risklere yol açabilir. Bu yazıda, gerçek dünyada karşılaşılan XSS örneklerinden yola çıkarak, bu zafiyetin nasıl tespit edilebileceğini adım adım ele alacağız. Bu rehberin sonunda, XSS açıklarını daha iyi anlama ve güvenli web uygulamaları geliştirme konusunda pratik bir bakış açısına sahip olacaksınız.

İlk XSS Tespitimize Başlayalım( Reflected XSS)

XSS ararken ilk odaklanmamız gereken konu, kullanıcıdan gelen input verisinin HTTP Response içerisinde nerelere yansıdığıdır. Bu aşamada, örneğin bir arama kutusuna "test"'<> gibi çeşitli payload'lar girerek test edebiliriz.

Örneğin, varsayımsal sitemiz store.com üzerinde arama butonuna payload inputumuzu veriyoruz. Aramayı yaptıktan sonra CTRL+U tuşlarıyla sayfanın kaynağını görüntülüyoruz. Ardından CTRL+F ile sayfa kaynağında "test" kelimesini arıyoruz.

Hedefimiz: Eğer sayfa kaynağında “test” kelimesinin yanına yazdığımız "'<> gibi özel karakterler olduğu gibi görünüyorsa, bu sitede XSS zafiyeti bulunabileceğini öngörebiliriz. Fakat eğer bu karakterler encode edilmişse (örn. < yerine &lt; gibi), XSS zafiyeti bulmak daha zor olacaktır. Bu yüzden başlangıç olarak encode edilmediklerinden emin olmamız gerekiyor.

Kodda İnceleme ve İlk Testler

Özel karakterlerin encode edilmediğinden emin olduktan sonra, test kelimesinin geçtiği alanları incelemeye başlıyoruz. İlk olarak <meta> etiketine bakalım. Özel karakterlerin geçtiği alanlarda kendi HTML ve JavaScript kodumuzu yazabiliriz. En basit XSS testimiz, alert(1) komutu kullanarak bir popup mesaj çıkarmaktır. Bu komutu çalıştırmak için aşağıdaki payload'u deneyebiliriz:

Payload:

"><svg onload=alert(1)>

Sayfa kaynağında aşağıdaki gibi bir kod görebiliriz:

<meta name="description" content="Arama Terimi: test"'<>"/>

Bu alana XSS payload’umuzu ekleyebilmek için:

  1. Öncelikle content değerini kapatmak için ", ardından > karakterini ekliyoruz.
  2. Ardından istediğimiz JavaScript kodunu "><svg onload=alert(1) şeklinde yazıyoruz.

Bu durumda, sayfa kaynağında aşağıdaki gibi bir yapı oluşacaktır:

<meta name="description" content="Arama Terimi:"><svg onload=alert(1)"/>

Sonuç: alert(1) komutunu çalıştırdığımızda tarayıcıda bir popup mesaj görünecektir. Bu da XSS zafiyetinin varlığını kanıtlar. Bu bölümde, istediğimiz herhangi bir JavaScript kodunu çalıştırabiliriz.

Başarılı olan alert(1) komutu

Öneri: Bu gibi zafiyetleri önlemek için, sitenizde belirli karakterleri encode etmeniz gerekmektedir. Bu zafiyet türü, “Reflected XSS” olarak adlandırılır

Stored XSS Saldırısı: Yorumlar Bölümünden Pratik Bir Örnek

Stored XSS (Depolanmış XSS), web uygulamalarındaki en tehlikeli güvenlik açıklarından biridir. Bu tür bir zafiyet, kötü niyetli bir kullanıcının JavaScript kodunu, başka kullanıcıların tarayıcılarında çalıştırabilmesini sağlar. Bugün, bir yorumlar bölümü üzerinden Stored XSS saldırısını nasıl gerçekleştirebileceğimizi ve buna karşı alabileceğimiz önlemleri adım adım anlatacağız.

Senaryoyu Tanıyalım

Diyelim ki bir blog sitesi üzerinde çalışıyoruz. Sitede kullanıcılar, yazılara yorum yapabiliyor. Bu yorumlar, veritabanında depolanır ve diğer kullanıcılar tarafından görüntülenir.

Bu tür özellikler, kullanıcıdan gelen verilerin doğru şekilde işlenmemesi durumunda Stored XSS zafiyetine yol açabilir. Bu yazıda, bir saldırganın yorumlar bölümüne kötü niyetli JavaScript kodu enjekte ettiğini ve diğer kullanıcıların bu kodu nasıl çalıştıracağını inceleyeceğiz.

İnput bulma ve Test Etme

Websitemize girdik ve input alanlarını keşfederken bir yorum alanı olduğunu farkettik. Bu yorum alanına yazdığımız yorumlar ürünün sayfasında görünmekte. Eğer burada <>'" karakterlerini çalıştırabilirsek bir Stored XSS keşfedebiliriz. Yorum alanına Test Payload’ımızı yazarak başlayalım

Şeklinde yorum alanımızı doldurduk ve yorumumuzu gönderiyoruz.

Yorumumuz yayınlandı ve bu şekilde görünüyor şimdi CTRL+U ile sayfa kaynağında tester kelimesini aratıyoruz.

Sayfa kaynağında özel karakterlerin encode edildiği bölümler olsa da bu alandaki özel karakterler encode edilmemiş yani burada kodlarımızı çalıştırabiliriz.
Burada özgür olduğumuz konu bizi engelleyen herhangi bir işaret ve etiketin olmaması.

Bu alana farklı farklı payloadlar yükleyebiliriz.

<script>alert(1);</script> Direkt olarak script tagleri açarak JS kodları çalıştırabiliriz ve bu payloadı kullanacağız.

Hangi Payload’ı çalıştıracağımızın detaylarına “XSS ve HTML Context Örnekleri” konusundan ulaşabilirsiniz.

Yorum alanımı payloadımı yazarak hazırladım şimdi yorumu gönderiyorum ve sayfamı yeniliyorum.

Tam olması gerektiği gibi alert(1) çalıştı artık burada tüm javascript kodlarımızı çalıştırabiliriz ve sayfaya giren herkes tarafından bu kod otomatik olarak çalıştırılır. Kodumuz için yorum bölümünün kodunda bu şekilde görünecektir.

Kötü niyetli bir kişini burada çalıştıracağı zararlı bir Cookie Stealer kodu sayfaya giren herkesin bilgilerini çalacaktır. Bu şekilde de bir Stored XSS zafiyeti tespiti yapmış olduk.

Sonuç

XSS zafiyetleri, doğru güvenlik önlemleri alınmadığında, kullanıcıların kişisel verilerinin tehlikeye girmesine ve web uygulamalarının güvenliğinin ciddi şekilde zarar görmesine neden olabilir. Bu yazıda anlatılan adımları takip ederek, XSS açıklarını tespit etmek için gerekli temel bilgiye sahip oldunuz. Özel karakterlerin doğru şekilde encode edilmesi, kullanıcıdan gelen verilerin güvenli bir şekilde işlenmesi ve dışa yansıtılmadan önce uygun doğrulamaların yapılması gibi önlemler, XSS zafiyetlerini önlemenin en etkili yollarıdır.

Öneriler:

  1. Encode işlemleri: Kullanıcıdan alınan inputların, özellikle HTML, JavaScript veya URL içeriklerinin encode edilmesi büyük önem taşır.
  2. Filtreleme ve doğrulama: Kullanıcıdan gelen veriler, güvenlik açısından filtrelenmeli ve doğrulanmalıdır.
  3. Güvenlik testleri ve araçlar: Web uygulamanızı düzenli olarak güvenlik testlerine tabi tutmak ve XSS testlerini çeşitli araçlarla (örneğin, Burp Suite, OWASP ZAP) yapmak kritik öneme sahiptir.
  4. Eğitim ve farkındalık: Web uygulamalarında çalışan geliştiricilerin, XSS gibi güvenlik açıklarına karşı bilinçli olması, bu tür zafiyetlerin önlenmesinde önemli bir faktördür.

Son olarak, XSS gibi zafiyetlerin etkisini azaltmak için uygulamanızda güvenlik açıklarını tespit etmek ve en iyi güvenlik uygulamalarını takip etmek gereklidir. XSS konusunda daha fazla bilgi edinmek için uygulama içindeki güvenlik açıklarını aktif olarak test etmeye devam edin ve bulgularınızı doğru şekilde raporlayın. Web güvenliği her geçen gün daha fazla önem kazandığı için bu konuda bilgi sahibi olmak ve güncel kalmak, güvenli bir web ortamı oluşturmak adına büyük bir adımdır.

Teşekkürler:

Web Security 0x09 | XSS Güvenlik Zafiyeti Serüvenine Devam Part 2

https://www.youtube.com/watch?v=xXbDhyKo9B8

https://portswigger.net/web-security/all-labs#cross-site-scripting


Subscribe to my newsletter

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir