Dev.to Security 🔐 Cybersecurity 👁 0 📖 4 min read

Blind SQL Injection (Oracle): Intruder ile Administrator Şifresini Karakter Karakter Çıkarmak

HTTP cevabında sorgumuz sebebiyle oluşan herhangi bir farklılık yoksa ve uygulama SQL Injection'a karşı savunmasızsa Blind SQL Injection kullanabiliriz. Bu yazı, Burp Suite ve Intruder kullanılarak Cookie tarafında Trac

HTTP cevabında sorgumuz sebebiyle oluşan herhangi bir farklılık yoksa ve uygulama SQL Injection'a karşı savunmasızsa Blind SQL Injection kullanabiliriz.

Bu yazı, Burp Suite ve Intruder kullanılarak Cookie tarafında TrackingId sorgulamasından faydalanarak administrator şifresini veritabanından nasıl karakter karakter tespit edip şifreyi bulabileceğimizi ve bu süreçte karşılaştığım zorlukları anlatıyor.

Lab Tanıtımı

  • Lab Adı: Blind SQL injection with conditional errors
  • Zorluk: Practitioner
  • Senaryo: Cookie:TrackingId içine payload enjekte ederek karakter karakter administrator hesabının şifresini ele geçirme.
  • Hedef: Sisteme administrator hesabı ile giriş yapma.

Blind SQLI Nedir?

Eğer SQL Injection payload'ımıza rağmen uygulamanın web sayfası kısmında gözle görülebilen bir değişiklik yoksa uygulamayı veritabanı kısmında şartlı koşullarla hata vermeye zorlayarak yine veri elde edebiliriz. Buna Blind SQL Injection denir. UNION attack'tan temel farkı budur.

İlk Yaklaşım

İlk olarak koşul durumu tetiklenerek uygulamanın nasıl yanıt vereceğini ölçmemiz gerekir.

Veritabanı sorgusunda AND durumunu ve SELECT CASE WHEN(condition) THEN 1/0 ELSE 'a' END yapısını kullanacağız. Fakat burada veri tabanımız Oracle olduğu için uygun sorgu syntax'ini kullanmamız gerek.
bkz.SQLI Cheat Sheet

gc2' AND (SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) = 'a'-- 

Yukarıda koşul doğru olursa uygulama divide by zero hatası verecek ve HTTP Status olarak 500 dönecek. Koşulun yanlış olması durumunda ise a=a olacağından sayfamız 200 dönecek. Bu aşamada uygulama nasıl tepki veriyor onu görmüş olduk.

Nihai Payload ve Oracle'a Özgü Tuzaklar

Birazdan şifreyi belirlemek için SUBSTRING kullanacağız fakat Oracle'da bu ifade SUBSTR olarak geçiyor. Ayrıca FROM kullanımı zorunlu ve alt sorgu tek satır döndürmesi gerekiyor.

Nihai payload'ımız bu şekilde gözükecek:

gc2' AND (SELECT CASE WHEN (SUBSTR(password,1,1) = 'm') THEN TO_CHAR(1/0) ELSE 'a' END FROM users WHERE username = 'administrator') = 'a'-- 

Burada FROM users diyerek users tablosunda, WHERE username = 'administrator' diyerek kullanıcı adı administrator olan satırın, SUBSTR(password,1,1) diyerek password değişkeninin 1. karakterinden başlayarak, 1. sıradaki karakteri =, > veya < operatörleri ile bulmaya çalışıyoruz. 2. karakteri bulmak isteseydik şu şekilde olacaktı: SUBSTR(password,2,1).

AND koşulunun çalışma mantığı şu şekildedir:

  • 1 AND 1 = 1,
  • 1 AND 0 = 0,

Önce < ve > operatörleri ile aralığı daraltabiliriz ve daha sonra = operatörleri ile karakteri bulabiliriz. Burada dikkat etmemiz ve benim de ilk başta kafamı karıştıran kısım Karakteri bulduğumuzda sayfa 500 yanıtı ile dönüyor.

Elle Karakter Bulmanın Sınırları

Bu lab uygulamasında şifre 20 karakter olarak rastgele oluşuyor. Bunun gibi örneklerde tek tek bulmak uzunluğuna bağlı olarak saatlere kadar çıkabilir (Ki bu uygulamada sadece küçük harfler ile 0-9 arası rakamlar kullanılmasına rağmen tek tek bulmak 30-45 dakika sürüyor). İşte bu noktada işleri biraz da olsa kolaylaştıran Intruder devreye giriyor.

Intruder ile Otomatikleştirme

Repeater'a gönderdiğimiz requesti buradan da Intruder'a göndermemiz gerek. Bunu CTRL+i ile (ya da tümünü seçip send to Intruder ile de) yapabiliriz.

Karşımıza gelen ekranda SUBSTR(password,1,1) = 'm' ifadesindeki m değerini mouse yardımı ile seçerek Add butonuna basmalıyız. Bu kısım bizim payloadımız. Bu işlemi yaptıktan sonra ekranın sağ tarafında Payloads sekmesi kullanılabilir hale gelecek. Eğer sizde tüm request kısmı seçili (mavi) olarak gözüküyorsa Positions kısmında Clear butonuna basarak tekrardan seçmeniz gerekir. Payload configuration kısmına karakterleri ekleyeceğiz. Bunu tek tek yazıp Add butonuna basarak da yapabiliriz ya da bir not defterine hepsini yazıp kopyalayıp burada Paste butonuna basarak da yapıştırabiliriz.

Tüm bu işlemleri yaptıktan sonra artık saldırıyı başlatabiliriz. Fakat Intruder kısmında bir karakteri bulduktan sonra SUBSTR ifadesinde bulmak istediğimiz karakterin indeksini tekrar değiştirmeliyiz.

Start attack butonuna bastıktan sonra tüm karakterler otomatik olarak denenecek ve = operatörü kullandığımız için doğru karakterde HTTP responsu 500 dönecek.

Sonuç: Administrator Olarak Giriş

Şifredeki tüm karakterleri belirledikten sonra artık administrator hesabı ile giriş yapıp lab'ı tamamlayabiliriz.

Yaşadığım Hatalar

Bu sorguyu yazarken birkaç şeyi gözden kaçırdım:

  • Parantezlerin eşleşip eşleşmediğini
  • Oracle'a özgü doğru fonksiyon adını (SUBSTRING yerine SUBSTR)
  • Intruder sonuç tablosunda, karakter x olduğunda Request 0'ın da 500 dönmesi beni bir an için şaşırttı, ama Payload sütununa bakınca bunun normal bir durum olduğunu (Request 0'ın da benim payload'da yazdığım karakterle baseline denemesi yaptığını) hızlıca anladım

Asıl zaman kaybettiren kısım ise farklıydı: tüm karakterleri tek tek topladıktan sonra girişte şifre çalışmadı. Meğer bir pozisyonda küçük bir hata yapmışım (muhtemelen bir karakteri atlamış ya da yanlış pozisyon numarasıyla test etmişim). Şifreyi elle, karakter karakter tekrar kontrol edip eksik/yanlış olan yeri düzelttikten sonra giriş başarılı oldu. Bu da elle takip etmenin ne kadar hataya açık olduğunu bir kez daha gösterdi.

Öğrendiklerim

Bu lab uygulamasında SQLI denerken hep görünebilir cevap vermeyeceğini öğrendim. Ayrıca Intruder ile çalışırken bile bu işlemin çok uzun sürdüğünü bu yüzden ileride her indeksi otomatik artıran, payload'daki karakterleri otomatik deneyen ve bütün şifrenin çıktısını elle müdahele etmeden bulan bir script yazmanın ne kadar gerekli olduğunu düşündüm. Bunu önümüzdeki dönemde kesinlikle yapmayı planlıyorum.

📰 Read the original article on Dev.to Security

Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.