#AUTHOR: _KING-V_
#DATE: sabato 9 gennaio 2010 21:41
Salve gente, sono sempre io, il vostro amichevole _KING-V_ di quartiere.
L'argomento che oggi vorrei sottoporre alla vostra attenzione è il Cross Site Request Forgery,
Una tecnica a cui sono vulnerabili diversi siti web con scarso controllo delle variabili utilizzate da pagine dinamiche (come i siti che fanno uso di tecnologie con preprocessore di ipertesto, tipo PHP).
Vediamo le possibilità che una tale situazione ci mette di fronte.
La CSRF è come un xss, nel senso che consiste nel far visitare un link alla persona interessata.
La differenza tra le 2 tecniche consiste nel fatto che, mentre nell'xss usavamo inserire in una variabile vulnerabile di un sito, un codice cattivo(<script>alert....), al fine di modificare il codice sorgente della pagina per rubare i dati sensibili ad una vittima; nella cross site request forgery prenderemo "ALCUNI CODICI" O LINK PARTICOLARI, CHE RISIEDONO NEL SORGENTE DEL SITO STESSO che dovremo attaccare.
Faremo visitare tali link, ad una vittima con dei particolari privilegi (admin), al fine di raggiungere il nostro scopo.
Ora passiamo alla parte pratica facendo qualche esempio.
Poniamo il caso di essere su:
Il sito in questione è un forum, quindi gli utenti possono loggarsi e sloggarsi.
Quando un utente esegue il log out, non fa altro che cliccare sul bottone "logout"
Questo bottone, contiene un codice, precisamente questo:
quando l'utente clicca sul bottone in questione non fa altro che visitare la pagina
non fa altro che eliminare i cookie dell'utente al fine di sloggarlo.
Come possiamo notare, non c'è nessun controllo su quel link, quindi se un attacker, facesse visitare quel link ad una vittima, essa verrebbe sloggata. In sostanza è come se la vittima avesse cliccato volontariamente il bottone "log out" sul sito, soltanto che lo ha fatto INVOLONTARIAMENTE :P.
Questo è soltanto un piccolo esempio di quello che si potrebbe fare, anzi è una cosa innocua, ma potrebbe trasformarsi in una cosa pericolosa, molto pericolosa.
Vediamo alcuni esempi:
1) supponiamo che su www.sitovittima.com l'admin abbia a disposizione l'opzione per eliminare il proprio forum attraverso una determinata pagina.
La pagina in questione sarà:
Questa pagina carà strutturata in questo modo:
quando l'admin visiterà questa pagina, cliccherà sul bottone "ELIMINA FORUM", cliccando su esso,
l'azione successiva sarà:
ed il forum verrebbe eliminato. Questa situazione, ovvero l'eliminazione del forum, potrà farla solo l'admin, in quanto possiede i privileggi necessare per compiere tale operazione.
Ma se tale situazione volesse sfruttarla un malintenzionato?!
2)poichè il sito non possiede nessuna protezione al riguardo, se un malintenzionato
trovasse la pagina www.sitovittima.com/deleteforum.php?deleteforum=yes
esso non potrebbe fare niente, non potrebbe cancellarlo, ma se la facesse visitare all'admin, il risultato sarebbe positivo (per il malintenzionate è ovvio )
In sostanza, nel 1 caso, l'admin ha eliminato il forum volutamente, in quanto lo ha fatto cliccando un bottone contenente il link www.sitovittima.com/deleteforum.php?deleteforum=yes
Nel secondo caso, l'admin lo ha eliminato ugualmente in quanto ha visitato la stessa pagina (
Non è finita qui! Possiamo persino diventare admin nel forum!
Come!? Adesso adremo a vedere, ma dobbiamo prima capire un concetto basilare.
Quando ci si registra su un forum con il proprio nickname per esempio "haxor"
sul quel forum l'utente sarà identificato con un numero,esempio "255"
se l'utente provasse a visitare il proprio profilo, l'url sarà:
www.sitovittma.com/profile-id=255
quel 255, significa che l'utente "haxor" è stato il 255esimo utente a registrarsi.
Questo è molto importante per capire una cosa che ora andremo a vedere.
Supponiamo che l'adimin del sito in questione si trovi nella pagina per aggiungere altri admin:
L'admin non farà altro che inserire il nickname dell'admin in un campo input, il nickname verrà convertito nel numero corrispondente all'utente scelto per esempio "12" e cliccare su "aggiungi admin".
L'azione che avverrà quando l'admin aggiungerà un altro admin sarà:
Avete notato il numero dodici? Indica che è stato inserito l'utente che ha come numero,anzi,come id 12. Ovvero è stato il 12esimo utente a registrarsi.
Come al solito non c'è nessun controllo sulla pagina, di conseguenza, il nostro amico haxor, potrebbe naturalmente sfruttare tale bug per diventare admin, semplicemente sfruttanto il proprio id (255) facendo vistitare all'admin il link:
Facciamo ancora un altro esempio, dopodichè passeremo alla parte pratica, ossia i metodi e le tecniche per attaccare.
Poniamo il caso di essere su un sito in cui è possibile fare delle compere, ci troviamo su:
abbiamo selezionato il prodotto da acquistare,quindi ci troveremo qui:
Come potrete notare, il numero 3209 è il prodotto che stiamo visualizzando, la pagina in questione conterrà il seguente codice, esaminiamolo:
Cosa fa questa pagina? Ci chiederà di aggiungere nel carrello in prodotto scelto tramite la funzione:
non appena avremo cliccato, il link che si genererà sarà:
ovvero il prodotto verrà aggiunto al carello.
Di conseguenza ci ritroveremo nella pagina successiva
strutturata in questo modo:
Ora noi abbiamo comprato il prodotto 3209, ma possiamo fare eseguire la stessa azione alla vittima semplicemente facendole visitare il seguente link:
A questo punto basta con gli esempi passiamo alla parte pratica, ovvero come procedere per eseguire con l'attacco Cross site Request Forgery!
Bene, per fare cio sull'ipotetico sito citato prima, ci basterà prendere il codice sorgente della pagina
1)apportare una piccola modifica sulla voce"SPEDISCI", trasormandola in "CLICCA"
2)salvarla in "pagina.html"
3)far visitare all'admin la pagina
4) convincerlo a cliccare.
La cosa potrebbe essere resa più semplice:
1)prendendo direttamente il link dell'accquisto:
2) creare sempre una pagina html ma contenente:
In questo modo, non appena la vittima visiterà la nostra pagina verra immediatamente redirectata sulla pagina interessata, essa svolgerà il dovuto compito.
Un altro metodo è quello di inserire il codice in un immagine,Prima di tutto dobbiamo identificare l'estensione dell'immagine(jpg,bmp,gif..), una volta trovata apriamo l'immagine con un editor di testo qualunque (blocco Note per windows e kwrite per linux)
Ci troveremo davanti ad codice molto lungo del genere:
L'importante è guardare i primi caratteri, poichè ci fanno capire di ceh immagine si tratta,
nel nostro caso si tratta di un jpg:
Ora cancelliamo tutto tranne questi pochi caratteri iniziali(che servono per riconoscere ed accettare questo file come .jpg)
Ed inseriamo l'ormai famoso codice Javascript che abbiamo visto nel paper sulle xss:
ora salviamo tutto in jpg (poichè l'estensione trattata è quella), uplodiamo l'immagine
sul sito interessato (se è possibile) e facciamola visitare alla vittima.
Ricordiamoci che per ogni immagine c'è un codice iniziale diverso, ecco un esempio:
Il paper sta per concludersi, e come concluderlo se non parlando di come fixare un sito affetto da tale bug!? Il metodo per evitare è quello usare la session ID (SID).
Il sid, è come un cookie, un codice DINAMICO che contiene delle informazioni di autentificazione, diverso per ogni utente e che SI INSERISCE IN OGNI LINK DELLA PAGINA.
Il sid è visualizzabile sull'url, potete notarlo non appena accedete su un forum ben costruito:
Questo controllo impedisce che un utente malintenzionato compia delle determinate azioni.
Per esempio ritornando al caso dell'"eliminazione del forum", se l'attacker esegue una CSRF sull'adimin del sito, facendogli visitare www.sitovittima.com/deleteforum.php?delete=yes
l'azione non verrebbe eseguita poichè il link non contiene il sid dell'adimin.
L'attacker dovrebbe conoscere il sid dell'admin per bypassare la protezione, quindi dovrebbe far visitare all'admin il link precedente, con l'aggiunta del proprio sid
Come al solito un haxor non ha limiti, infatti potrebbe rubare il sid dell'admin, con un metodo che vedremo in una guida successiva e effettuare l'attacco. Quindi il metodo migliore per fixare è usare il Controllo del referer.
Il referer è uno header HTTP, impostato dallo stesso browser, che indica l'indirizzo della pagina Web da cui proviene il visitatore. Se questo coincide con una pagina interna al Sito_A, la fonte del link può esser considerata sufficientemente sicura, poiché a tutt'oggi non esiste modo(o meglio io non lo conosco)
per indurre un browser standard non sotto il proprio controllo diretto a modificare il referer. Un controllo possibile è il seguente:
_KING-V_
Impossible Is Nothing,Do The Impossible!
#DATE: sabato 9 gennaio 2010 21:41
Salve gente, sono sempre io, il vostro amichevole _KING-V_ di quartiere.
L'argomento che oggi vorrei sottoporre alla vostra attenzione è il Cross Site Request Forgery,
Una tecnica a cui sono vulnerabili diversi siti web con scarso controllo delle variabili utilizzate da pagine dinamiche (come i siti che fanno uso di tecnologie con preprocessore di ipertesto, tipo PHP).
Vediamo le possibilità che una tale situazione ci mette di fronte.
La CSRF è come un xss, nel senso che consiste nel far visitare un link alla persona interessata.
La differenza tra le 2 tecniche consiste nel fatto che, mentre nell'xss usavamo inserire in una variabile vulnerabile di un sito, un codice cattivo(<script>alert....), al fine di modificare il codice sorgente della pagina per rubare i dati sensibili ad una vittima; nella cross site request forgery prenderemo "ALCUNI CODICI" O LINK PARTICOLARI, CHE RISIEDONO NEL SORGENTE DEL SITO STESSO che dovremo attaccare.
Faremo visitare tali link, ad una vittima con dei particolari privilegi (admin), al fine di raggiungere il nostro scopo.
Ora passiamo alla parte pratica facendo qualche esempio.
Poniamo il caso di essere su:
Perfavore, Entra oppure Registrati per vedere i Link!
Il sito in questione è un forum, quindi gli utenti possono loggarsi e sloggarsi.
Quando un utente esegue il log out, non fa altro che cliccare sul bottone "logout"
Questo bottone, contiene un codice, precisamente questo:
<a href="http://www.sito.com/setuser.php?logout=yes">
quando l'utente clicca sul bottone in questione non fa altro che visitare la pagina
la pagina setuser.phpPerfavore, Entra oppure Registrati per vedere i Link!
if (iMEMBER && (isset($_REQUEST['logout']) && $_REQUEST['logout'] == "yes")) {
header("P3P: CP='NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM'");
setcookie(COOKIE_PREFIX."user", "", time() - 7200, "/", "", "0");
setcookie(COOKIE_PREFIX."lastvisit", "", time() - 7200, "/", "", "0");
$result = dbquery("DELETE FROM ".DB_ONLINE." WHERE online_ip='".USER_IP."'");
echo "<strong>".$locale['global_192'].$userdata['user_name']."</strong><br /><br />\n";
} else {
if (isset($_GET['error']) && $_GET['error'] == 1) {
echo "<strong>".$locale['global_194']."</strong><br /><br />\n";
} elseif (isset($_GET['error']) && $_GET['error'] == 2) {
echo "<strong>".$locale['global_195']."</strong><br /><br />\n";
} elseif (isset($_GET['error']) && $_GET['error'] == 3) {
echo "<strong>".$locale['global_196']."</strong><br /><br />\n";
} else {
if (isset($_COOKIE[COOKIE_PREFIX.'user'])) {
$cookie_vars = explode(".", $_COOKIE[COOKIE_PREFIX.'user']);
$user_pass = preg_check("/^[0-9a-z]{32}$/", $cookie_vars['1']) ? $cookie_vars['1'] : "";
$user_name = preg_replace(array("/\=/","/\#/","/\sOR\s/"), "", stripinput($_GET['user']));
if (!dbcount("(user_id)", DB_USERS, "user_name='".$user_name."' AND user_password='".md5($user_pass)."'")) {
echo "<strong>".$locale['global_196']."</strong><br /><br />\n";
} else {
$result = dbquery("DELETE FROM ".DB_ONLINE." WHERE online_user='0' AND online_ip='".USER_IP."'");
echo "<strong>".$locale['global_193'].$_GET['user']."</strong><br /><br />\n";
}
}
}
}
echo $locale['global_197']."<br /><br />\n";
echo "</div>\n</td>\n</tr>\n</table>\n";
echo "</td>\n</tr>\n</table>\n";
echo "</body>\n</html>\n";
mysql_close();
ob_end_flush();
non fa altro che eliminare i cookie dell'utente al fine di sloggarlo.
Come possiamo notare, non c'è nessun controllo su quel link, quindi se un attacker, facesse visitare quel link ad una vittima, essa verrebbe sloggata. In sostanza è come se la vittima avesse cliccato volontariamente il bottone "log out" sul sito, soltanto che lo ha fatto INVOLONTARIAMENTE :P.
Questo è soltanto un piccolo esempio di quello che si potrebbe fare, anzi è una cosa innocua, ma potrebbe trasformarsi in una cosa pericolosa, molto pericolosa.
Vediamo alcuni esempi:
1) supponiamo che su www.sitovittima.com l'admin abbia a disposizione l'opzione per eliminare il proprio forum attraverso una determinata pagina.
La pagina in questione sarà:
Perfavore, Entra oppure Registrati per vedere i Link!
Questa pagina carà strutturata in questo modo:
<html>
<head>
<title></title>
</head>
<body>
<form method="POST" action="http://www.sitovittima.com/deleteforum.php">
<form method="post" action="delete=yes" name="act">
<input class="button" type="submit" value="ELIMINA FORUM"/>
<input type="hidden" value="delete" name="act"/>
</form>
</body>
</html>
quando l'admin visiterà questa pagina, cliccherà sul bottone "ELIMINA FORUM", cliccando su esso,
l'azione successiva sarà:
Perfavore, Entra oppure Registrati per vedere i Link!
ed il forum verrebbe eliminato. Questa situazione, ovvero l'eliminazione del forum, potrà farla solo l'admin, in quanto possiede i privileggi necessare per compiere tale operazione.
Ma se tale situazione volesse sfruttarla un malintenzionato?!
2)poichè il sito non possiede nessuna protezione al riguardo, se un malintenzionato
trovasse la pagina www.sitovittima.com/deleteforum.php?deleteforum=yes
esso non potrebbe fare niente, non potrebbe cancellarlo, ma se la facesse visitare all'admin, il risultato sarebbe positivo (per il malintenzionate è ovvio )
In sostanza, nel 1 caso, l'admin ha eliminato il forum volutamente, in quanto lo ha fatto cliccando un bottone contenente il link www.sitovittima.com/deleteforum.php?deleteforum=yes
Nel secondo caso, l'admin lo ha eliminato ugualmente in quanto ha visitato la stessa pagina (
Perfavore,
Entra
oppure
Registrati
per vedere i Link!
) con la differenza che gli è stata fornita dall'attacker.Non è finita qui! Possiamo persino diventare admin nel forum!
Come!? Adesso adremo a vedere, ma dobbiamo prima capire un concetto basilare.
Quando ci si registra su un forum con il proprio nickname per esempio "haxor"
sul quel forum l'utente sarà identificato con un numero,esempio "255"
se l'utente provasse a visitare il proprio profilo, l'url sarà:
www.sitovittma.com/profile-id=255
quel 255, significa che l'utente "haxor" è stato il 255esimo utente a registrarsi.
Questo è molto importante per capire una cosa che ora andremo a vedere.
Supponiamo che l'adimin del sito in questione si trovi nella pagina per aggiungere altri admin:
la pagina sarà strutturata nel seguente modo:Perfavore, Entra oppure Registrati per vedere i Link!
<html>
<head>
<title></title>
</head>
<body>
<form method="POST" action="http://www.sitovittima.com">
<form method="post" action="/insertadmin.php?insert&id=" name="id">
<input class="button" type="submit" value="aggiungi admin"/>
<input type="hidden" value="" name="id"/>
</form>
</body>
</html>
L'admin non farà altro che inserire il nickname dell'admin in un campo input, il nickname verrà convertito nel numero corrispondente all'utente scelto per esempio "12" e cliccare su "aggiungi admin".
L'azione che avverrà quando l'admin aggiungerà un altro admin sarà:
/?insertadmin.php?insert&id=12
Avete notato il numero dodici? Indica che è stato inserito l'utente che ha come numero,anzi,come id 12. Ovvero è stato il 12esimo utente a registrarsi.
Come al solito non c'è nessun controllo sulla pagina, di conseguenza, il nostro amico haxor, potrebbe naturalmente sfruttare tale bug per diventare admin, semplicemente sfruttanto il proprio id (255) facendo vistitare all'admin il link:
Perfavore, Entra oppure Registrati per vedere i Link!
Facciamo ancora un altro esempio, dopodichè passeremo alla parte pratica, ossia i metodi e le tecniche per attaccare.
Poniamo il caso di essere su un sito in cui è possibile fare delle compere, ci troviamo su:
Perfavore, Entra oppure Registrati per vedere i Link!
abbiamo selezionato il prodotto da acquistare,quindi ci troveremo qui:
Perfavore, Entra oppure Registrati per vedere i Link!
Come potrete notare, il numero 3209 è il prodotto che stiamo visualizzando, la pagina in questione conterrà il seguente codice, esaminiamolo:
<html>
<head>
<body>
<form method="POST" action="http://www.sitoacquisto.com/index.php?page=prodotti&products_id=3209&action=add_product" name="cart_quantity">
<input class="button" type="submit" value="Aggiungi Nel carrello"/>
<input type="hidden" value="3209" name="products_id"/>
</form>
</head>
</body>
</html>
Cosa fa questa pagina? Ci chiederà di aggiungere nel carrello in prodotto scelto tramite la funzione:
<input class="button" type="submit" value="Aggiungi Nel carrello"/>
non appena avremo cliccato, il link che si genererà sarà:
&action=add_product" name="cart_quantity
ovvero il prodotto verrà aggiunto al carello.
Di conseguenza ci ritroveremo nella pagina successiva
Perfavore, Entra oppure Registrati per vedere i Link!
strutturata in questo modo:
Ci troveremo davanti un bottone con su scritto "Spedisci", non appena cliccheremo l'azione che avverrà sarà: main_page=checkout_shipping.<html>
<head>
<body>
<a href="http://www.sitoacquisto.com/index.php?main_page=checkout_shipping">Spedisci</a>
</head>
</body>
</html>
Ora noi abbiamo comprato il prodotto 3209, ma possiamo fare eseguire la stessa azione alla vittima semplicemente facendole visitare il seguente link:
Perfavore, Entra oppure Registrati per vedere i Link!
A questo punto basta con gli esempi passiamo alla parte pratica, ovvero come procedere per eseguire con l'attacco Cross site Request Forgery!
Bene, per fare cio sull'ipotetico sito citato prima, ci basterà prendere il codice sorgente della pagina
1)apportare una piccola modifica sulla voce"SPEDISCI", trasormandola in "CLICCA"
2)salvarla in "pagina.html"
3)far visitare all'admin la pagina
Perfavore,
Entra
oppure
Registrati
per vedere i Link!
4) convincerlo a cliccare.
La cosa potrebbe essere resa più semplice:
1)prendendo direttamente il link dell'accquisto:
Perfavore,
Entra
oppure
Registrati
per vedere i Link!
2) creare sempre una pagina html ma contenente:
<html>
<script>document.location.href="www.sitoacquisto.com/index.php?main_page=checkout_shipping"></script>
</html>
In questo modo, non appena la vittima visiterà la nostra pagina verra immediatamente redirectata sulla pagina interessata, essa svolgerà il dovuto compito.
Un altro metodo è quello di inserire il codice in un immagine,Prima di tutto dobbiamo identificare l'estensione dell'immagine(jpg,bmp,gif..), una volta trovata apriamo l'immagine con un editor di testo qualunque (blocco Note per windows e kwrite per linux)
Ci troveremo davanti ad codice molto lungo del genere:
ÿØÿà JFIF H H ÿá±Ex
ƒ¬Hù2Çû«%é—Ûôÿ ïÿ ïŸTÁêù
šæ™í!3·Ðæ‘:/Âê={ê
f¿ô±ì]×Eÿ }'-eïô,:[§Üking
:qËôrCæ÷ãú,Ñy*}ÐÏ{ƒ}¶v
ÉþÐúK’·ìyh/SúÑwOÏclÇ{\㨠ƒ÷
.7+²\Òä2äöcÅ*ñVHyïAÄ€}þ
L'importante è guardare i primi caratteri, poichè ci fanno capire di ceh immagine si tratta,
nel nostro caso si tratta di un jpg:
ÿØÿà JFIF
Ora cancelliamo tutto tranne questi pochi caratteri iniziali(che servono per riconoscere ed accettare questo file come .jpg)
Ed inseriamo l'ormai famoso codice Javascript che abbiamo visto nel paper sulle xss:
ÿØÿà JFIF<script>document.location.href="www.sitoacquisto.com/index.php?main_page=checkout_shipping"></script>
ora salviamo tutto in jpg (poichè l'estensione trattata è quella), uplodiamo l'immagine
sul sito interessato (se è possibile) e facciamola visitare alla vittima.
Ricordiamoci che per ogni immagine c'è un codice iniziale diverso, ecco un esempio:
Per l'occasione ho realizzato un video tutorial,in cui mostro come eseguire un CSRF su un sito in cui è possibile acquistare, il link lo trovate in fondo. ;)-PNG = ‰PNG
-GIF = GIF89a
-JPG = ÿØÿà JFIF
-BMP = BMFÖ
Il paper sta per concludersi, e come concluderlo se non parlando di come fixare un sito affetto da tale bug!? Il metodo per evitare è quello usare la session ID (SID).
Il sid, è come un cookie, un codice DINAMICO che contiene delle informazioni di autentificazione, diverso per ogni utente e che SI INSERISCE IN OGNI LINK DELLA PAGINA.
Il sid è visualizzabile sull'url, potete notarlo non appena accedete su un forum ben costruito:
Perfavore, Entra oppure Registrati per vedere i Link!
Questo controllo impedisce che un utente malintenzionato compia delle determinate azioni.
Per esempio ritornando al caso dell'"eliminazione del forum", se l'attacker esegue una CSRF sull'adimin del sito, facendogli visitare www.sitovittima.com/deleteforum.php?delete=yes
l'azione non verrebbe eseguita poichè il link non contiene il sid dell'adimin.
L'attacker dovrebbe conoscere il sid dell'admin per bypassare la protezione, quindi dovrebbe far visitare all'admin il link precedente, con l'aggiunta del proprio sid
Perfavore, Entra oppure Registrati per vedere i Link!
Come al solito un haxor non ha limiti, infatti potrebbe rubare il sid dell'admin, con un metodo che vedremo in una guida successiva e effettuare l'attacco. Quindi il metodo migliore per fixare è usare il Controllo del referer.
Il referer è uno header HTTP, impostato dallo stesso browser, che indica l'indirizzo della pagina Web da cui proviene il visitatore. Se questo coincide con una pagina interna al Sito_A, la fonte del link può esser considerata sufficientemente sicura, poiché a tutt'oggi non esiste modo(o meglio io non lo conosco)
per indurre un browser standard non sotto il proprio controllo diretto a modificare il referer. Un controllo possibile è il seguente:
Spero che questo paper vi sia stato d'aiuto,fatene buon uso, l'hacking è come la scienza, si scoprono sempre cose nuove, siamo noi che decidiamo se farne buon uso.if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']!="")
{
if (strpos($_SERVER['HTTP_REFERER'],$_SERVER['HTTP_HOST'])===false)
{
// Qualcosa non quadra: uscire dal programma, creare file di log, etc etc.
}
}
_KING-V_
Impossible Is Nothing,Do The Impossible!
Ultima modifica da un moderatore: