BSQL (Blind SQL) Hacker è un pentest tool realizzato dai Portcullis Labs (scaricabile liberamente qui) e finalizzato a condurre penetration test che includano la verifica di vulnerabilità di tipo SQL Injection. BSQL Hacker supporta i più diffusi DBMS ed è progettato per essere utilizzato sia da principianti che da esperti.
Il tool prevede, infatti, sia la posibilità di condurre test automatizzati, utilizzando strumenti come "Injection Wizard" o "Automated Attack", sia test personalizzati.
Attraverso l'Injection Wizard è sufficiente inserire l'URL del sito ritenuto vulnerabile, inclusa la Querystring che costituisce il vero e proprio punto di injection e lanciare l'attacco automatizzato. Nella schermata principale troviamo alcune tab, attraverso le quali è possibile configurare tutta una serie di parametri che dipendono essenzialmente dal livello di conoscenza dell'architettura software del sito da testare, come ad esempio il tipo di DBMS (Oracle, MySQL, MSSQL), selezionandolo direttamente dalla lista a discesa nella toolbar.
Accedendo, ad esempio, alla tab "Detection", è possibile decidere se utilizzare una tecnica di tipo "Error based", "Deep blind" o altro, impostando i relativi parametri. Nella tab "Settings", invece, possiamo abilitare ad esempio l'utilizzo di un proxy HTTP anonimo o definire le informazioni relative al database da ricavare tramite un attacco automatico, come il nome, la versione o il database user. Queste informazioni verranno poi mostrate cliccando sulla tab "Extracted database".
Nella schermata principale prendono posto altri oggetti come la "Dashboard", che mostra - come vedremo - i risultati del test man mano che esso procede. È possibile inoltre scegliere il numero di threads contemporanee (impostato per default a 10) per parallelizzare l'invio di richieste al web server, mentre nella parte inferiore troviamo le finestre che mostrano la successione delle richieste (Request History) e la Preview dei risultati.
Credit immagini - shutterstock
Il test
Anche se, ai fini del presente articolo è stato utilizzato un ambiente di test in locale, è importante ricordare che prima di procedere ad un qualsiasi pentest, dobbiamo sempre chiedere per iscritto il permesso (manleva) al Cliente interessato, onde evitare di incorrere nelle sanzioni previste dalla legge per il reato di "accesso abusivo ad un sistema informatico o telematico" (art. 615-ter c.p).
Per il nostro test non utilizzeremo un attacco di tipo automatico, ma personalizzato. Questo ci permetterà di sia configurare i parametri a nostro piacimento che di comprendere meglio quello che stiamo facendo. L'unico prerequisito per la buona riuscita del test è quello di aver individuato preventivamente il tipo di DBMS (MySQL, Oracle o MS SQL) che il sito utilizza, cosa che si può fare anche manualmente e su cui c'è ampia documentazione disponibile in rete. Come vedremo nel corso del test, infatti, conoscere il tipo di DBMS ci permetterà di poter selezionare il template giusto per condurre con successo l'attacco.
Come passi preliminari, andiamo ad impostare il set di caratteri più ampio possibile, cliccando sulla tab "Settings" e poi su "BSQL Character" e selezionando la voce "Custom - Enter Below". Ora invece clicchiamo sulla tab "Automated Attack" e deselezioniamo tutte le voci appartenenti al riquadro "Database Information" ("Get Database User", "Get Name" e "Get Version"), poichè sono inutili in un attacco non automatizzato. A questo punto torniamo alla Dashboard cliccando sulla relativa tab e selezioniamo il menu "Templates".
Come mostrato in fig. 2, da questo menu possiamo selezionare il template relativo al DB utilizzato dal sito, nel nostro caso selezioniamo la voce "MySQL 5.0+ - Blind SQL Injection".
Si aprirà quindi una finestra in cui andremo ad inserire l'URL del sito da testare, comprensivo di Querystring, come mostrato in fig. 3.
A questo punto, BSQL costruisce automaticamente la stringa di injection unendo l'URL con il template selezionato: bisogna però apportare un paio di modifiche a mano come mostrato in fig. 4 , in cui sono evidenziate in rosso le parti da eliminare e cioè le substring "?id=1" e "/*" alla fine della querystring.
Una volta apportate queste modifiche, possiamo passare a personalizzare il template modificando la voce "INJECTION", evidenziata in blu sempre in fig. 4, sostituendola con una subquery che ci consentirà di ottenere l'elenco di tutte le tabelle esistenti all'interno del DB. La subquery in questione è la seguente:
select group_concat(table_name) from information_schema.tables where table_schema = database()
La stringa risultante sarà quindi la seguente:
http://192.168.1.10/index.php3?cat_id=109 AND 1=(SELECT IF((IFNULL(ASCII(SUBSTRING((select group_concat(table_name) from information_schema.tables where table_schema = database()),{POSITION},1)),0){OPERATION}{CHAR}),1,2))
Nota: per motivi di brevità non ci soffermeremo sulla spiegazione delle singole query (che comunque sono abbastanza intuitive per chi conosce un pò di SQL), anche perchè c'è ampia documentazione in proposito, liberamente disponibile in rete.
A questo punto possiamo lanciare l'injection cliccando sul pulsante "Start" nella toolbar e osservare i risultati nella Dashboard. In fig. 5 è mostrato un estratto del risultato della query.
In particolare, possiamo notare la presenza di una tabella "admin", che è quella che ci interessa poichè, presumibilmente, potrebbe contenere gli account di amministrazione del sito web. Supponendo che ciò sia vero, il passo successivo è quello di andare ad enumerare le colonne della tabella "admin": per fare ciò dobbiamo intervenire nuovamente sulla stringa di injection, utilizzando stavolta la seguente subquery:
select group_concat(column_name) from information_schema.columns where table_name = 0x61646d696e
dove al posto di "admin" scritto in caratteri ASCII abbiamo utilizzato la corrispondente codifica esadecimale (0x61646d696e) per evitare eventuali problemi con l'utilizzo delle virgolette. La nostra injection string adesso assumerà la forma seguente:
http://192.168.1.10/index.php3?cat_id=109 AND 1=(SELECT IF((IFNULL(ASCII(SUBSTRING((select group_concat(column_name) from information_schema.columns where table_name = 0x61646d696e),{POSITION},1)),0){OPERATION}{CHAR}),1,2))
Dopo aver lanciato la query con il solito pulsante "Start", otterremo l'elenco delle colonne della tabella "admin", come mostrato in fig. 6.
A questo punto, l'ultimo passaggio che ci rimane è quello di estrarre i dati dalla tabella admin. A tal fine, andiamo ancora una volta a modificare l'injection string come segue:
http://192.168.1.10/index.php3?cat_id=109 AND 1=(SELECT IF((IFNULL(ASCII(SUBSTRING((select group_concat(concat(admin_id,0x0d0a,admin_firstname,0x0d0a,admin_lastname,0x0d0a,admin_email_address,0x0d0a,admin_password)) from admin),{POSITION},1)),0){OPERATION}{CHAR}),1,2))
Premiamo di nuovo "Start" e, dopo qualche minuto, otterremo l'elenco degli account appartenenti alla tabella "admin", come mostrato in fig. 7
Conclusioni
BSQL Hacker è certamente uno dei migliori tool in circolazione per compiere attacchi di tipo Blind SQL Injection, sia in modo automatico che manuale. La modalità manuale però, come abbiamo visto nel corso del test, è quella che consente un maggior controllo del processo, nonchè la possibilità di personalizzare e tarare in corso d'opera tutti i parametri della nostra injection string. Consigliato quindi sia per i beginners che per gli esperti.