DVWA Cross Site Request Forgery (Medium Level) | |||||||||||
Merhaba, bu yazıda dvwa web uygulamasında güvenlik medium 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 Medium Güvenlik Seviyesinde ÖnlemÖnceki derste eski web tarayıcılarda ve modern web tarayıcılarda csrf saldırıları düzenlemiştik ve kullanıcıya istemeden bir aksiyon aldırtmıştık. O saldırıda dvwa uygulaması hiçbir csrf önlemine sahip değildi. DVWA'nın güvenlik önlemi alınmamış csrf zafiyetli hali şu şekildeydi:Cross Site Request Forgery (Low level): <?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 = 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(); } ?> Görüldüğü gibi kullanıcıdan parola ile parola onay girdisi alınıyor ve hiçbir kısıt olmadan (sql enjeksiyona karşı bir kısıt var ama konumuz o değil) işleme sokuluyor. Medium seviyede nasıl bir önlem alınmış ona göz atalım: Cross Site Request Forgery (Medium Level): <?php if( isset( $_GET[ 'Change' ] ) ) { // Checks to see where the request came from if( eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ) { // 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>"; } } else { // Didn't come from a trusted source echo "<pre>That request didn't look correct.</pre>"; } mysql_close(); } ?> Kaynak koda 5nci satırda bir güvenlik önlemi satırı dahil edilmiştir 5nci satıra göre server name değeri referrer değeri ile aynıysa o zaman kullanıcının gönderdiği parola ile parola onay girdilerini al ve işleme sok denmiştir. Peki server name ve referrer nedir? Server name korumaya çalıştığımız web uygulama sunucusunun domain adını değer olarak döndürür. Referrer ise bir http istek başlığıdır ve korumaya çalıştığımız web uygulamaya kullanıcılar farklı web uygulamalardan geldiklerinde veya yine korumaya çalıştığımız web uygulamanın fark web sayfalarından geldiklerinde nereden geldikleri bilgisini (url'sini) tutar. Örneğin X url'li web uygulamasından Y url'li web uygulamasına linkle gittiğimizde isteğimize Referrer başlığı eklenir ve Y web uygulamasına X web uygulamasının linkini göndeririz. Böylece Y web uygulaması kendisine nereden gelindiğini görebilir. CSRF saldırısını low level'da bildiğiniz üzere ayrı web uygulamalardan siteler arası isteklerle zafiyetli web uygulama dvwa üzerinde yapmıştık. Şimdi bunu yapamayız. Çünkü farklı web uygulamadan dvwa'ya istek yaparsak server name dvwa'yı gösterecek, referrer ise farklı web uygulamayı gösterecek ve birbirleriyle aynı olmadıklarından form submit işlemi gerçekleşmeyecek. DVWA Cross Site Request Forgery Medium Güvenlik Seviyesini AtlatmaBu 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 şarttır. XSS sonraki derslerin konusu ama burada yeri gelmişken kısaca değinelim. 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.Medium seviyede olduğu gibi bir web uygulamaya Server Name ile Referrer başlık değeri aynı olması şartı konulursa dışarıdan csrf saldırıları ilgili csrf açıklıklı web uygulamaya düzenlemez hale gelir. Fakat buraya dikkat: CSRF açıklıklı web uygulamanın içerisinden XSS saldırıları ile csrf saldırıları yine aynı csrf açıklıklı web uygulamaya düzenlenebilir. Çünkü sitenin kendi içinden kendisine saldırı yaptığımızda server name ile referrer aynı olacaktır. Böylece csrf önlemi atlatılmış olacaktır.
[!] Uyarı:
Aklınıza şöyle bir bypass tekniği gelmiş olabilir. Farklı bir web uygulamada csrf zafiyetli web uygulamaya AJAX isteği yapan kodu girerim, referrer başlık bilgisini de manipule ederim. Bu teorik olarak güzel fikir. Böylece farklı web sitelerden hedef web siteye yine csrf düzenlenebilir. Fakat mümkün gibi görünse de web tarayıcı geliştiricileri bu durumun farkında olduklarından bunu web tarayıcılarında politika olarak yasaklamışlardır. Yani referrer spoofing yapılması javascript ile denendiğinde başarılı olmayacaktır. Politikaya takılacaktır. Şimdi medium güvenlik seviyesini atlatalım ve csrf saldırısı düzenleyerek kurbanın csrf zafiyetli dvwa web uygulamadaki parolasını fark etmeden değiştirelim. Gereksinimler
1. DVWA low güvenlik seviyesine çekilir. Çünkü XSS saldırısı düzenleyeceğiz ve web uygulamanın ful xss zafiyetine sahip olduğunu varsayıyoruz. ![]() 2. Saldırgan Kali Linux VM'de DVWA Stored XSS sayfasında gider ve xss payload'u enjekte eder. Birinci Metin Kutusu: Merhaba Textarea Kutusu: <img width="1" height="1" src="/dvwa/vulnerabilities/csrf/?password_new=saat&password_conf=saat&Change=Change#"/> ![]() Payload'da saldırgan parola ve parola onay parametrelerine "saat" değerini girmiştir. Böylece csrf saldırısını yaşayan herkesin parolası "saat" olacaktır. Not: Textarea istemci taraflı karakter limitine sahip olduğundan payload sığmayacaktır. Sığabilmesi için web tarayıcıda textarea'ya sağ tık yapıp öğeyi denetle diyerek açılan geliştirici araçları bölümünden maxlength="50" ifadesi silinmelidir. ![]() 3. CSRF açıklıklı olan ama aynı zamanda Parola değiştirme sayfası olan sayfaya gidelim. http://192.168.56.136/dvwa/vulnerabilities/csrf/ Ve parolayı default'a çekelim. password password [OK] ![]() DVWA'da ortak tek hesap olduğundan saldırgan xss saldırısını yapar yapmaz csrf saldırısı tetiklenecektir ve ortak hesabın parolasını değiştirmiş olacaktır. Bu nedenle csrf saldırısını kurban gözünden daha iyi gözlemlemek adına saldırgan olarak parolamızı yine password yaparak eski haline döndürelim. 4. Kurban Windows 10 Host işletim sisteminde Edge web tarayıcıda DVWA'ya login olsun. ![]() 5. Kurban ardından DVWA güvenlik seviyesini Medium'a çeksin. ![]() Bunu yapıyoruz, çünkü DVWA geliştiricisinin csrf hassas bölgesini medium seviye güvenlik ile koruduğunu varsayıyoruz. 6. Kurban ardından hedef web uygulamada xss payload'unun yer aldığı web sayfasını ziyaret etmiş olsun. http://192.168.56.136/dvwa/vulnerabilities/xss_s/ ![]() ![]() Böylece yüksek güvenlik seviyesinde CSRF saldırısı yine de gerçekleşecektir ve kurbanın parola değişecektir. 7. Kurban logout olduğunda tekrar login denemesinde eski parolası ile giriş yapamayacaktır, çünkü csrf saldırısı yaşamıştır ve parolası değişmiştir. ![]() ![]() Bu şekilde xss saldırısının düzenlendiği web sayfasını görüntüleyen her kurbanın parolası saldırganın bildiği sabit bir parola ile değiştirilir. 8. Son olarak xss payload'da parola ve parola onay parametrelerine "saat" girmiştik ve parolanın "saat" olmasını csrf ile sağlamıştık. "saat" ile giriş deneyelim. Gerçekten de saldırgan olarak bizim belirlediğimiz şifre olmuş diye kontrol edelim. ![]() ![]() Görüldüğü gibi "saat" parolası ile giriş yapılabilmiştir. Yararlanılan Kaynaklar:
|
|||||||||||
![]() |
|||||||||||
|
|||||||||||
Yorumlar |
|||||||||||
Henüz yorum girilmemiştir. | |||||||||||
Yorum Ekle | |||||||||||