Infosecurity 2007

Preview:

DESCRIPTION

 

Citation preview

Copyright © The OWASP FoundationPermission is granted to copy, distribute and/or modify this document under the terms of the OWASP License.

The OWASP Foundation

OWASP

http://www.owasp.org 

Tematiche avanzate di SQL Injection: tool di testing e metodi 

di difesa

Antonio Paratacollaboratore OWASP­Italyhttp://www.ictsc.itantonio.parata@ictsc.it

        http://www.owasp.org/index.php/ItalyInfosecurity 2007

2OWASP

Introduzione SQL Injection e metodi di inferenza Il tool: Sqldumper Rendersi immuni all'SQL Injection Conclusioni

  Tematiche avanzate di SQL Injection: tool di testing e Tematiche avanzate di SQL Injection: tool di testing e metodi di difesametodi di difesa

3OWASP

Introduzione SQL Injection e metodi di inferenza Il tool: Sqldumper Rendersi immuni all'SQL Injection Conclusioni

  Tematiche avanzate di SQL Injection: tool di testing e Tematiche avanzate di SQL Injection: tool di testing e metodi di difesametodi di difesa

4OWASP

Introduzione – perché parlare di sql injection?

5OWASP

Introduzione – un pò di storia

Nel 1998 Rain Forest Puppy pubblica su Phrack 54 un articolo dal titolo “NT Web Technology Vulnerabilities”.Anche se il termine SQL Injection non viene menzionatoviene presentato alla comunità uno degli attacchi piùinsidiosi che le applicazioni web abbiano mai incontrato.

Nel settembre del 2005 David Litchfield publica un paperdal titolo “Data­mining with SQL Injection and Inference” basato sulla presentazione fatta al Blackhat europe.É la nascita di una nuova metodologia di SQL Injection basata su tecniche di inferenza. Altro duro colpo per la sicurezza delle applicazioni web.

6OWASP

Introduzione – parliamo di SQL InjectionL'SQL Injection è un particolare tipo di attacco il cui scopo è quello di indurre il database ad eseguire query SQL non lecite.

Consideriamo la seguente query:

SELECT * FROM Tabella WHERE username='$user' AND password='$pass'

$user e $pass sono impostate dall'utente e supponiamo che nessun controllo su di esse venga fatto.Vediamo cosa succede inserendo i seguenti valori:

$user  = ' or '1' = '1$pass = ' or '1' = '1

La query risultante sarà:

SELECT * FROM Tabella WHERE username='' or '1' = '1' AND password='' or '1' = '1'

7OWASP

Introduzione SQL Injection e metodi di inferenza Il tool: Sqldumper Rendersi immuni all'SQL Injection Conclusioni

  Tematiche avanzate di SQL Injection: tool di testing e Tematiche avanzate di SQL Injection: tool di testing e metodi di difesametodi di difesa

8OWASP

SQL Injection e metodi di Inferenza

Con il termine Inferenza si intende una conclusione tratta da un insieme di fatti o circostanze.

In pratica ciò che viene fatto è eseguire alcuni test di verità sui parametri vulnerabilie in base al risultato dedurre il valore del parametro. 

I test effettuati sono di tipo binario (vero/falso).

Per poter eseguire con successo l'attacco è dunque necessario saper distinguere il concetto di vero da quello di falso.

Utile in quei casi in cui non possiamo visualizzare direttamente il risultato della query oppure quando gli errori riportati dal DB server vengono mascherati (Blind Sql Injection).

9OWASP

SQL Injection e metodi di Inferenza

Supponiamo che nell'applicazione che stiamo testando, vi sia un parametro vulnerabile, ad esempio id.

Per prima cosa creiamo una query sintatticamente corretta che restituisca un valore falso, ad esempio:

id = aaa'  and '1' = '2

Con questa query otteremo sicuramente un valore falso. In particolare il “valorefalso” è rappresentato dal contenuto della pagina web ritornata.

10OWASP

SQL Injection e metodi di InferenzaDiamo inizio alle danze...

Ciò che andremo a fare è cercare di determinare il valore di ogni singolo carattere del parametro di cui vogliamo scoprire il valore.

In pratica, ci chiederemo:

“Il carattere 1 del parametro è uguale ad a?” => NO“Il carattere 1 del parametro è uguale a b?” => NO“Il carattere 1 del parametro è uguale a c?” => NO“Il carattere 1 del parametro è uguale a d?” => SI

Conosciamo il valore del primo carattere, procediamo con il secondo

“Il carattere 2 del parametro è uguale ad a?” => NO“Il carattere 2 del parametro è uguale a b?” => SI

Conosciamo il valore del secondo carattere, procediamo in questo modo fino ascoprire i valori di tutti i caratteri che compongono il valore del parametro.

11OWASP

SQL Injection e metodi di InferenzaCome facciamo a capire quando abbiamo esaminato tutta la stringa?

Abbiamo accennato al fatto che la funzione substring ritorna un valore null (pari al valore ASCII 0) quando l'indice da cui cominciare a considerare la sottostringa è maggiore della lunghezza della stringa stessa.

A questo punto basta verificare che il valore del carattere su cui stiamo facendo inferenza sia uguale a 0 per dedurre che abbiamo esaminato tutta la stringa.

Ma...e se il valore della variabile su cui stiamo facendo inferenza contenesse il carattere ASCII 0?

Generalmente ciò non accade con gli input inseriti dall'utente, ma invece può accadere nel caso volessimo ricavare il valore di un file (binario).

12OWASP

SQL Injection e metodi di InferenzaSoluzione: fare inferenza sulla lunghezza.

È inoltre necessario tenere memoria di quanti caratteri ho fino ad ora scoperto.

Detto n il numero di caratteri fino ad ora ricavati, mi chiedo:

La lunghezza della stringa rappresentante il valore è uguale a n?

SI   => ho finito di fare inferenza

NO => il valore contiene il carattere ASCII 0, continuo a fare inferenza sulprossimo carattere. 

13OWASP

SQL Injection e metodi di InferenzaUn breve esempio.

• Goal:  Vogliamo ricavare il contenuto del file /etc/shadow• Il DB server è eseguito con i privilegi di amministratore (root)• Il prametro id è vulnerabile all'SQL Injection • Supponiamo che il DBMS sia MySql.

Le richieste che andremo ad eseguire sono della seguente forma:

http://www.mysite.com/index.php?id=20'%20and%20ASCII(SUBSTRING(LOAD_FILE("/etc/shadow"),1,1))=97/*

Supponendo di aver ricavato 8 caratteri, e di aver incontrato il valore null, la queryda eseguire per fare inferenza sul valore della lunghezza è:

http://www.mysite.com/index.php?id=20'%20and%20CHAR_LENGTH(LOAD_FILE("/etc/shadow"))=8/*

14OWASP

Introduzione SQL Injection e metodi di inferenza Il tool: Sqldumper Rendersi immuni all'SQL Injection Conclusioni

  Tematiche avanzate di SQL Injection: tool di testing e Tematiche avanzate di SQL Injection: tool di testing e metodi di difesametodi di difesa

15OWASP

Il tool: Sqldumper

 Purtroppo necessito di un numero di query molto alto, per portare a termine 

l'attacco.

 Posso automatizzare “facilmente” la fase di testing tramite tool. Noi 

vedremo SqlDumper.

 

 SqlDumper permette di effettuare il dump di un file presente sul filesystem 

(diritti di accesso permettendo), sfruttando una vulnerabilità da Sql Injection, 

basandosi sui metodi di inferenza.

16OWASP

Il tool: Sqldumper

Utilizzo:

 Verificare che la vulnerabilità sia 

“exploitabile” (ad esempio 

aggiungendo il classico ' and '1' = '1 e 

verificando che il contenuto non cambi)

 Inserire i parametri richiesti

 Premere start :)

17OWASP

Introduzione SQL Injection e metodi di inferenza Il tool: Sqldumper Rendersi immuni all'SQL Injection Conclusioni

  Tematiche avanzate di SQL Injection: tool di testing e Tematiche avanzate di SQL Injection: tool di testing e metodi di difesametodi di difesa

18OWASP

Rendersi immuni all'SQL Injection

prepared statements

• Permettono di realizzare query più sicure (separazione tra logica e dati)

• Dotate di prestazioni migliori

• Presenti in PHP 5 (e nella maggior parte dei linguaggi di sviluppo web)Funzionamento

• Si crea un modello di query e lo si invia al DB server (ad esempio MySql)

• Il server ne controlla la validità, se la query è ben formata la memorizza in 

un buffer e ritorna un handle che verrà utilizzato per riferirsi alla query.

• Si effettua il collegamento delle variabili di input

• Recupero dei dati 

19OWASP

Funziona veramente?mysql> PREPARE st FROM "SELECT * FROM test WHERE username = ?";Query OK, 0 rows affected (0.09 sec)Statement preparedmysql> SET @username = "root or 1 = 1";Query OK, 0 rows affected (0.04 sec)mysql> EXECUTE st USING @username;Empty set (0.02 sec)mysql> SET @username = "root";Query OK, 0 rows affected (0.01 sec)mysql> EXECUTE st USING @username;+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­+| username | password | email                   |+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­+| root           | adm1n     | root@localhost.it |+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­+

Rendersi immuni all'SQL Injection

20OWASP

Rendersi immuni all'SQL Injection

Esempio di codice PHP

$db_connection = new mysqli("localhost", "user", "pass", "db");

$st = $db_connection­>prepare("SELECT * FROM users WHERE id = ?");

$st­>bind_param("i", $_GET['id']);

$st­>execute();

var_dump($st);

21OWASP

Introduzione SQL Injection e metodi di inferenza Il tool: Sqldumper Valutare il rischio associato alla minaccia Conclusioni

  Tematiche avanzate di SQL Injection: tool di testing e Tematiche avanzate di SQL Injection: tool di testing e metodi di difesametodi di difesa

22OWASP

Conclusioni

L'Sql Injection è un attacco molto potente e soprattutto facile da mettere in atto.

Le tecniche di inferenza permettono di ricavare non solo il valore dei campi, ma di effettuare anche il dump di file presenti sul filesystem.

É un attacco che può essere facilmente automatizzato. Spesso si ricorre ad una validazione dell'input di tipo 

“aperto” (ovvero se non specificatamente negato lo permetto). Esistono comunque metodi di protezione più semplici e più performati come i prepared statement.

23OWASP

Grazie per l'attenzione.