Post on 22-Apr-2015
description
transcript
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 OWASPItalyhttp://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 “Datamining 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.