26 Ağustos 2008 Salı

Filtering JavaScript to Prevent Cross-Site Scripting

Yaptığım bir sitenin cross-site-scripting (XSS) saldırılarına açık olduğunu farkettim. XSS açığında, eğer saldırgan HTML kodlarının arasına istemci tabanlı kod gömerse, kullanıcının tarayıcısında istediği istemci tabanlı kodu çalıştırabiliyor.

Mesela aşağıdaki şekildeki request'e göre işlem yapan bir site düşünelim:
http://www.benimsitem.com/haber.html?id=156
Açık bulunanan site name değişkenini okuyup hiçbir filtreleme yapmadan sayfaya yazdırıyorsa, o zaman bu değerde istenilen kod çalıştırılabilir.
http://www.benimsitem.com/haber.html?id=<script>alert(document.cookie)</script>
Genelde cross site scripting açıkları, saldırganın sistemi deneme-yanılma yaparak bulması ile ortaya çıkıyor. Açığın bulunması ile saldırgan, başka bir domainden, açığın bulunduğu domain ve sayfanın bilgilerini, session bilgilerini ve diğer obje değerlerini çalmasına olanak sağlar. (1)

Peki bu açığı nasıl kapatabiliriz? Web Programlama yapan biri olarak kullanıcıdan gelen hiçbir girdiye güvenmemelisiniz ve gelen her request'i server tarafında filtrelemelisiniz. Eğer request'ten gelen parametrede özel karakterler varsa ( SCRIPT tag'i gibi ), bunları reddetmeli veya özel bir metodla bu özel karakterleri değiştirmelisiniz. Mesela ben bunun için şöyle bir java metodu yazdım:



public static String filterForSpecialCharacters( String inputStr ){

String outputStr = inputStr + "";

outputStr = outputStr.replace ( "'", " " );
outputStr = outputStr.replace ( "\"", " " );
outputStr = outputStr.replace ( "%", " " );
outputStr = outputStr.replace ( ";", " " );
outputStr = outputStr.replace ( "(", " " );
outputStr = outputStr.replace ( ")", " " );
outputStr = outputStr.replace ( "&", " " );
outputStr = outputStr.replace ( "+", " " );
outputStr = outputStr.replace ( "<", " " );
outputStr = outputStr.replace ( ">", " " );

return outputStr;

}

Gördüğünüz gibi, kullanıcıdan gelen input'u kullanmadan önce bu metoda gönderirseniz. Özel karakterler filtrelenerek, size güven içinde kullanabileceğiniz değişkeni geri döndürür.

Bu XSS açığı için PHP, ASP gibi dillerde kullanılabilecek belirli kütüphaneler var ama java'da ne yazık ki böyle standart bir kütüphane yok. Ancak aşağıdaki adreste XSS ataklarına karşı yazılmış bir kütüphane Java class'ı var: BAKINIZ




Cross-site scripting hakkında ayrıntılı bilgi edinmek isteyenlere aşağıdaki bilgileri derledim. Umarım faydalı olur.

1- Introduction

Cross-Site Scripting is one of the main problems of any Web-based service. Since Web browsers support the execution of commands embedded in Web pages to enable dynamic Web pages attackers can make use of this feature to enforce the execution of malicious code in a user’s Web browser. JavaScript is the most commonly used command language in this context. If misused, stealing of authentication information may be possible thus allowing attackers to act under a stolen identity. The attack is based on the possibility to insert malicious JavaScript code into pages shown to other users. Therefore filtering malicious JavaScript code is necessary for any Web application. This paper describes the overall problem and elaborates on the possibilities to filter JavaScript in Web applications. Also a filtering architecture is presented that allows Web application developers to filter JavaScript depending on the application need to reduce the danger of successful Cross-Site Scripting attacks. (1)

2 - Avoiding an Attack

2.1 - Filtering

The basis of this approach is never trust user input and always filter metacharacters ("special" characters) that are defined in the HTML specification. Each input field, including link parameters will be validated for script tags. When found and dependent on the context, the input will be rejected and thus prevent the malicious HTML from being presented to the user. (3)

2.2-) Encoding

Cross-site scripting attacks can be avoided when a Web server adequately ensures that generated pages are properly encoded to prevent unintended execution of scripts. Each character in the ISO-8859-1 specification can be encoded using its numeric entry value. Server side encoding is a process where all dynamic content will go through an encoding function where scripting tags will be replaced with codes in the chosen character set. Generally speaking, encoding is recommended because it does not require you to make a decision about what characters could legitimately be entered and need to be passed through. Unfortunately, encoding all untrusted data can be resource intensive and may have a performance impact on some Web servers.


For More Information:

http://www.ibm.com/developerworks/tivoli/library/s-csscript/
http://www.developer.com/java/article.php/883381






Citation
-----------
(1) http://tr.wikipedia.org/wiki/Cross_site_scripting
(2) Filtering JavaScript to Prevent Cross-Site Scripting - Created by:
EUROSEC GmbH Chiffriertechnik & Sicherheit
(3) http://www.ibm.com/developerworks/tivoli/library/s-csscript/




Hiç yorum yok: