Penetration Testing Python - SQLi Web Attack

L'SQL injection è un insieme di comandi SQL che vengono inseriti in una stringa URL o in strutture dati al fine di recuperare una risposta che vogliamo dai database che sono collegati alle applicazioni web. Questo tipo di attacchi avviene generalmente su pagine web sviluppate utilizzando PHP o ASP.NET.

Un attacco SQL injection può essere eseguito con le seguenti intenzioni:

  • Per modificare il contenuto dei database

  • Per modificare il contenuto dei database

  • Per eseguire query diverse non consentite dall'applicazione

Questo tipo di attacco funziona quando le applicazioni non convalidano correttamente gli input, prima di passarli a un'istruzione SQL. Le iniezioni vengono normalmente inserite nelle barre degli indirizzi, nei campi di ricerca o nei campi dati.

Il modo più semplice per rilevare se un'applicazione web è vulnerabile a un attacco di iniezione SQL è utilizzare il carattere "'" in una stringa e vedere se viene visualizzato un errore.

Tipi di attacco SQLi

In questa sezione, impareremo a conoscere i diversi tipi di attacco SQLi. L'attacco può essere classificato nei seguenti due tipi:

  • In-band SQL injection (Simple SQLi)

  • Iniezione SQL inferenziale (Blind SQLi)

In-band SQL injection (Simple SQLi)

È l'iniezione SQL più comune. Questo tipo di SQL injection si verifica principalmente quando un utente malintenzionato è in grado di utilizzare lo stesso canale di comunicazione sia per lanciare l'attacco che per raggruppare i risultati. Le iniezioni SQL in banda sono ulteriormente suddivise in due tipi:

  • Error-based SQL injection - Una tecnica di SQL injection basata sugli errori si basa su un messaggio di errore generato dal server del database per ottenere informazioni sulla struttura del database.

  • Union-based SQL injection - È un'altra tecnica di iniezione SQL in-band che sfrutta l'operatore SQL UNION per combinare i risultati di due o più istruzioni SELECT in un unico risultato, che viene quindi restituito come parte della risposta HTTP.

Iniezione SQL inferenziale (Blind SQLi)

In questo tipo di attacco SQL injection, l'attaccante non è in grado di vedere il risultato di un attacco in banda perché nessun dato viene trasferito tramite l'applicazione web. Questo è il motivo per cui è anche chiamato Blind SQLi. Le iniezioni SQL inferenziali sono inoltre di due tipi:

  • Boolean-based blind SQLi - Questo tipo di tecnica si basa sull'invio di una query SQL al database, che forza l'applicazione a restituire un risultato diverso a seconda che la query restituisca un risultato VERO o FALSO.

  • Time-based blind SQLi- Questo tipo di tecnica si basa sull'invio di una query SQL al database, che forza il database ad attendere per un determinato periodo di tempo (in secondi) prima di rispondere. Il tempo di risposta indicherà all'autore dell'attacco se il risultato della query è VERO o FALSO.

Esempio

Tutti i tipi di SQLi possono essere implementati manipolando i dati di input nell'applicazione. Negli esempi seguenti, stiamo scrivendo uno script Python per iniettare vettori di attacco nell'applicazione e analizzare l'output per verificare la possibilità dell'attacco. Qui, useremo il modulo python denominatomechanize, che offre la possibilità di ottenere moduli Web in una pagina Web e facilita anche la presentazione dei valori di input. Abbiamo anche utilizzato questo modulo per la convalida lato client.

Il seguente script Python aiuta a inviare moduli e analizzare la risposta utilizzando mechanize -

Prima di tutto dobbiamo importare il file mechanize modulo.

import mechanize

Ora, fornisci il nome dell'URL per ottenere la risposta dopo aver inviato il modulo.

url = input("Enter the full url")

La seguente riga di codici aprirà l'URL.

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

Ora, dobbiamo selezionare il modulo.

request.select_form(nr = 0)

Qui, imposteremo il nome della colonna "id".

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

Ora dobbiamo inviare il modulo.

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

Lo script precedente stamperà la risposta per la richiesta POST. Abbiamo inviato un vettore di attacco per interrompere la query SQL e stampare tutti i dati nella tabella invece di una riga. Tutti i vettori di attacco verranno salvati in un file di testo, ad esempio vectors.txt. Ora, lo script Python fornito di seguito otterrà quei vettori di attacco dal file e li invierà al server uno per uno. Inoltre salverà l'output in un file.

Per cominciare, importiamo il modulo Mechanize.

import mechanize

Ora, fornisci il nome dell'URL per ottenere la risposta dopo aver inviato il modulo.

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

Dobbiamo leggere i vettori di attacco dal file.

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

Ora invieremo una richiesta con ogni vettore di arrack

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

Ora, la seguente riga di codice scriverà la risposta nel file di output.

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

Controllando e analizzando le risposte, possiamo identificare i possibili attacchi. Ad esempio, se fornisce la risposta che include la fraseYou have an error in your SQL syntax allora significa che il modulo potrebbe essere influenzato dall'iniezione SQL.