XSS Açığı, genellikle güvenilir bir web sitesi bağlamında, istemci tarafı betiklerinin (genellikle JavaScript) web sayfasına enjekte edilmesiyle gerçekleşen bir tür enjeksiyon saldırısıdır. Temel prensip, saldırganın kötü niyetli betik kodunu, hedeflenen web uygulamasının güvenlik mekanizmalarını atlatarak meşru içeriğin bir parçasıymış gibi göstermesidir. Kullanıcı bu sayfayı ziyaret ettiğinde, tarayıcı enjekte edilen betiği çalıştırır. Bu betikler, kullanıcının tarayıcısında çalıştırıldığı için, kullanıcının o siteyle olan oturum çerezlerine, kimlik doğrulama bilgilerine ve diğer hassas verilerine erişebilir.

XSS Açığı Nedir?
Web uygulamalarının güvenlik açıkları arasında en yaygın ve tehlikeli olanlardan biri olan Siteler Arası Betik Çalıştırma (Cross-Site Scripting – XSS) açığı, kötü niyetli saldırganların kullanıcıların tarayıcılarında kötü amaçlı betikler çalıştırmasına olanak tanır. Bu tür bir saldırı, web uygulamalarının kullanıcı girdilerini yeterince doğrulamaması veya kodlamaması durumunda ortaya çıkar. Bir XSS açığı, basit bir web sitesi yorum alanından karmaşık bir arama motoruna kadar her türlü etkileşimli platformda bulunabilir ve potansiyel olarak ciddi güvenlik ihlallerine yol açabilir. Bu makalede, XSS açığının ne olduğunu, farklı türlerini, nasıl çalıştığını, potansiyel sonuçlarını ve bu tür saldırılardan nasıl korunulacağını detaylı bir şekilde inceleyeceğiz.
Bir XSS saldırısı genellikle aşağıdaki adımları içerir:
<script>alert('XSS Saldırısı!')</script> veya daha karmaşık betikler) bu giriş alanına enjekte eder.XSS saldırıları, betik kodunun web uygulamasına nasıl enjekte edildiğine ve depolandığına bağlı olarak üç ana kategoriye ayrılır:
Depolanmış XSS, aynı zamanda kalıcı XSS olarak da bilinir, en tehlikeli XSS türlerinden biridir. Bu senaryoda, kötü amaçlı betik, web sunucusu üzerinde kalıcı olarak depolanır (örneğin, bir veritabanında, dosya sisteminde veya forum gönderilerinde, yorumlarda). Bir saldırgan, bu betiği bir form aracılığıyla web uygulamasına gönderdiğinde, uygulama bu betiği saklar. Daha sonra, diğer kullanıcılar bu betiğin saklandığı sayfayı her ziyaret ettiklerinde, betik otomatik olarak tarayıcılarında çalışır. Bu tür bir saldırı, çok sayıda kullanıcıyı etkileyebilir ve uzun süreli zararlara yol açabilir.
Yansıtılmış XSS, kalıcı olmayan veya depolanmayan XSS olarak da adlandırılır. Bu tür bir saldırıda, kötü amaçlı betik, web sunucusunda depolanmaz. Bunun yerine, betik doğrudan kullanıcının isteğinden alınır ve hiçbir doğrulama veya kodlama yapılmadan hemen tarayıcıya yansıtılır. Örneğin, bir saldırgan, kötü amaçlı betiği içeren özel olarak hazırlanmış bir URL oluşturur ve bu URL’yi bir e-posta veya mesaj yoluyla kurbanına gönderir. Kurban bu bağlantıya tıkladığında, betik doğrudan tarayıcısında çalışır. Yansıtılmış XSS’nin gerçekleşmesi için saldırganın kurbanı bir şekilde ikna etmesi gerekir.
DOM tabanlı XSS, yansıtılmış XSS’ye benzer ancak betiğin işlenmesi ve yürütülmesi sunucu tarafında değil, istemci tarafında, yani kullanıcının tarayıcısında gerçekleşir. Belge Nesne Modeli (Document Object Model – DOM) üzerinde manipülasyonlar yaparak tetiklenir. Bu senaryoda, kötü amaçlı betik doğrudan sunucuya gönderilmez veya sunucudan yansıtılmaz. Bunun yerine, tarayıcıda çalışan JavaScript kodu, URL parçasından veya diğer istemci tarafı verilerinden alınan kötü amaçlı verileri, DOM’a güvensiz bir şekilde yazar. Bu, tarayıcının kötü amaçlı kodu çalıştırmasına neden olur. Örneğin, bir web sayfası JavaScript kullanarak URL’deki bir parametreyi alır ve içeriği doğrudan sayfaya eklerse, DOM tabanlı XSS meydana gelebilir.
Bir XSS saldırısı başarılı olduğunda, saldırganlar çeşitli kötü niyetli eylemler gerçekleştirebilir. Bu eylemlerin kapsamı, enjekte edilen betiğin yeteneklerine ve web uygulamasının güvenlik bağlamına bağlıdır. En yaygın potansiyel sonuçlar şunlardır:
XSS saldırılarından korunmak, web uygulaması geliştirme sürecinin her aşamasında güvenlik odaklı yaklaşımları benimsemeyi gerektirir. İşte XSS açıklarını önlemek için uygulanabilecek başlıca yöntemler:
Kullanıcılardan gelen tüm girdiler, sunucu tarafında kapsamlı bir şekilde doğrulanmalıdır. Bu, yalnızca beklenen veri türlerini, formatlarını ve uzunluklarını kabul etmek anlamına gelir. Örneğin, bir e-posta alanına betik kodu girilmeye çalışılırsa, bu giriş reddedilmelidir. Regex (düzenli ifadeler) ve beyaz liste tabanlı doğrulamalar, güvenli giriş doğrulama için etkili yöntemlerdir.
Kullanıcı tarafından sağlanan veriler bir HTML sayfasına yazdırılmadan önce her zaman uygun şekilde kodlanmalıdır. Bu, özel karakterlerin (örneğin, <, >, &, ", ') HTML varlıklarına dönüştürülmesi anlamına gelir (örneğin, < yerine <). Bu işlem, tarayıcının enjekte edilen betik kodunu HTML olarak değil, sadece metin olarak yorumlamasını sağlar. Her bağlam için (HTML, HTML özniteliği, JavaScript, URL, CSS) farklı kodlama mekanizmaları mevcuttur ve doğru kodlama bağlamın güvenliği için kritik öneme sahiptir.
CSP, modern tarayıcılar tarafından desteklenen bir güvenlik mekanizmasıdır. Web sunucusundan gönderilen bir HTTP başlığı aracılığıyla, tarayıcının hangi kaynaklardan betik, stil, görüntü ve diğer içerikleri yükleyebileceğini belirler. Bu, XSS saldırılarıyla enjekte edilen kötü amaçlı betiklerin çalışmasını engelleyebilir veya en azından sınırlandırabilir, çünkü betik politikada izin verilmeyen bir kaynaktan yüklenecektir.
Hassas çerezler için HTTPOnly bayrağının kullanılması, istemci tarafı betiklerinin bu çerezlere JavaScript aracılığıyla erişmesini engeller. Bu, bir XSS saldırısı başarılı olsa bile, saldırganın oturum çerezlerini doğrudan çalamayacağı anlamına gelir. Ayrıca, çerezlerin yalnızca şifreli (HTTPS) bağlantılar üzerinden gönderilmesini sağlamak için Secure bayrağı kullanılmalıdır.
WAF’lar, web uygulamalarına gelen ve giden trafiği analiz ederek bilinen saldırı kalıplarını (XSS gibi) algılayabilir ve engelleyebilir. Bir WAF, uygulamanın önünde bir güvenlik katmanı oluşturur ve potansiyel olarak kötü amaçlı isteklerin uygulamaya ulaşmasını durdurabilir.
Güvenli bir SDLC benimsemek, güvenlik açıklarının geliştirme sürecinin başlarında tespit edilmesine ve düzeltilmesine yardımcı olur. Bu, güvenlik gereksinimlerinin belirlenmesinden başlayarak, güvenli kodlama uygulamaları, güvenlik testleri (statik ve dinamik analiz) ve güvenlik denetimlerini içerir.
Geliştiricilerin XSS açıklarını önlemede proaktif olmaları gerekir:

XSS açıkları, web uygulamalarının en eski ve en inatçı güvenlik sorunlarından biridir. Ancak, yukarıda belirtilen önleme yöntemlerinin titizlikle uygulanması, bu tür saldırıların riskini önemli ölçüde azaltabilir. Web güvenliği, sürekli bir çaba ve dikkat gerektiren dinamik bir alandır. Geliştiricilerin ve sistem yöneticilerinin, güncel güvenlik tehditleri ve en iyi uygulamalar hakkında bilgi sahibi olmaları kritik öneme sahiptir. Bu konularda daha fazla bilgi edinmek için siber güvenlik kategorimizi ziyaret edebilir veya Wikipedia’dan XSS hakkında ek bilgilere ulaşabilirsiniz.