Abstract
Questo articolo descrive una vulnerabilità che colpisce svariati forum web
qualora venga reso possibile includere liberamente tags html nei post.
Per la giusta comprensione sono richieste conoscenze di JavaScript, PHP, Mysql.
Data di stesura: 08/11/2003
Data di pubblicazione:
24/05/2004
Ultima modifica: 04/04/2006
Vista la natura potenzialmente pericolosa, l'autore non si assume alcuna
responsabilità nei confronti di chi utilizzasse queste informazioni per
compiere azioni illegali ne' verso chi potrebbe essere danneggiato da terzi.
La vulnerabilità
La quasi totalità dei forum presenti nel web permette l'utilizzo
da parte dell'utente di codice HTML all'interno dei post.
Solitamente la decisione di abilitare tale caratteristica viene lasciata
al gestore del forum, il che significa che il più delle volte l'HTML viene
disabilitato per motivi di sicurezza, ma ciò non è la regola.
Personalmente ho potuto verificare che in molti forum e in particolare in un
grande sevizio di forum web nazionale si fa ampio uso dell'HTML.
Il libero utilizzo dell'HTML permette a un utente malintenzionato la
possibilità di trafugare la maggior parte degli account degli utenti del forum
(amministratore compreso) andando a recuperare i valori del cookie o dei
cookie utilizzati per permettere il login automatico all'utente registrato.
Tali valori solitamente sono crittati, pertanto l'aggressore non è in grado di
ottenere informazioni in chiaro in maniera immediata, ma può impersonare
gli utenti che hanno subito la truffa e può utilizzare programmi per "crackare"
le password recuperate (in genere nei forum web si utilizza MD5) in modo da
ottenere sempre maggiori poteri e informazioni.
Vediamo ora come è possibile sfruttare questa vulnerabilità.
L'exploit
Per poter trafugare i cookie degli utenti abbiamo bisogno di realizzare due script:
il primo, deve essere un JavaScript che viene posto all'interno di una discussione del
forum e che, avviandosi al caricamento della pagina, si occupa di verificare la presenza
del cookie o dei cookie contenenti le informazioni sul login per poi recuperarle e spedirle
al secondo script, realizzato in PHP e che risiede su di un altro server, che deve
memorizzare i valori inviati e deve reindirizzare la navigazione al forum.
Per ottenere ciò il JavaScript deve inviare oltre ai valori trafugati,
anche l'url della pagina contenente la discussione, poi lo script PHP deve
utilizzare l'url ottenuto con la function header per reindirizzare la pagina
caricata al forum impostando il campo "Location:".
Poiché la function header scrive negli header http della pagina e visto che l'azione
compiuta dallo script PHP è una semplice memorizzazione in un database, il tempo di
caricamento è quasi nullo, tendente quasi alla semplice risoluzione del dominio e invio dei
dati (meno di 1 Kb.), quindi, l'utente non nota niente di sospetto se non il caricamento
di un host diverso da quello del forum da parte del browser (la scritta che solitamente
compare in basso ai browser web "connecting... host"), ma tale avvenimento è ignorato dai
più anche perché svariati forum gratuiti inseriscono pubblicità che risiedono su server
remoti, quindi caricamenti eseguiti da altri server sono frequenti.
L'ultima caratteristica da implementare è un sistema che impedisca agli script
di entrare in un loop infinito di invio/memorizzazione/redirect.
Per ovviare a questo problema si può utilizzare un cookie, che deve essere impostato dal
JavaScript per ricordare allo stesso che i dati già sono stati trafugati in modo da non
eseguire il recupero e l'invio più di una volta.
Exploit - codici
Di seguito sono riportati gli script JavaScript e PHP utilizzati per
"rubare" i dati dell'utente.
I sorgenti sono alquanto semplici, però ci sono un po' di commenti da fare su di essi:
Gli script per la creazione della tabella del database e per la sua consultazione
non sono forniti visto che non è intenzione dell'autore fornire a eventuali
malintenzionati un pacchetto completo e finito per "exploitare" il forum.
Gli script presentano un paio di banali errori introdotti per il motivo spiegato
nel punto 1.
Chiunque abbia una discreta conoscenza dei linguaggi utilizzati per realizzare gli script
potrà renderli facilmente funzionanti e completarli con gli script necessari.
Nella mia realizzazione d'esempio ho ipotizzato che i dati da trafugare
fossero contenuti in due cookie chiamati USER e PASS.
L'url della pagina dove risiede il JavaScript viene modificato andando
a sostituire le "&" con "--" onde evitare che la pagina PHP che gestisce la memorizzazione
dei dati abbia problemi con le variabili GET.
Logicamente nella pagina PHP si andranno a sostituire nuovamente per ripristinare
l'url originale.
Lo script in JavaScript deve essere inserito su di una sola riga
all'interno della discussione, questo per evitare eventuali formattazioni da
parte del forum web.
Pertanto se volete testare la cosa dovete eliminare gli a capo e sostituirli
con degli spazi.
@mysql_query("INSERT INTO account VALUES(".$_GET['usr']."','".
$_GET['psw']."','$url',NOW())");
//ciusura connessione
@mysql_close($conn);
//ritorno al forum
Header("Location: $url");
?>
Soluzioni
Sinceramente vieterei l'inserimento dell'HTML da parte dell'utente
in ogni applicazione web, nel caso non se ne possa fare proprio a meno
sarebbe consigliabile evitare almeno quelle caratteristiche che lo rendono
sfruttabile da malintenzionati, andando ad esempio a non permettere TAG
come "SCRIPT" o "A" oppure a limitare tutti i metodi dei vari script che
permettono il recupero o l'invio di informazioni dell'utente o che permettono
in qualche modo di spostarsi dalla pagina, ma sinceramente non credo valga la pena
adoperarsi tanto per certe cose, dopotutto si possono realizzare ottimi forum anche
consentendo l'utilizzo di meta-HTML come i vari codici messi a disposizione dai
forum per inserire immagini, url, ecc ...
Logicamente anche per quelli è necessaria una certa attenzione implementativa, ma
come sempre, la sicurezza è nelle mani di amministratori/creatori delle risorse.
M3xican
Informazioni sull'autore
Davide Coppola, studente di informatica alla Federico II di Napoli, appassionato di programmazione, sicurezza e linux. Fondatore e sviluppatore di dev-labs e di Mars Land of No Mercy. Per maggiori informazioni e contatti potete visitare la sua home page.