23
Copyright © The OWASP Foundation Permission 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 Parata collaboratore OWASP-Italy http://www.ictsc.it [email protected]    http://www.owasp.org/index.php/Italy Infosecurity 2007

Infosecurity 2007

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Infosecurity 2007

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://[email protected]

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

Page 2: Infosecurity 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

Page 3: Infosecurity 2007

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

Page 4: Infosecurity 2007

4OWASP

Introduzione – perché parlare di sql injection?

Page 5: Infosecurity 2007

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.

Page 6: Infosecurity 2007

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'

Page 7: Infosecurity 2007

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

Page 8: Infosecurity 2007

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).

Page 9: Infosecurity 2007

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.

Page 10: Infosecurity 2007

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.

Page 11: Infosecurity 2007

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).

Page 12: Infosecurity 2007

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. 

Page 13: Infosecurity 2007

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/*

Page 14: Infosecurity 2007

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

Page 15: Infosecurity 2007

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.

Page 16: Infosecurity 2007

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 :)

Page 17: Infosecurity 2007

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

Page 18: Infosecurity 2007

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 

Page 19: Infosecurity 2007

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     | [email protected] |+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­+

Rendersi immuni all'SQL Injection

Page 20: Infosecurity 2007

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);

Page 21: Infosecurity 2007

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

Page 22: Infosecurity 2007

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.

Page 23: Infosecurity 2007

23OWASP

Grazie per l'attenzione.