XSS açıklarına karşı Sanitize işlemi
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 < ve > biçimine dönüştürülmesidir. Bu sayede örneğin;
<script> alert("Merhaba Dünya"); </script>
ifadesi,
<script> alert("Merhaba Dünya"); </script>
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('Merhaba Neptün..')".
Antisamy ile çalışan örnek uygulamaya aşağıdaki bağlantıdan erişebilirsiniz.
Tekrar görüşmek dileğiyle
1 Comment
Güzel yazın için teşekkürler.