• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida [PAPER]Cross Site Request Forgery

_KING-V_

Nuovo utente
Autore del topic
9 Gennaio 2010
3
0
Miglior risposta
0
#AUTHOR: _KING-V_
#DATE: sabato 9 gennaio 2010 21:41
minibannerhs.png

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

Perfavore, Entra oppure Registrati per vedere i Link!
la pagina setuser.php

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 :emoji_slight_smile: )
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:

Perfavore, Entra oppure Registrati per vedere i Link!
la pagina sarà strutturata nel seguente modo:
<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:

<html>
<head>
<body>
<a href="http://www.sitoacquisto.com/index.php?main_page=checkout_shipping">Spedisci</a>
</head>
</body>
</html>
Ci troveremo davanti un bottone con su scritto "Spedisci", non appena cliccheremo l'azione che avverrà sarà: main_page=checkout_shipping.
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. :emoji_slight_smile:
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. :emoji_slight_smile:
Ricordiamoci che per ogni immagine c'è un codice iniziale diverso, ecco un esempio:

-PNG = ‰PNG

-GIF = GIF89a

-JPG = ÿØÿà JFIF

-BMP = BMFÖ
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. ;)
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:

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.
}
}
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. :emoji_slight_smile:
_KING-V_
Impossible Is Nothing,Do The Impossible!
 
Ultima modifica da un moderatore:
  • Like
Reactions: 1 person
Scusate ma uno vi fa una super guida utilissima e voi vi lamentate pure?? '
esatto, giusta osservazione, solo poche persone riescono ad apprezzare le giuste cose.
volevo postare un video tutorial , nel quale mostro come entro come admin in un server della wind , ma mi sa che non lo farò...
 
è ovvio che è spam! hai inserito sia l'immagine linkata al sito che il link!
 
King-V davvero una bella guida,non avrei saputo spiegarlo meglio,mi costringi a darti reputazione ed a metterla in rilievo xD.
Sono comunque costretto ad eliminare il tuo sito in quanto contiene un forum,mi dispiace ma è una regola ed io da mod devo farla rispettare,inoltre dato che sei nuovo non prendi avvertimenti o infrazioni.


EDIT: mi sono accorto che la sezione è errata,lo sposto.
 
Ultima modifica:
si tratta di spam anche se è una buona guida e il regolamento lo vieta, che sia utile o meno ;)
 
Riferimento: [PAPER]Cross Site Request Forgery

raga e spam o no? non rieskoa kpt XD
 
Riferimento: [PAPER]Cross Site Request Forgery

Metodo epico! :emoji_slight_smile: