Infosecurity 2007

603 views
531 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
603
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Infosecurity 2007

  1. 1. Tematiche avanzate di SQL  Injection: tool di testing e metodi  di difesa Antonio Parata collaboratore OWASP­Italy http://www.ictsc.it antonio.parata@ictsc.it OWASP          Infosecurity 2007 http://www.owasp.org/index.php/Italy 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 http://www.owasp.org 
  2. 2.  Tematiche avanzate di SQL Injection: tool di testing e  metodi di difesa  Introduzione  SQL Injection e metodi di inferenza  Il tool: Sqldumper  Rendersi immuni all'SQL Injection  Conclusioni OWASP 2
  3. 3.  Tematiche avanzate di SQL Injection: tool di testing e  metodi di difesa  Introduzione  SQL Injection e metodi di inferenza  Il tool: Sqldumper  Rendersi immuni all'SQL Injection  Conclusioni OWASP 3
  4. 4. Introduzione – perché parlare di sql injection? OWASP 4
  5. 5. 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 menzionato viene presentato alla comunità uno degli attacchi più insidiosi che le applicazioni web abbiano mai incontrato. Nel settembre del 2005 David Litchfield publica un paper dal 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. OWASP 5
  6. 6. Introduzione – parliamo di SQL Injection L'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' OWASP 6
  7. 7.  Tematiche avanzate di SQL Injection: tool di testing e  metodi di difesa  Introduzione  SQL Injection e metodi di inferenza  Il tool: Sqldumper  Rendersi immuni all'SQL Injection  Conclusioni OWASP 7
  8. 8. 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 vulnerabili e 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). OWASP 8
  9. 9. 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 “valore falso” è rappresentato dal contenuto della pagina web ritornata. OWASP 9
  10. 10. SQL Injection e metodi di Inferenza Diamo 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 a scoprire i valori di tutti i caratteri che compongono il valore del parametro. OWASP 10
  11. 11. SQL Injection e metodi di Inferenza Come 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). OWASP 11
  12. 12. SQL Injection e metodi di Inferenza Soluzione: 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 sul prossimo carattere.  OWASP 12
  13. 13. SQL Injection e metodi di Inferenza Un 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'%20 and%20ASCII(SUBSTRING(LOAD_FILE(quot;/etc/shadowquot;),1,1))=97/* Supponendo di aver ricavato 8 caratteri, e di aver incontrato il valore null, la query da eseguire per fare inferenza sul valore della lunghezza è: http://www.mysite.com/index.php?id=20'%20 and%20CHAR_LENGTH(LOAD_FILE(quot;/etc/shadowquot;))=8/* OWASP 13
  14. 14.  Tematiche avanzate di SQL Injection: tool di testing e  metodi di difesa  Introduzione  SQL Injection e metodi di inferenza  Il tool: Sqldumper  Rendersi immuni all'SQL Injection  Conclusioni OWASP 14
  15. 15. 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. OWASP 15
  16. 16. 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 :) OWASP 16
  17. 17.  Tematiche avanzate di SQL Injection: tool di testing e  metodi di difesa  Introduzione  SQL Injection e metodi di inferenza  Il tool: Sqldumper  Rendersi immuni all'SQL Injection  Conclusioni OWASP 17
  18. 18. 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  OWASP 18
  19. 19. Rendersi immuni all'SQL Injection Funziona veramente? mysql> PREPARE st FROM quot;SELECT * FROM test WHERE username = ?quot;; Query OK, 0 rows affected (0.09 sec) Statement prepared mysql> SET @username = quot;root or 1 = 1quot;; Query OK, 0 rows affected (0.04 sec) mysql> EXECUTE st USING @username; Empty set (0.02 sec) mysql> SET @username = quot;rootquot;; Query OK, 0 rows affected (0.01 sec) mysql> EXECUTE st USING @username; +­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­+ | username | password | email                   | +­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­+ | root           | adm1n     | root@localhost.it | +­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­+ OWASP 19
  20. 20. Rendersi immuni all'SQL Injection Esempio di codice PHP $db_connection = new mysqli(quot;localhostquot;, quot;userquot;, quot;passquot;, quot;dbquot;); $st = $db_connection­>prepare(quot;SELECT * FROM users WHERE id = ?quot;); $st­>bind_param(quot;iquot;, $_GET['id']); $st­>execute(); var_dump($st); OWASP 20
  21. 21.  Tematiche avanzate di SQL Injection: tool di testing e  metodi di difesa  Introduzione  SQL Injection e metodi di inferenza  Il tool: Sqldumper  Valutare il rischio associato alla minaccia  Conclusioni OWASP 21
  22. 22. 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. OWASP 22
  23. 23. Grazie per l'attenzione. OWASP 23

×