Ders 20 - Reflected XSS (Medium Level)
Bu yazıda güvenlik düzeyi Medium seviyesine yükseltilmiş DVWA'da Reflected XSS'e karşı ne gibi bir güvenlik önlemi alındığı incelenecektir ve alınan güvenlik önlemine rağmen yine Reflected XSS saldırısı düzenlenebilir mi sorusuna yanıt aranacaktır.

Dersin Hedefi

Hedefiniz Medium seviyesindeki güvenliği keşfedip nasıl aşabileceğinizi öğrenmektir.

Reflected XSS'e Karşı Önlem

Geçen ders nasıl Reflected XSS saldırısı yapılırı hem teorik hem de pratik olarak görmüştük. O derste bizim Reflected XSS saldırısı düzenleyebilmemizin nedeni aşağıdaki kaynak kodun kullanımından dolayıydı:

Low Level:
<?php 

// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user 
    echo '
Hello ' . $_GET[ 'name' ] . '
'; } ?>


6. satırda görülebileceği üzere kullanıcıdan gelen input'u temsil eden $_GET['name'] ifadesi hiçbir denetlemeye tabi tutulmadan ekrana yansıtılmaktadır. Bu yüzden biz input için javascript kodu girdiğimizde bu kodlar sayfaya yansıyabildi ve tarayıcı kodları çalıştırıp ekrana popup penceresi getirebildi. Bu sıkıntıyı gidermek üzere aşağıda Medium Level'ın sunduğu güvenlik önlemini görmektesiniz.

Medium Level:
<?php 

// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input 
    $name = str_replace( '<script>', '', $_GET[ 'name' ] ); 

    // Feedback for end user 
    echo "
Hello ${name}
"; } ?>


6. satırda görülebileceği üzere kullanıcıdan gelen input'u temsil eden $_GET['name'] değişkeni eğer <script> kelimesini içeriyorsa str_replace() fonksiyonu ile bu kelimeden ayıklanmaktadır. Böylece input olarak script kodu girildiğinde <script> tag'ı silinerek ekrana yansıtılacağından script kodu çalışmayacaktır ve güvenlik belli ölçüde sağlanmış olacaktır.

Peki bu güvenlik önlemi aşılabilir mi? Yani <script> tag'ı input'tan silinmesine rağmen Javascript kodlarını çalıştırabilmenin bir yolu var mı? Öncelikle şu konuda hemfikir olmamız gerekir. Javascript kodları <script> tag'sız ça-lı-şa-maz. Dolayısıyla bu saldırgan için vazgeçilmezdir. Peki site güvenlik gereği kullanıcıdan gelen input'tu <script> tag'ını silerek yansıttığına göre bu durumda ne yapılabilir? Yapılacak işlem <script> tag'ının içerisine <script> tag'ı koymaktır. Eğer geçmiş dersleri takip ettiyseniz ne demek istediğimi fark etmişsinizdir. Eğer takip etmediyseniz anlamınızı kolaylaştırmak adına olayı örneklerle açıklayalım. Normalde DVWA'nın metin kutusuna aşağıdaki kod girildiğinde

Input:
<script>alert('Sayfa XSS açığına sahip!');</script>

güvenlik gereği <script> tag'ı silinerek ekrana yansıtılacaktır.

Çıktı:
alert('Sayfa XSS açığına sahip!');</script>

Eğer <script> tag'ının içerisine <script> tag'ı konulursa

Input:
<scr<script>ipt>alert('Sayfa XSS açığına sahip!');</script>

kırmızı renkli <script> kelimesi silinecektir ve geride arta kalanlar birleştiğinde yine <script> kelimesini oluşacaktır. Böylece güvenlik barikatı aşılmış ve <script> tag'ı sisteme sokulmuş olacaktır.

Çıktı:
<script>alert('Sayfa XSS açığına sahip!');</script>



Sonuç

İç içe kelime kullanımı ile str_replace() fonksiyonu atlatılabilmiştir. Çünkü str_replace() fonksiyonu yaptığı tarama ve silme işlemini recursive olarak yapmamaktadır. Bu ifadeyi biraz açıcak olursak str_replace() fonksiyonu <script> tag'ını gördüğünde silmektedir, fakat bunun akabinde tarama işlemine "kaldığı yerden" devam etmektedir. Yani başa sarmamaktadır. Tekrar başa gelip taramasına o şekilde devam etmediği için, kaldığı yerden devam ettiği için arta kalan karakterler birleştiğinde oluşan yeni <script> tag'ını str_replace() fonksiyonu göremeyecektir. Böylelikle güvenlik aşılmış olacaktır. Güvenlik seviyesi Medium iken belli ölçüde güvenlik sağlandı gibi görünse de tekniği bilen için bu güvenlik önlemi hiçbir zorlayıcılığa sahip değildir.
Bu yazı 22.01.2016 tarihinde, saat 07:46:14'de yazılmıştır. 22.01.2016 tarihi ve 08:25:31 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 3065
Yorumlar
Henüz yorum girilmemiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :