• Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim
KodEdu
  • Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim

XSS açıklarına karşı Sanitize işlemi

  • Posted by Rahman Usta
  • Categories backend, Genel, Uncategorized, Yazılar, Yazılım
  • Date 20 Temmuz 2014

XSS , “Cross Site Scripting” ifadesinin kısaltılmış halidir. OWASP kuruluşunun 2013 yılında yayınladığı En Tehlikeli 10 Güvenlik Açığı listesinde XSS 3. sırada yer almaktadır.

XSS Tam olarak Nedir?

Web uygulamalarda kullanılan teknolojiler analize edildiğinde ağırlıklı olarak HTML, CSS ve JavaScript teknolojilerinden faydalanmaktayız. Bunun yanında bazı uygulamalarda, Adobe Flash, Java eklentileri gibi 3. parti ek teknolojiler de kullanılabilmektedir.

XSS kısaca, sizin web uygulamanıza ait olmayan koşturulabilir kod parçalarının, web uygulamanıza bir biçimde enjekte edilmesi demektir. Enjeksiyon işlemi ardından web uygulamanız büyük bir tehdit altına girer, kullanıcı bilgileri ve sisteminiz büyük bir tehdit altına girer.

XSS açıkları ağırlıklı olarak bir JavaScript kod parçasının sisteminize enjekte edilmesi ile başlar. Enjekte edilen kod parçası, uygulama içerisinde dinamik olarak başka kod parçalarını da uygulamanıza ekler. Eklenen kod parçaları, kullanıcının klavye hareketlerini, mouse haraketlerini, girdiği şifreleri elde edebilir. Hatta ve hatta tüm web sayfasını enjekte edilen kod ile kendi istediği bir web sayfası haline dönüştürebilir. Çünkü bir Web sayfasında JavaScript diliyle dinamik olarak yapamayacağınız hemen hemen hiçbirşey yok.

Fakat JavaScript ile o anki kullanıcının işletim sistemine tarayıcı ortamında erişemezsiniz. Tabi ki bu erişimi, web tarayıcıları kesmektedir. Aksinde Web uygulamaları ve kullanıcı sistemleri çok büyük bir tehdit altında olurdu.

Fakat Adobe Flash, Java Appletleri gibi tarayıcı geliştiricileri tarafından geliştirilmeyen 3. parti teknolojiler, mevcut tarayıcı üzerinden o anki mevcut işletim sistemlerine erişebilmektedir. Tabi ki bir erişim kurulmadan evvel bu teknolojiler kullanıcıdan erişim onayı almaktadır. Güvenilir bulduğunuz web uygulamalarında, bu erişimi hiç düşünmeden verebiliriz. Peki ya, güvenilir sandığımız web sayfası bir XSS zaafiyeti barındırıyorsa?

Bir Javacı olarak Java Appletlerinin masum olduğunu söyleyebilirim, masum olmayan ise XSS açıkları. JavaScript kod enjeksiyonu ile sisteminize 3. parti kod eklendiğinde, artık sistem sizin olmaktan çıkar. 3. parti kodlar Applet gibi bileşenleri dinamik olarak sayfanıza ekler ise, kötü niyetli şahsiyetler kullanıcıların işletim sistemleri üzerinde de daha önemli bilgileri elde edebilir, dosyalama sistemine zarar verebilir.

XSS açığı oluşturmanın çok çeşitli teknikleri olabilir. Fakat temel ölçekte XSS açıkları için, uygulamanıza bir JavaScript kodunun enjekte edilmesi gerekmektedir. Enjeksiyon edilen kod parçaları ise genelde 2 biçimlidir.

1) <script> xssBaslat(); </script> HTML elemanın web sayfasına enjekte edilmesi

2) HTML bileşenlerinin on-* ile başlayan attribute bileşenleri. Örneğin <div onload="xssBaslat()"></div>

Bu iki tip XSS açığı başlatabilecek kod parçasının Web uygulamasına enjekte edilmesi için ağırlıklı olarak Web sayfalarında bulunan HTML girdi alanları kullanılmaktadır. Bu alanlar ise ağırlıklı olarak <input> , <textarea> gibi HTML elemanlarıdır. Bu girdi elemanları içerisine XSS açığını başlatacak kod bloğu eklenebilirdir.

Kötü niyetli kullanıcılarınızın HTML form elemanları üzerinden sisteminize girdiği bilgiler, zaafiyeti önlemek açısından bir temizlik işlemine tabi tutulmalıdır. Bu temizlik işlemine ise, “Sanitize” işlemi denmektedir.

Sanitize işleminin en kolay biçimi ise, kullanıcıların girdiği verilerdeki < ve > işaretlerinin &lt; ve &gt; biçimine dönüştürülmesidir. Bu sayede örneğin;

<script> alert("Merhaba Dünya"); </script> ifadesi,

&lt;script&gt; alert("Merhaba Dünya"); &lt;/script&gt; olarak dönüştürüleceğinden bileşenin tehdit alanından kurtulmuş olunur.

Daha detaylı olarak uygulanacak sanitize işleminde ise, kullanıcıların girdiği verilerden, hangi HTML elemanına ve onun hangi özniteliğine izin verileceğini içeren kurallar uygulanmaktadır.

Örneğin bizim şöyle bir kuralımız olabilir.

İzin verilen eleman : "div"
  İzin verilen öznitelikleri : "style","class"
  İzin verilmeyen öznitelikler "onload","onsubmit","onchange, vb.

İzin verilmeyen elemanlar : "script", "iframe"

Bu kuralların oluşturulması gerçekten detaylı bir inceleme sürecini birlikte getirmektedir. Fakat daha evvelden hazırlanmış güvenilir Sanitize kurallarını da kullanabilirsiniz.

Sanitize işlemi için ben OWASP Antisamy projesini önermekteyim. Antisamy ile daha önceden tanımlı bir kural ağacına göre, istenilen girdi verisini XSS’e karşı temiz hale getirebilirsiniz.

Antisamy Kullanmak

Antisamy kullanmak oldukça kolaydır.

Öncelik olarak antisamy bağımlılığını uygulamanıza eklemeniz gerekmektedir.

<dependency>
	<groupId>org.owasp.antisamy</groupId>
	<artifactId>antisamy</artifactId>
	<version>1.5.3</version>
</dependency>

Ardından aşağıdaki gibi kullanabilirsiniz.

String input = "<script> alert('Merhaba Dünya..'); </script>"+
    "<b>Merhaba Uranüs</b>"+
    "<div onload="alert('Merhaba Neptün..')">Merhaba Platon</div>";

Policy policy = Policy // Sanitize kuralı
	.getInstance(new File("E:\antisamy-slashdot-1.4.4.xml"));

AntiSamy sanitizer = new AntiSamy(policy);

CleanResults scanned = sanitizer.scan(input);

int errors = scanned.getNumberOfErrors(); // Kural ihlali sayısı
List<String> errorMsg = scanned.getErrorMessages(); // İhlal nedenleri

String sanitized = scanned.getCleanHTML(); // Temizlenmiş çıktı

Antisamy ile temizleme işlemi için Antisamy nesneleri kullanılmaktadır. Sanitize kuralı için ise, Policy isimilli nesneler kullanılmaktadır. Antisamy ile ayrıca ihlal sayısı ve ihlal mesajlarını da elde edebilmektesiniz. Ayrıca tanımlı kurallarınıza göre temizlenmiş çıktıyı da elde edebilmektesiniz. Antisamy için hazırlanmış Sanitize kurallarına https://code.google.com/p/owaspantisamy/downloads/list adresinden erişebilirsiniz.

Uygulama çalıştırıldığında aşağıdaki gibi bir çıktının elde edildiği görülür.

Temiz çıktı: <b>Merhaba Uranüs</b><div>Merhaba Platon</div>

İhlal sayısı: 2

İhlal nedenleri:

The script tag is not allowed for security reasons. This tag should not affect the display of the input.
The div tag contained an attribute that we could not process. The onload attribute has been filtered out, but the tag is still in place. The value of the attribute was "alert&#40;&#39;Merhaba Neptün&#46;&#46;&#39;&#41;".

Antisamy ile çalışan örnek uygulamaya aşağıdaki bağlantıdan erişebilirsiniz.

Antisamy Uygulaması

Tekrar görüşmek dileğiyle

  • Share:
author avatar
Rahman Usta

Kodedu.com bünyesinde eğitim ve danışmanlık faaliyetleri sürdüren Rahman Usta, 2012 yılında yayına çıkan popülerJava Mimarisiyle Kurumsal Çözümler ve 2014 yılında yayınlanan Java 8 Ebook kitaplarının yazarıdır. Açık kaynak dünyasına katkı veren yazar, geliştirdiği AsciidocFX projesiyle Duke's Choice Award 2015 ödülünü kazanmıştır. Rahman ayrıca, Istanbul JUG'un ve Java standartlarını geliştiren JCP (Java Community Process)'in bir üyesidir. 2018 yılında Java Şampiyonu olarak seçilmiştir.

Previous post

Maven Plugin Nasıl Geliştirilir?
20 Temmuz 2014

Next post

JVM: JIT ve Interpretation Modlarının Performans Karşılaştırması
7 Ağustos 2014

You may also like

api-logo
Swagger Nedir? Neden kullanılır?
10 Ekim, 2018
spring-cli-logo
Spring CLI ile Spring Boot Projeleri Hazırlamak
21 Ağustos, 2017
eureka_architecture
Spring Cloud Netflix ve Eureka Service Discovery
3 Temmuz, 2017

    1 Comment

  1. Erhan Çetin
    9 Ekim 2018
    Cevapla

    Güzel yazın için teşekkürler.

Leave A Reply Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta listesine kayıt olun!






Gözde yazılar

Knockout.js – Hesap Makinesi Örneği
02Şub2013
Handlebars Template Çözümü
06Şub2014
PlusClouds ile Röportaj
13Tem2012
Kritik Dosyalarınızı Git Reponuzdan Temizleyin
10Tem2014

Son Yazılar

  • Java’da Record’lar 27 Ocak 2020
  • Swagger Nedir? Neden kullanılır? 10 Ekim 2018
  • Spring CLI ile Spring Boot Projeleri Hazırlamak 21 Ağustos 2017
  • Spring Cloud Netflix ve Eureka Service Discovery 3 Temmuz 2017
  • Online React.js Eğitimi ardından (15-25 Mayıs 2017) 31 Mayıs 2017

Son Yorumlar

  • YAML Nedir? Neden YAML Kullanmalıyız? için shahriyar
  • Java Persistence API Nedir? (Giriş) için Utku
  • Java 8 – CompletableFuture ile Asenkron Programlama için Rahman Usta
  • Java 8 – CompletableFuture ile Asenkron Programlama için burak
  • Arm7 Nxp 2104 işlemci ile basit bir Uygulama için Mustafa Dinc

Get Java Software

Arşivler

Bizi takip edin

React.js Eğitimi Başlıyor
11-22 Eylül, 2017
Eğitmen
Rahman Usta
İletişim

merhaba@kodedu.com

  • Hakkında
  • Gizlilik Politikası
  • İletişim
  • Referanslar
Kodedu Bilişim Danışmanlık
Cemil Meriç mah. Çelebi sok.
No:16/3 Ümraniye/İSTANBUL
Tel: 0850 885 38 65
Alemdağ V.D.: 8960484815

KODEDU © Tüm hakları saklıdır.